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


1207

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


57
किसी मॉड्यूल को वापस करने से पहले समकालिक संचालन एक बार की फ़ाइल / निर्देशिका संचालन करने के लिए बहुत अच्छा है। उदाहरण के लिए, कॉन्फ़िगरेशन फ़ाइल को बूटस्ट्रैप करना।
१२:१६

1
एक गर्म कैश के साथ @PaDDper सभी मामलों में सही नहीं है।
मिकमेकाना

11
कोई बात नहीं, कभी-कभी आप इसे केवल डेवलपर अनुभव के लिए सिंक तरीके से चलाना चाहते हैं। उदाहरण के लिए, यदि आप किसी डेटा प्रोसेसिंग स्क्रिप्ट के लिए नोड का उपयोग कर रहे हैं जो डिज़ाइन द्वारा अवरुद्ध होना चाहिए, तो उस स्थिति में async existsबस अनावश्यक कॉलबैक जोड़ता है।
कुनोक

2
कुनोक के बयान के लिए निश्चित रूप से +1। अपने कोड के बाकी हिस्सों में मैं केवल कोड को अधिक जटिल बनाता हूं जब यह एक अड़चन होती है जहां गति वास्तव में मायने रखती है। मैं पढ़ने के लिए उस सिद्धांत को क्यों लागू नहीं करूंगा? कई कार्यक्रमों के कई हिस्सों में निष्पादन की गति की तुलना में कोड सादगी / पठनीयता अधिक महत्वपूर्ण हो सकती है। यदि यह एक अड़चन क्षेत्र है तो मैं आगे कोड निष्पादन को रोकने से रखने के लिए async विधियों का उपयोग करूँगा। अन्यथा ... सिंक महान है। आँख बंद करके सिंक से नफरत न करें।
ब्रायनग्रेज़्ज़ाक

3
कृपया ... "ध्यान देने योग्य" नहीं है क्योंकि उपयोगकर्ता स्पष्ट रूप से पूछता है कि इसे कैसे सिंक्रोनाइज़ करना है।
jClark

जवाबों:


2238

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

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

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

const fs = require("fs"); // Or `import fs from "fs";` with ESM
if (fs.existsSync(path)) {
    // Do something
}

इसे कई सालों तक हटा दिया गया था, लेकिन अब नहीं है। डॉक्स से:

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

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

एक asyncसमारोह में:

try {
    await fs.promises.access("somefile");
    // The check succeeded
} catch (error) {
    // The check failed
}

या कॉलबैक के साथ:

fs.access("somefile", error => {
    if (!error) {
        // The check succeeded
    } else {
        // The check failed
    }
});

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

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

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

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

आप उपयोग कर सकते हैं statSyncया lstatSync( डॉक्स लिंक ) है, जो आप एक दे fs.Statsवस्तु । सामान्य तौर पर, यदि किसी फ़ंक्शन का एक सिंक्रोनस संस्करण उपलब्ध है, तो उसके पास Syncअंत में async संस्करण के समान नाम होगा। तो 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) {
    // ...
}

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

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

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

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


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

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

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

अद्यतन सितंबर 2012

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


7
path.exists और path.existsSync दोनों को fexexists और fs.existsSync के पक्ष में पदावनत किया गया है
ड्रू

15
"नोड के लोगों को लगता है कि यह जांचने के लिए गूंगा है कि क्या इसे खोलने से पहले कुछ मौजूद है, जो यह है;" फ़ाइल मौजूद है या नहीं यह जाँचने के लिए गूंगा क्यों है?
पेट्र हर्टक

32
@PrrHurtak: यह हमेशा नहीं होता है (क्योंकि अस्तित्व की जाँच करने के बहुत सारे कारण हैं), लेकिन यदि आप फ़ाइल को खोलने जा रहे हैं , तो openकॉल को जारी करना और अपवाद को संभालना या जो भी फ़ाइल नहीं थी , तो यह सबसे अच्छा है। मिल गया। आखिरकार, असली दुनिया अराजक है: यदि आप पहले जांच करते हैं और यह वहां है, तो इसका मतलब यह नहीं है कि जब आप इसे खोलने की कोशिश करेंगे तो यह अभी भी वहीं होगा; यदि आप पहले जांच करते हैं और यह नहीं है, तो इसका मतलब यह नहीं है कि यह एक पल बाद नहीं होगा। चीजों को समयबद्ध करना जैसे कि किनारे के मामलों की तरह लगता है, लेकिन वे हर समय सामने आते हैं । तो अगर आप खोलने जा रहे हैं, तो पहले चेक करने का कोई मतलब नहीं है।
टीजे क्राउडर

13
और यहां मैंने सोचा कि यह नियंत्रण प्रवाह के लिए त्रुटियों का उपयोग करने के लिए एक विरोधी पैटर्न था: लिंक
argyle

4
@jeromeyers: आप कर सकते थे, लेकिन Ionică आपके लिए पहले ही कर चुका है ( ऊपर टिप्पणी देखें )। :-)
टीजे क्राउडर

124

स्रोत को देखते हुए, का एक तुल्यकालिक संस्करण है path.exists- path.existsSync। लगता है कि यह डॉक्स में छूट गया।

अपडेट करें:

path.existsऔर path.existsSyncअब पदावनत हो गए हैंका उपयोग करें fs.existsऔरfs.existsSync

अपडेट २०१६:

fs.exists और fs.existsSyncभी पदावनत कर दिया गया है । उपयोग fs.stat () या fs.access () के बजाय।

अपडेट 2019:

का उपयोग करें fs.existsSync। यह पदावनत नहीं है। https://nodejs.org/api/fs.html#fs_fs_existssync_path


1
path.existsSync (p) 0.4.10 डॉक्स में नोड्स है
पॉल बेस्टरियन

21
दरअसल, हाल ही में एक और जवाब: path.existsSync को हटा दिया गया है। इसे अब कहा जाता है fs.existsSync
ओलिवियर लालोंडे

9
अब डॉक्स कह रहे हैं कि fexexists को पदावनत कर दिया जाएगा। nodejs.org/api/fs.html#fs_fs_existssync_path
ग्रेग

मैंने पुराने existsफंक्शन को बदलने के लिए एक छोटी सी लाइब्रेरी लिखी :is-there
Ionică Bizău

6
कर्णप्रिय डॉक्स (संस्करण ~ ९) केवल लेबल के fs.existsरूप में पदावनत है जबकि fs.existsSyncऐसा नहीं है!
कुनोक

57

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

var fs = require('fs');

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

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

तो मेरे ऊपर का कोड वास्तव में doesFileExistAndDoIHaveAccessToIt () है, लेकिन आपका प्रश्न doFileNotExistAndCouldICreateIt () हो सकता है, जो पूरी तरह से अलग तर्क होगा (जिसे अन्य बातों के अलावा EPERM त्रुटि के लिए खाते की आवश्यकता होगी)।

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

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


4
अच्छा लगा, मैंने जोड़ा || isDirectory () इसे फाइल / फोल्डर चेकर बनाने के लिए। var आँकड़े = fs.statSync (filePath); लौटाने के आँकड़े ।isFile () || stats.isDirectory ();
बॉब

4
यदि प्रोग्राम के पास फ़ाइल तक पहुंचने के अधिकार नहीं हैं, तो यह अभी भी गलत है, भले ही फ़ाइल मौजूद है यानी फ़ाइल chmod ugo-rwx file.txt से या Windows राइट क्लिक में सभी रिगट को हटा दें ... अपवाद संदेश: अपवाद संदेश: fs.statSync (./) f.txt): त्रुटि: EPERM: ऑपरेशन की अनुमति नहीं है, स्टेट 'X: \ f.txt'। इसलिए यह मामला ऊपरी कोड द्वारा कवर नहीं किया गया है।
ब्रॉडबैंड

2
वाह, जेएस कभी-कभी मंदबुद्धि होता है। तो यकीन है, 97% समय आप फ़ाइल का उपयोग कर रहे हैं, लेकिन file.exists()3% के लिए एक सरल उपयोग नहीं है और इसके बजाय हमें एक कोशिश में पकड़ने के लिए मजबूर करने के लिए? असली हो जाओ ... दिन की कुतिया।
निष्कासित किया गया

20

एक और अपडेट

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

डॉक्स से:

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

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

http://nodejs.org/api/fs.html#fs_fs_exists_path_callback


1
वहाँ एक रास्ता है इसे खुले के साथ करने के बजाय, खुले
ग्रेग हॉर्नबी

1
@GregHornby मुझे लगता है कि इसे उसी तरह से काम करना चाहिए जैसे कि ओपनसिंक
मेलबॉर्न

2
उन लोगों के लिए जो अभी भी जरूरत है exists और existsSyncमैंने बनाया is-there
आयनों बिज़ुआ

6
यह पदावनति मुझे परेशान करती है। किसी फ़ाइल को केवल यह देखने के लिए खोलना कि कोई त्रुटि है या नहीं, संसाधनों की बर्बादी की तरह प्रतीत होता है, जब इसकी आवश्यकता होती है, तो फ़ाइल के अस्तित्व का ज्ञान होता है।
जोश हेन्सन

11

यदि फ़ाइल मौजूद है, तो मैं परीक्षण करने के लिए नीचे फ़ंक्शन का उपयोग करता हूं। यह अन्य अपवादों को भी पकड़ता है। इसलिए मामले में अधिकार के मुद्दे हैं जैसे 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, ...
  }
}

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

{
  [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'
}

2
वास्तव में ऐसा है, यह उन कुछ उत्तरों में से एक है जो नोड के बाद से कर रहे हैं, ऐसा करने के अंतिम 37 तरीकों को हटा दिया है
1mike12

बाह, तुमने मुझे हरा दिया। अगर मैंने इसे पढ़ा होता तो मैं कुछ समय बचा सकता था।
jgmjgm

5

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
}

4

यहाँ कुछ उत्तर कहते हैं कि fs.existsऔर fs.existsSyncदोनों पदावनत हैं। डॉक्स के अनुसार यह अधिक सही नहीं है। केवल fs.existsअब ठीक किया गया है:

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

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


3

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

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


1

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

2
Path.exists अब fs के अंतर्गत है इसलिए यह fexexists है (पथ, कॉलबैक)
टोड मूसा

0

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

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

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;
}

0

उन लोगों के लिए अपडेट किया गया asnwer 'सही ढंग से' यह इंगित करता है कि यह सीधे सवाल का जवाब नहीं देता है, अधिक एक वैकल्पिक विकल्प लाता है।

सिंक समाधान:

fs.existsSync('filePath')यहां डॉक्स भी देखें

यदि मार्ग मौजूद है तो सही है, अन्यथा गलत है।

Async वादा समाधान

एक async संदर्भ में आप केवल awaitकीवर्ड का उपयोग करके सिंक विधि में async संस्करण लिख सकते हैं। आप बस इस तरह एक वादा में async कॉलबैक विधि बदल सकते हैं:

function fileExists(path){
  return new Promise((resolve, fail) => fs.access(path, fs.constants.F_OK, 
    (err, result) => err ? fail(err) : resolve(result))
  //F_OK checks if file is visible, is default does no need to be specified.

}

async function doSomething() {
  var exists = await fileExists('filePath');
  if(exists){ 
    console.log('file exists');
  }
}

पहुँच पर डॉक्स ()।


1
ओपी
vdegenne

आपको अपना कोड अपडेट करना चाहिएfunction asyncFileExists(path) { //F_OK checks if file is visible, is default does no need to be specified. return new Promise(function (res, rej) { fs.access( path, fs.constants.F_OK, function (err) { err ? rej(err) : res(true); }, ); }); }
pery mimon

0

संभावना है, यदि आप जानना चाहते हैं कि क्या कोई फ़ाइल मौजूद है, तो आपको इसकी आवश्यकता होती है यदि यह करता है।

function getFile(path){
    try{
        return require(path);
    }catch(e){
        return false;
    }
}

-1

इसके लिए एक सरल आवरण समाधान यहां दिया गया है:

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 () सबसे सुरुचिपूर्ण समाधान की तरह लगता है।


1
@ दान, धन्यवाद। मैंने छोटा पाठ हटा दिया। मुझे याद नहीं है कि नोट क्या था। अगर यह आता है तो मैं नोट जोड़ दूंगा।
टिमोथी सी। क्विन

1
Np। मैं अपनी टिप्पणी हटा रहा हूं।
दान डैस्कलेस्कु

-2

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

कहते हैं कि हम इसे किसी ऐसी चीज़ के साथ आज़माते हैं जो मौजूद नहीं है:

$ 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 का उपयोग करता है, ताकि यह केवल समन्वित रूप से लिखा जाए, लेकिन asyncronously चलता है।

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

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

एक विकल्प का उपयोग कर रहा है। यदि आप इसे और नीचे की जरूरत है तो async कॉल से वापस किए गए वादे पर .catch।

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

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


1
मूल प्रश्न यह निर्दिष्ट नहीं करता है। मैं यह भी प्रदर्शित कर रहा हूं कि चीजों को कैसे करना है। कई उत्तर स्पष्टता की कमी के कारण कीड़े उत्पन्न कर सकते हैं। लोग अक्सर चीजों को प्रोग्राम करना चाहते हैं, इसलिए यह सिंक्रोनस प्रतीत होता है लेकिन जरूरी नहीं कि सिंक्रोनस निष्पादन हो। statSync मेरे द्वारा प्रदर्शित कोड के समान नहीं है। या तो वास्तव में वांछित के खाते अस्पष्ट हैं, इसलिए आप केवल अपनी व्यक्तिगत व्याख्याएं ही थोप रहे हैं। यदि आपको कोई ऐसा उत्तर मिलता है जो आपको समझ में नहीं आता है तो बेहतर हो सकता है कि आप केवल टिप्पणियों या पीएम से पूछ सकते हैं कि संपादनों की क्या जरूरत है।
jgmjgm

1
यदि आप चाहते हैं कि आप मेरा कोड नमूना भी चुरा सकते हैं, तो इसे उचित रूप से नाम दें, इसे गीथूब पर रखें, इसे npm पर जोड़ें और फिर उत्तर केवल एक पंक्ति / लिंक होगा: D।
jgmjgm

उदाहरण के लिए कोड छोटा है, लेकिन आप & quot; सम्‍मिलित करने के लिए एक संपादित सुझाव देने के लिए स्वागत करते हैं या सहानुभूति के लिए एक चेक, आदि (फिर भी प्रश्न स्पष्ट रूप से कभी नहीं बताता है कि वे क्या चाहते हैं)। जैसा कि मैंने पहले ही बताया है कि मेरा उत्तर प्रश्न की एक व्याख्या को संतुष्ट करता है और वही नहीं करता है जो आपका एक प्रस्ताव करता है।
jgmjgm
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.