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




(11)

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


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
}

वर्तमान में अनुशंसित (2015 तक) एपीआई (नोड डॉक्स प्रति) का उपयोग करके, यह वही है जो मैं करता हूं:

var fs = require('fs');

function fileExists(filePath)
{
    try
    {
        return fs.statSync(filePath).isFile();
    }
    catch (err)
    {
        return false;
    }
}

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

तो उपरोक्त मेरा कोड वास्तव में है FileExistAndDoIHaveAccessToIt (), लेकिन आपका प्रश्न हो सकता है FileNotExistAndCouldICreateIt (), जो पूरी तरह से अलग तर्क होगा (जिसे अन्य चीजों के साथ एक EPERM त्रुटि के लिए खाते की आवश्यकता होगी)।

जबकि fs.existsSync उत्तर सीधे यहां पूछे गए प्रश्न को संबोधित करता है, जो प्रायः आप जो चाहते हैं वह नहीं होने वाला होता है (आप सिर्फ यह जानना नहीं चाहते कि पथ में "कुछ" मौजूद है या नहीं, आप शायद इस बात की परवाह करते हैं कि "चीज़" यह मौजूद है एक फ़ाइल या एक निर्देशिका है)।

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


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


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

अद्यतन करें:

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

2016 अपडेट करें:

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


path मॉड्यूल path.exists का एक तुल्यकालिक संस्करण प्रदान नहीं करता है, इसलिए आपको fs मॉड्यूल के साथ घूमना होगा।

सबसे तेज़ चीज जो मैं कल्पना कर सकता हूं वह fs.realpathSync का उपयोग कर रहा है जो आपको पकड़ने के लिए एक त्रुटि फेंक देगा, इसलिए आपको अपना खुद का रैपर फ़ंक्शन एक कोशिश / पकड़ के साथ बनाना होगा।


इस सवाल का जवाब पिछले कुछ वर्षों में बदल गया है। वर्तमान उत्तर यहां शीर्ष पर है, इसके बाद क्रोनोलॉजिकल ऑर्डर में वर्षों के विभिन्न उत्तरों के बाद:

वर्तमान उत्तर

आप fs.existsSync() उपयोग कर सकते हैं:

var fs = require('fs');
if (fs.existsSync(path)) {
    // Do something
}

इसे कई सालों से बहिष्कृत किया गया था, लेकिन अब नहीं है। दस्तावेज़ों से:

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

आपने विशेष रूप से एक सिंक्रोनस चेक के लिए कहा है, लेकिन यदि आप इसके बजाय एसिंक्रोनस चेक का उपयोग कर सकते हैं (आमतौर पर I / O के साथ सबसे अच्छा), fs.access उपयोग fs.access (क्योंकि exists है बहिष्कृत है)।

ऐतिहासिक उत्तर

कालक्रम क्रम में ऐतिहासिक उत्तर यहां दिए गए हैं:

  • 2010 से मूल जवाब
    ( stat / statSync या lstat / lstatSync )
  • सितंबर 2012 अपडेट करें
    ( exists / exists existsSync )
  • फरवरी 2015 अपडेट करें
    ( existsSync / exists existsSync आने वाले existsSync , इसलिए हम शायद वापस stat / statSync या lstat / lstatSync )
  • दिसंबर 2015 अपडेट करें
    ( fs.access(path, fs.F_OK, function(){}) भी है fs.access(path, fs.F_OK, function(){}) / fs.accessSync(path, fs.F_OK) , लेकिन ध्यान दें कि अगर फ़ाइल / निर्देशिका मौजूद नहीं है, तो यह एक त्रुटि है; के लिए दस्तावेज़ fs.stat का उपयोग करने की सलाह देते हैं यदि आपको बिना खुलने के अस्तित्व की जांच करनी है)
  • दिसंबर 2016 अपडेट करें
    fs.exists() अभी भी बहिष्कृत है लेकिन fs.existsSync() अब बहिष्कृत नहीं है। तो आप अब सुरक्षित रूप से इसका उपयोग कर सकते हैं।

2010 से मूल उत्तर:

आप statSync या lstatSync ( दस्तावेज़ लिंक ) का उपयोग कर सकते हैं, जो आपको fs.Stats ऑब्जेक्ट देता है । आम तौर पर, यदि किसी फ़ंक्शन का एक सिंक्रोनस संस्करण उपलब्ध है, तो अंत में Sync साथ एसिंक संस्करण के समान नाम होगा। तो statSync stat का सिंक्रोनस संस्करण है; lstatSync lstat , आदि का तुल्यकालिक संस्करण है

lstatSync आपको बताता है कि कुछ मौजूद है या नहीं, और यदि ऐसा है, चाहे वह एक फ़ाइल या निर्देशिका हो (या कुछ फाइल सिस्टम में, एक प्रतीकात्मक लिंक, ब्लॉक डिवाइस, चरित्र डिवाइस इत्यादि), उदाहरण के लिए यदि आपको यह पता होना चाहिए कि यह मौजूद है या नहीं एक निर्देशिका है:

var fs = require('fs');
try {
    // Query the entry
    stats = fs.lstatSync('/the/path');

    // Is it a directory?
    if (stats.isDirectory()) {
        // Yes it is
    }
}
catch (e) {
    // ...
}

... और इसी तरह यदि यह एक फ़ाइल है, तो फ़ाइल है; यदि यह एक ब्लॉक डिवाइस है, तो isBlockDevice , आदि इत्यादि है। try/catch isBlockDevice ; यदि प्रविष्टि बिल्कुल मौजूद नहीं है तो यह एक त्रुटि फेंकता है।

यदि आपको परवाह नहीं है कि प्रविष्टि क्या है और केवल यह जानना है कि यह मौजूद है या नहीं, तो आप path.existsSync (या नवीनतम, fs.existsSync ) उपयोगकर्ता 618408 द्वारा नोट किया जा सकता है :

var path = require('path');
if (path.existsSync("/the/path")) { // or fs.existsSync
    // ...
}

इसे एक try/catch आवश्यकता नहीं है, लेकिन आपको यह जानकारी नहीं है कि चीज़ क्या है, बस यह है कि यह है। path.existsSync बहुत पहले बहिष्कृत किया गया था।

साइड नोट: आपने स्पष्ट रूप से सिंक्रनाइज़ तरीके से जांचने के लिए कहा है, इसलिए मैंने ऊपर दिए गए कार्यों के xyzSync संस्करणों का उपयोग किया है। लेकिन जहां भी संभव हो, I / O के साथ, सिंक्रोनस कॉल से बचने के लिए वास्तव में सबसे अच्छा है। I / O उपप्रणाली में कॉल CPU के दृष्टिकोण से महत्वपूर्ण समय लेते हैं। ध्यान दें lstat बजाय lstat को कॉल करना कितना आसान है:

// Is it a directory?
lstat('/the/path', function(err, stats) {
    if (!err && stats.isDirectory()) {
        // Yes it is
    }
});

लेकिन अगर आपको सिंक्रोनस संस्करण की आवश्यकता है, तो यह वहां है।

सितंबर 2012 अपडेट करें

कुछ साल पहले से नीचे का जवाब अब थोड़ा पुराना है। मौजूदा तरीका fs.existsSync() का उपयोग फ़ाइल path / निर्देशिका अस्तित्व (या निश्चित रूप से एक अतुल्यकालिक जांच के लिए fs.exists लिए एक सिंक्रोनस जांच करने के लिए करना है, बजाय path बजाय।

उदाहरण:

var fs = require('fs');

if (fs.existsSync(path)) {
    // Do something
}

// Or

fs.exists(path, function(exists) {
    if (exists) {
        // Do something
    }
});

फरवरी 2015 अपडेट करें

और यहां हम 2015 में हैं और नोड डॉक्स अब कहते हैं कि fs.existsSync (और fs.exists ) "को बहिष्कृत किया जाएगा"। (क्योंकि नोड लोगों को लगता है कि यह जांचने के लिए गूंगा है कि इसे खोलने से पहले कुछ मौजूद है या नहीं, लेकिन यह जांचने का एकमात्र कारण नहीं है कि कुछ मौजूद है या नहीं!)

तो हम शायद विभिन्न stat विधियों पर वापस आ गए हैं ... जब तक कि यह अभी तक नहीं बदलता है, बेशक।

दिसंबर 2015 अपडेट करें

यह नहीं पता कि यह कितना समय रहा है, लेकिन fs.access । और कम से कम अक्टूबर 2016 तक, fs.stat दस्तावेज अस्तित्व जांच करने के लिए fs.access का उपयोग करने की सिफारिश करता है ( "यह जांचने के लिए कि फ़ाइल बाद में इसे बिना छेड़छाड़ किए मौजूद है या नहीं, fs.access() की अनुशंसा की जाती है।" )। लेकिन ध्यान दें कि उपलब्ध नहीं पहुंच को एक त्रुटि माना जाता है , इसलिए यदि आप फ़ाइल को सुलभ होने की अपेक्षा कर रहे हैं तो शायद यह सबसे अच्छा होगा:

var fs = require('fs');

try {
    fs.accessSync(path, fs.F_OK);
    // Do something
} catch (e) {
    // It isn't accessible
}

// Or

fs.access(path, fs.F_OK, function(err) {
    if (!err) {
        // Do something
    } else {
        // It isn't accessible
    }
});

दिसंबर 2016 अपडेट करें

आप fs.existsSync() उपयोग कर सकते हैं:

if (fs.existsSync(path)) {
    // Do something
}

इसे कई सालों से बहिष्कृत किया गया था, लेकिन अब नहीं है। दस्तावेज़ों से:

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


फ़ाइल सिस्टम (एफएस) परीक्षणों का उपयोग करने से त्रुटि ऑब्जेक्ट्स ट्रिगर हो जाएंगे, जिन्हें आपको फिर कोशिश / पकड़ने के कथन में लपेटने की आवश्यकता होगी। अपने आप को कुछ प्रयास बचाएं, और 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() का सुरक्षित रूप से उपयोग कर सकते हैं।


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


फ़ाइल मौजूद होने पर परीक्षण करने के लिए मैं नीचे फ़ंक्शन का उपयोग करता हूं। यह अन्य अपवाद भी पकड़ता है। इसलिए यदि अधिकार मुद्दे हैं जैसे कि chmod ugo-rwx filename या विंडोज Right Click -> Properties -> Security -> Advanced -> Permission entries: empty list .. फ़ंक्शन रिटर्न अपवाद जैसा होना चाहिए। फ़ाइल मौजूद है लेकिन हमारे पास इसका उपयोग करने का अधिकार नहीं है। इस तरह के अपवादों को अनदेखा करना गलत होगा।

function fileExists(path) {

  try  {
    return fs.statSync(path).isFile();
  }
  catch (e) {

    if (e.code == 'ENOENT') { // no such file or directory. File really does not exist
      console.log("File does not exist.");
      return false;
    }

    console.log("Exception fs.statSync (" + path + "): " + e);
    throw e; // something else went wrong, we don't have rights, ...
  }
}

अपवाद आउटपुट, फ़ाइल में मौजूद नहीं होने पर nodejs त्रुटियों का दस्तावेज मौजूद नहीं है:

{
  [Error: ENOENT: no such file or directory, stat 'X:\\delsdfsdf.txt']
  errno: -4058,
  code: 'ENOENT',
  syscall: 'stat',
  path: 'X:\\delsdfsdf.txt'
}

अगर हमारे पास फ़ाइल के अधिकार नहीं हैं, तो अपवाद है, लेकिन मौजूद है:

{
  [Error: EPERM: operation not permitted, stat 'X:\file.txt']
  errno: -4048,
  code: 'EPERM',
  syscall: 'stat',
  path: 'X:\\file.txt'
}




node.js