मुझे ऐसा कोई भी खोज परिणाम नहीं मिल रहा है जो यह बताता हो कि यह कैसे करना है।
मैं केवल इतना करना चाहता हूं कि यह पता चल सके कि क्या दिया गया मार्ग एक फाइल या निर्देशिका (फ़ोल्डर) है।
मुझे ऐसा कोई भी खोज परिणाम नहीं मिल रहा है जो यह बताता हो कि यह कैसे करना है।
मैं केवल इतना करना चाहता हूं कि यह पता चल सके कि क्या दिया गया मार्ग एक फाइल या निर्देशिका (फ़ोल्डर) है।
जवाबों:
fs.lstatSync(path_string).isDirectory()
आपको बताना चाहिए। से डॉक्स :
Fststat () और fs.lstat () से लौटे ऑब्जेक्ट इस प्रकार के हैं।
stats.isFile() stats.isDirectory() stats.isBlockDevice() stats.isCharacterDevice() stats.isSymbolicLink() (only valid with fs.lstat()) stats.isFIFO() stats.isSocket()
समाधान ऊपर होगा throw
एक Error
है; पूर्व के लिए, file
या directory
मौजूद नहीं है।
यदि आप एक true
या false
दृष्टिकोण चाहते हैं , fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();
तो नीचे दिए गए टिप्पणियों में जोसेफ द्वारा बताए गए अनुसार प्रयास करें।
let isDirExists = fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();
हम नए fs.promises API का उपयोग कर सकते हैं
const fs = require('fs').promises;
(async() => {
const stat = await fs.lstat('test.txt');
console.log(stat.isFile());
})().catch(console.error)
यहाँ अगर एक रास्ता एक फ़ाइल या एक निर्देशिका है आप कैसे पता लगा होता है अतुल्यकालिक रूप से है, जो नोड में सिफारिश की दृष्टिकोण है। fs.lstat का उपयोग करना
const fs = require("fs");
let path = "/path/to/something";
fs.lstat(path, (err, stats) => {
if(err)
return console.log(err); //Handle error
console.log(`Is file: ${stats.isFile()}`);
console.log(`Is directory: ${stats.isDirectory()}`);
console.log(`Is symbolic link: ${stats.isSymbolicLink()}`);
console.log(`Is FIFO: ${stats.isFIFO()}`);
console.log(`Is socket: ${stats.isSocket()}`);
console.log(`Is character device: ${stats.isCharacterDevice()}`);
console.log(`Is block device: ${stats.isBlockDevice()}`);
});
समकालिक API का उपयोग करते समय ध्यान दें:
सिंक्रोनस फॉर्म का उपयोग करते समय किसी भी अपवाद को तुरंत फेंक दिया जाता है। आप अपवादों को संभालने के लिए कोशिश / पकड़ का उपयोग कर सकते हैं या उन्हें बुलबुले के लिए अनुमति दे सकते हैं।
try{
fs.lstatSync("/some/path").isDirectory()
}catch(e){
// Handle error
if(e.code == 'ENOENT'){
//no such file or directory
//do something
}else {
//do something else
}
}
अपनी आवश्यकताओं के आधार पर, आप शायद नोड के path
मॉड्यूल पर भरोसा कर सकते हैं ।
आप फ़ाइल सिस्टम को हिट करने में सक्षम नहीं हो सकते हैं (उदाहरण के लिए फ़ाइल अभी तक नहीं बनाई गई है) और tbh आप शायद फ़ाइल सिस्टम से टकराने से बचना चाहते हैं जब तक कि आपको वास्तव में अतिरिक्त सत्यापन की आवश्यकता न हो। यदि आप यह अनुमान लगा सकते हैं कि आप इस प्रकार के .<extname>
प्रारूप के लिए क्या जाँच रहे हैं , तो बस नाम को देखें।
जाहिर है कि अगर आप किसी extname के बिना किसी फ़ाइल की तलाश कर रहे हैं तो आपको यह सुनिश्चित करने के लिए फाइल सिस्टम को हिट करने की आवश्यकता होगी। लेकिन इसे तब तक सरल रखें जब तक आपको अधिक जटिल की आवश्यकता न हो।
const path = require('path');
function isFile(pathItem) {
return !!path.extname(pathItem);
}
ऊपर दिए गए उत्तर यह जांचते हैं कि क्या फाइलसिस्टम में एक पथ है जो एक फ़ाइल या निर्देशिका है। लेकिन यह इस बात की पहचान नहीं करता है कि एक दिया हुआ रास्ता एक फ़ाइल या निर्देशिका है।
इसका उत्तर "/" का उपयोग करके निर्देशिका-आधारित पथों की पहचान करना है। जैसे -> "/ c / dos / run /।" <- अनुगामी अवधि।
किसी निर्देशिका या फ़ाइल के पथ की तरह, जिसे अभी तक नहीं लिखा गया है। या एक अलग कंप्यूटर से एक पथ। या एक पथ जहाँ एक ही नाम की फ़ाइल और निर्देशिका दोनों मौजूद हैं।
// /tmp/
// |- dozen.path
// |- dozen.path/.
// |- eggs.txt
//
// "/tmp/dozen.path" !== "/tmp/dozen.path/"
//
// Very few fs allow this. But still. Don't trust the filesystem alone!
// Converts the non-standard "path-ends-in-slash" to the standard "path-is-identified-by current "." or previous ".." directory symbol.
function tryGetPath(pathItem) {
const isPosix = pathItem.includes("/");
if ((isPosix && pathItem.endsWith("/")) ||
(!isPosix && pathItem.endsWith("\\"))) {
pathItem = pathItem + ".";
}
return pathItem;
}
// If a path ends with a current directory identifier, it is a path! /c/dos/run/. and c:\dos\run\.
function isDirectory(pathItem) {
const isPosix = pathItem.includes("/");
if (pathItem === "." || pathItem ==- "..") {
pathItem = (isPosix ? "./" : ".\\") + pathItem;
}
return (isPosix ? pathItem.endsWith("/.") || pathItem.endsWith("/..") : pathItem.endsWith("\\.") || pathItem.endsWith("\\.."));
}
// If a path is not a directory, and it isn't empty, it must be a file
function isFile(pathItem) {
if (pathItem === "") {
return false;
}
return !isDirectory(pathItem);
}
नोड संस्करण: v11.10.0 - फरवरी 2019
अंतिम विचार: फाइलसिस्टम को भी क्यों मारा?
यहां एक फ़ंक्शन है जिसका मैं उपयोग करता हूं। कोई भी इस पोस्ट में उपयोग promisify
और await/async
सुविधा नहीं बना रहा है तो मैंने सोचा कि मैं साझा करूंगा।
const promisify = require('util').promisify;
const lstat = promisify(require('fs').lstat);
async function isDirectory (path) {
try {
return (await lstat(path)).isDirectory();
}
catch (e) {
return false;
}
}
नोट: मैं इसका उपयोग नहीं करता require('fs').promises;
क्योंकि यह एक वर्ष के लिए प्रायोगिक रहा है, बेहतर है कि इस पर भरोसा न करें।