Node.js में फ़ाइल/निर्देशिका मौजूद है तो समकालिक रूप से जांचें




(9)

यदि कोई फ़ाइल या निर्देशिका मौजूद है, तो मैं node.js का उपयोग करके सिंक्रनाइज़ रूप से जांच कैसे कर सकता हूं?

https://code.i-harness.com


Async वादा समाधान (bluebirdjs)

ब्लूबर्डज और नोडजेस 7 का उपयोग करने वालों के लिए। बुलियन वादा वापस करने का सबसे अच्छा तरीका:

function fileExists(path){
  return fs.accessAsync(path, fs.constants.F_OK) //F_OK checks if file is visible, is default does no need to be specified.
         .then(err => !err);
}

दस्तावेज़: fs.access


fs.exists () को बहिष्कृत नहीं किया गया है इसका उपयोग न करें https://nodejs.org/api/fs.html#fs_fs_exists_path_callback

आप इस पर प्रयुक्त कोर नोडजेस तरीके को कार्यान्वित कर सकते हैं: https://github.com/nodejs/node-v0.x-archive/blob/master/lib/module.js#L86

function statPath(path) {
  try {
    return fs.statSync(path);
  } catch (ex) {}
  return false;
}

एक बार जब आप आंकड़े ऑब्जेक्ट प्राप्त कर लेते हैं तो आप आंकड़े ऑब्जेक्ट को वापस कर देंगे

var exist = statPath('/path/to/your/file.js');
if(exist && exist.isFile()) {
  // do something
}

इसके लिए यहां एक सरल रैपर समाधान है:

var fs = require('fs')
function getFileRealPath(s){
    try {return fs.realpathSync(s);} catch(e){return false;}
}

उपयोग:

  • निर्देशिका और फ़ाइलों दोनों के लिए काम करता है
  • यदि आइटम मौजूद है, तो यह फ़ाइल या निर्देशिका का पथ देता है
  • यदि आइटम मौजूद नहीं है, तो यह झूठा लौटाता है

उदाहरण:

var realPath,pathToCheck='<your_dir_or_file>'
if( (realPath=getFileRealPath(pathToCheck)) === false){
    console.log('file/dir not found: '+pathToCheck);
} else {
    console.log('file/dir exists: '+realPath);
}

सुनिश्चित करें कि अगर आप झूठी बराबर होती हैं तो परीक्षण करने के लिए आप === ऑपरेटर का उपयोग करें। कोई तर्कसंगत कारण नहीं है कि fs.realpathSync () उचित कार्य परिस्थितियों में झूठी वापसी करेगा, इसलिए मुझे लगता है कि यह 100% काम करना चाहिए।

मैं ऐसे समाधान को देखना पसंद करूंगा जो त्रुटि उत्पन्न नहीं करता है और परिणामी प्रदर्शन हिट करता है। एक एपीआई परिप्रेक्ष्य से, fs.exists () सबसे सुरुचिपूर्ण समाधान की तरह लगता है।


उत्तरों से ऐसा लगता है कि इसके लिए कोई आधिकारिक एपीआई समर्थन नहीं है (जैसा प्रत्यक्ष और स्पष्ट जांच में है)। कई जवाब स्टेट का उपयोग करने के लिए कहते हैं, हालांकि वे सख्त नहीं हैं। हम उदाहरण के लिए नहीं मान सकते कि किसी भी त्रुटि से फेंकने का मतलब है कि कुछ मौजूद नहीं है।

आइए कहें कि हम इसे किसी ऐसे चीज़ से आजमाएं जो अस्तित्व में नहीं है:

$ node -e 'require("fs").stat("god",err=>console.log(err))'
{ Error: ENOENT: no such file or directory, stat 'god' errno: -2, code: 'ENOENT', syscall: 'stat', path: 'god' }

आइए इसे किसी ऐसे चीज़ से आज़माएं जो मौजूद है लेकिन हमारे पास इसका उपयोग नहीं है:

$ mkdir -p fsm/appendage && sudo chmod 0 fsm
$ node -e 'require("fs").stat("fsm/appendage",err=>console.log(err))'
{ Error: EACCES: permission denied, stat 'access/access' errno: -13, code: 'EACCES', syscall: 'stat', path: 'fsm/appendage' }

कम से कम आप चाहते हैं:

let dir_exists = async path => {
    let stat;
    try {
       stat = await (new Promise(
           (resolve, reject) => require('fs').stat(path,
               (err, result) => err ? reject(err) : resolve(result))
       ));
    }
    catch(e) {
        if(e.code === 'ENOENT') return false;
        throw e;
    }

    if(!stat.isDirectory())
        throw new Error('Not a directory.');

    return true;
};

सवाल प्रश्न यह स्पष्ट नहीं है कि क्या आप वास्तव में यह सिंक्रोनस होना चाहते हैं या यदि आप केवल यह लिखना चाहते हैं कि यह सिंक्रोनस है। यह उदाहरण प्रतीक्षा / async का उपयोग करता है ताकि यह केवल सिंक्रोनिक रूप से लिखा गया हो लेकिन असीम रूप से चलता है।

इसका मतलब है कि आपको इसे शीर्ष स्तर पर कॉल करना होगा:

(async () => {
    try {
        console.log(await dir_exists('god'));
        console.log(await dir_exists('fsm/appendage'));
    }
    catch(e) {
        console.log(e);
    }
})();

एक विकल्प एथिनक कॉल से लौटाए गए वादे पर .then और .catch का उपयोग कर रहा है यदि आपको इसे और नीचे की आवश्यकता है।

यदि आप यह जांचना चाहते हैं कि कुछ मौजूद है या नहीं, तो यह सुनिश्चित करना भी एक अच्छा अभ्यास है कि यह सही प्रकार की चीज़ है जैसे निर्देशिका या फ़ाइल। यह उदाहरण में शामिल है। यदि इसे सिम्लिंक होने की अनुमति नहीं है तो आपको स्टेट के बजाय lstat का उपयोग करना होगा क्योंकि स्टेट स्वचालित रूप से लिंक को पार कर लेगा।

आप यहां कोड को सिंक करने के लिए सभी async को प्रतिस्थापित कर सकते हैं और इसके बजाय statSync का उपयोग कर सकते हैं। हालांकि उम्मीद है कि एक बार एसिंक और प्रतीक्षा सार्वभौमिक रूप से समर्थित हो जाती है, सिंक कॉल अंततः अनावश्यक हो जाएंगी (अन्यथा आपको उन्हें हर जगह परिभाषित करना होगा और श्रृंखला को अपरिंक के साथ ही वास्तव में व्यर्थ बनाना होगा)।


फ़ाइल सिस्टम (एफएस) परीक्षणों का उपयोग करने से त्रुटि ऑब्जेक्ट्स ट्रिगर हो जाएंगे, जिन्हें आपको फिर कोशिश / पकड़ने के कथन में लपेटने की आवश्यकता होगी। अपने आप को कुछ प्रयास बचाएं, और 0.4.x शाखा में पेश की जाने वाली सुविधा का उपयोग करें।

var path = require('path');

var dirs = ['one', 'two', 'three'];

dirs.map(function(dir) {
  path.exists(dir, function(exists) {
    var message = (exists) ? dir + ': is a directory' : dir + ': is not a directory';
    console.log(message);
  });
});

यहां कुछ जवाब fs.exists हैं कि fs.exists और fs.existsSync दोनों बहिष्कृत हैं। दस्तावेज़ों के मुताबिक यह और सच नहीं है। केवल fs.exists अब fs.exists है:

ध्यान दें कि fs.exists () को बहिष्कृत किया गया है, लेकिन fs.existsSync () नहीं है। (Fs.exists () को कॉलबैक पैरामीटर अन्य पैरामीटर स्वीकार करता है जो अन्य Node.js कॉलबैक के साथ असंगत हैं। Fs.existsSync () कॉलबैक का उपयोग नहीं करता है।)

इसलिए आप फ़ाइल को मौजूद होने पर सिंक्रनाइज़ रूप से fs.existsSync() लिए fs.existsSync() का सुरक्षित रूप से उपयोग कर सकते हैं।


स्रोत को देखते हुए, path.exists - path.existsSync का एक तुल्यकालिक संस्करण है। ऐसा लगता है कि यह दस्तावेज़ों में चूक गया था।

अद्यतन करें:

path.exists और path.existsSync अब बहिष्कृत हैंकृपया fs.exists और fs.existsSync उपयोग करें

2016 अपडेट करें:

fs.exists और fs.existsSync को भी बहिष्कृत कर दिया गया है । इसके बजाए fs.stat() या fs.access() प्रयोग करें।


fs.stat() पर दस्तावेज़ fs.stat() का उपयोग करने के लिए कहते हैं यदि आप फ़ाइल में हेरफेर नहीं कर रहे हैं। यह औचित्य नहीं देता है, तेजी से या कम यादगार उपयोग हो सकता है?

मैं रैखिक स्वचालन के लिए नोड का उपयोग करता हूं, इसलिए मैंने सोचा कि मैं उस फ़ाइल को साझा करता हूं जिसका उपयोग मैं फ़ाइल अस्तित्व के परीक्षण के लिए करता हूं।

var fs = require("fs");

function exists(path){
    //Remember file access time will slow your program.
    try{
        fs.accessSync(path);
    } catch (err){
        return false;
    }
    return true;
}

एक और अद्यतन

इस सवाल का जवाब देने के लिए मैंने नोड दस्तावेज़ों को देखा, ऐसा लगता है कि आपको fs.exists का उपयोग नहीं करना चाहिए, इसके बजाय fs.open का उपयोग करें और यह पता लगाने के लिए आउटपुट की गई त्रुटि का उपयोग करें कि फ़ाइल मौजूद नहीं है या नहीं:

दस्तावेज़ों से:

fs.exists () एक अनाचारवाद है और केवल ऐतिहासिक कारणों के लिए मौजूद है। अपने कोड में इसका उपयोग करने का लगभग कोई कारण नहीं होना चाहिए।

विशेष रूप से, यह जांचना कि फाइल खोलने से पहले मौजूद है या नहीं, यह एक विरोधी-पैटर्न है जो आपको दौड़ की स्थिति के लिए कमजोर बनाता है: एक और प्रक्रिया fs.exists () और fs.open () पर कॉल के बीच फ़ाइल को हटा सकती है। बस फ़ाइल खोलें और जब त्रुटि न हो तो त्रुटि को संभाल लें।

fs.exists





node.js