নোড.জেজে ফাইল / ডিরেক্টরি বিদ্যমান থাকলে সিঙ্ক্রোনাসলি পরীক্ষা করুন


1206

কোনও ফাইল বা ডিরেক্টরি উপস্থিত থাকলে নোড.জেএস ব্যবহার করে আমি কীভাবে একযোগে পরীক্ষা করতে পারি ?


57
মডিউল ফিরে আসার আগে এককালীন ফাইল / ডিরেক্টরি ক্রিয়াকলাপ সম্পাদনের জন্য সিঙ্ক্রোনাস অপারেশন দুর্দান্ত। উদাহরণস্বরূপ, একটি কনফিগারেশন ফাইল বুটস্ট্র্যাপ করা।
জোকুল

1
একটি উষ্ণ ক্যাশেযুক্ত পলড্রাপার সব ক্ষেত্রেই সত্য নয়।
মাইকমেকানা

11
পারফরম্যান্সের বিষয়টি বিবেচনা করুন না, কখনও কখনও আপনি কেবল বিকাশকারী অভিজ্ঞতার জন্য এটি একটি সিঙ্ক পদ্ধতিতে চালাতে চান। উদাহরণস্বরূপ, আপনি যদি কোনও ডেটা প্রসেসিং স্ক্রিপ্টের জন্য নোড ব্যবহার করছেন যা ডিজাইনের মাধ্যমে ব্লক করা উচিত, সেক্ষেত্রে অ্যাসিঙ্ক existsকেবল অপ্রয়োজনীয় কলব্যাক যোগ করে।
কুনোক

2
অবশ্যই কুনোকের বক্তব্যকে +1 করুন। আমার কোডের বাকী অংশগুলিতে আমি কেবল তখনই কোডটিকে আরও জটিল করে তুলি যখন এটি একটি গতিরোধক যেখানে গতি সত্যই গুরুত্বপূর্ণ। আমি কেন সেই নীতিটি ফাইল পড়ার ক্ষেত্রে প্রয়োগ করব না? অনেক প্রোগ্রামের অনেক অংশে কোডের সরলতা / পঠনযোগ্যতা কার্যকরকরণের গতির চেয়ে বেশি গুরুত্বপূর্ণ হতে পারে। যদি এটি কোনও বাধা ক্ষেত্রের ক্ষেত্র হয় তবে আমি আরও কোড প্রয়োগ করা বন্ধ না করার জন্য অ্যাসিঙ্ক পদ্ধতি ব্যবহার করব। অন্যথায় ... সিঙ্ক দুর্দান্ত। সিঙ্ককে অন্ধভাবে ঘৃণা করবেন না।
ব্রায়ানগ্রিজস্কাক

3
দয়া করে ... "লক্ষ্য করার মতো নয়" কারণ ব্যবহারকারী এটি সুসংগতভাবে কীভাবে করবেন তা স্পষ্টভাবে জিজ্ঞাসা করে।
jClark

উত্তর:


2237

এই প্রশ্নের উত্তর বছরের পর বছর পরিবর্তিত হয়েছে। কালানুক্রমিক ক্রমে বিভিন্ন উত্তর অনুসরণ করার পরে বর্তমান উত্তরটি এখানে শীর্ষে রয়েছে:

বর্তমান উত্তর

আপনি ব্যবহার করতে পারেন 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()অন্যান্য নোড.জেএস কলব্যাকের সাথে সঙ্গতিপূর্ণ এমন পরামিতিগুলি গ্রহণ করার জন্য কলব্যাক পরামিতি কলব্যাক 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
    }
});

.তিহাসিক উত্তর

কালানুক্রমিক ক্রমে historicalতিহাসিক উত্তরগুলি এখানে:

  • ২০১০
    ( 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শেষে সমাপ্তি হিসাবে অ্যাসিঙ্ক সংস্করণটির একই নাম থাকবে । সুতরাং statSyncএর সমলয় সংস্করণ stat; lstatSyncএর সিঙ্ক্রোনাস সংস্করণ lstatইত্যাদি is

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, ইত্যাদি, ইত্যাদি Note দ্রষ্টব্য try/catch; এন্ট্রি মোটেই বিদ্যমান না থাকলে এটি একটি ত্রুটি ছুড়ে দেয়।

আপনি যত্ন না থাকে কি এন্ট্রি হয় এবং শুধুমাত্র জানেন যে কিনা এটা বিদ্যমান, আপনি ব্যবহার করতে পারেন path.existsSync(বা সর্বশেষ সঙ্গে fs.existsSync) হিসেবে user618408 দ্বারা লক্ষনীয় :

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

এটির কোনও প্রয়োজন হয় না try/catchতবে জিনিসটি কী তা কেবল আপনাকে সেখানে কোনও তথ্য দেয় না that path.existsSyncঅনেক আগেই হতাশ হয়েছিল।


সাইড নোট: আপনি স্পষ্টভাবে চেক করতে কিভাবে জিজ্ঞাসা করেছি সিঙ্ক্রোনাস , তাই আমি ব্যবহার করেছি xyzSyncউপরে ফাংশন সংস্করণ। তবে যেখানেই সম্ভব 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) । এবং কমপক্ষে অক্টোবর ২০১ of পর্যন্ত, 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()অন্যান্য নোড.জেএস কলব্যাকের সাথে সঙ্গতিপূর্ণ এমন পরামিতিগুলি গ্রহণ করার জন্য কলব্যাক পরামিতি কলব্যাক fs.existsSync()ব্যবহার করে না))


7
path.exists এবং path.existsSync উভয়ই fs.exists এবং fs.existsSnc এর পক্ষে অবতরণ করা হয়েছে
ড্রউ

15
"নোড লোকেরা মনে করে যে এটি খোলার আগে কিছু আছে কিনা তা যাচাই করা বোবা, যা এটি;" ফাইলটি বিদ্যমান কিনা তা পরীক্ষা করার জন্য বোবা কেন?
পেটর হুরতাক

32
@ পেটারহুর্টাক: এটি সর্বদা হয় না (কারণ উপস্থিতি পরীক্ষা করার অনেক কারণ রয়েছে) তবে আপনি যদি ফাইলটি খুলতে চলেছেন তবে কেবল openকলটি প্রকাশ করা এবং ব্যতিক্রমটি হ্যান্ডেল করা বা ফাইলটি যদি না থাকুক তবে ভাল হবে পাওয়া যায় নি। সর্বোপরি, আসল বিশৃঙ্খলা বিশৃঙ্খল: আপনি যদি প্রথমে পরীক্ষা করেন এবং এটি সেখানে রয়েছে, এর অর্থ এই নয় যে আপনি যখন এটি খোলার চেষ্টা করবেন তখন এখনও সেখানে থাকবেন; আপনি যদি প্রথমে যাচাই করেন এবং এটি সেখানে নেই, তার মানে এই নয় যে এটি এক মুহুর্ত পরে সেখানে আসবে না। এ জাতীয় সময়সীমার বিষয়গুলি প্রান্তের মতো মনে হয় তবে তারা সর্বদা সামনে আসে । আপনি যদি খুলতে যাচ্ছেন তবে প্রথমে চেক করার কোনও মানে নেই point
টিজে ক্রাউডার

13
এবং এখানে আমি ভেবেছিলাম নিয়ন্ত্রণ প্রবাহের জন্য ত্রুটিগুলি ব্যবহার করা এটি একটি বিরোধী
নিদর্শন ছিল

4
@ জিরোমায়ার্স: আপনি করতে পারেন, তবে আয়নিক আপনার জন্য ইতিমধ্যে এটি করেছে ( উপরে মন্তব্য দেখুন )। :-)
টিজে ক্রাউডার

124

উত্সটির দিকে তাকালে, path.exists- এর একটি সিঙ্ক্রোনাস সংস্করণ রয়েছে path.existsSync। দেখে মনে হচ্ছে এটি ডক্সে মিস হয়েছে missed

হালনাগাদ:

path.existsএবং path.existsSyncএখন অবচিতদয়া করে ব্যবহার করুন fs.existsএবংfs.existsSync

২০১ 2016 আপডেট করুন:

fs.exists এবং fs.existsSyncএছাড়াও আছে অবচিত হয়েছে । ব্যবহারের fs.stat () বা fs.access () পরিবর্তে।

2019 আপডেট করুন:

ব্যবহার fs.existsSync। এটি অবচয় করা হয়নি। https://nodejs.org/api/fs.html#fs_fs_existssync_path



21
প্রকৃতপক্ষে, আরও সাম্প্রতিক উত্তর: path.existsSync অবচিত। এটি এখন বলা হয় fs.existsSync
অলিভিয়ের লালনডে

9
এখন ডক্স বলছে fs.exists হ্রাস করা হবে। nodejs.org/api/fs.html#fs_fs_existssync_path
গ্রেগ হর্নবি

পুরানো existsফাংশনটি প্রতিস্থাপন করার জন্য আমি একটি ছোট লাইব্রেরি লিখেছি :is-there
আয়নিক বিজাউ

6
কারেন্টেন্ট ডক্স (সংস্করণ ~ 9) কেবল অবহিত fs.existsহিসাবে লেবেলযুক্ত fs.existsSyncনয়!
কুনোক

57

বর্তমানে প্রস্তাবিত (2015 হিসাবে) এপিআইগুলি (নোড ডক্স অনুসারে) ব্যবহার করে আমি এটি করি:

var fs = require('fs');

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

মন্তব্যগুলিতে @ ব্রডব্যান্ড দ্বারা উত্থাপিত ইপিআরএম ইস্যুটির জবাবে, এটি একটি ভাল বিষয় নিয়ে আসে। ফাইলএক্সিস্টগুলি () সম্ভবত অনেক ক্ষেত্রে এটি সম্পর্কে ভাবার পক্ষে ভাল উপায় নয় কারণ ফাইলএক্সিস্টরা () সত্যিই কোনও বুলিয়ান রিটার্নের প্রতিশ্রুতি দিতে পারে না। আপনি ফাইলটি বিদ্যমান বা বিদ্যমান নেই তা সুনির্দিষ্টভাবে নির্ধারণ করতে সক্ষম হতে পারেন তবে আপনি অনুমতি ত্রুটিও পেতে পারেন। অনুমতিগুলির ত্রুটিটি অগত্যা এই ফাইলটি উপস্থিত হওয়ার ইঙ্গিত দেয় না কারণ আপনি যে ফাইলটিতে যাচাই করে যাচ্ছেন এটির ডিরেক্টরিতে আপনার অনুমতিের অভাব হতে পারে। এবং অবশ্যই ফাইল অস্তিত্বের জন্য যাচাই করার ক্ষেত্রে আপনি অন্য কোনও ত্রুটির মুখোমুখি হতে পারেন।

সুতরাং উপরের আমার কোডটি আসলে ফাইলফিজিস্টএন্ডডোআইইভএভস্যাক্সটোটি (), তবে আপনার প্রশ্নটি ফাইলফট নটএক্সিস্টঅ্যান্ডকোল্ডিকারিক্যাট () হতে পারে, যা সম্পূর্ণ ভিন্ন যুক্তিযুক্ত হতে পারে (এর জন্য অন্যান্য বিষয়গুলির মধ্যে একটি ইপিআরএম ত্রুটির জন্য অ্যাকাউন্ট প্রয়োজন)।

যখন fs.existsSync উত্তরটি সরাসরি এখানে জিজ্ঞাসিত প্রশ্নকে সম্বোধন করে, আপনি যা চান তা প্রায়শই ঘটে না (কোনও পথের মধ্যে "কিছু" আছে কিনা তা আপনি কেবল জানতে চান না, আপনি সম্ভবত "জিনিস" কিনা তা যত্নবান হন এটি বিদ্যমান একটি ফাইল বা ডিরেক্টরি)।

তল লাইনটি হ'ল যদি আপনি কোনও ফাইল বিদ্যমান কিনা তা পরীক্ষা করে দেখেন তবে আপনি সম্ভবত এটি করছেন কারণ আপনি ফলাফলের উপর ভিত্তি করে কিছু পদক্ষেপ নেওয়ার পরিকল্পনা করছেন এবং সেই যুক্তিটি (চেক এবং / বা পরবর্তী ক্রিয়া) ধারণ করা উচিত এই পথে যে জিনিসটি পাওয়া গেছে সেটি ফাইল বা ডিরেক্টরি হতে পারে এবং আপনি EPERM বা অন্য ত্রুটিগুলির পরীক্ষা করতে পারেন encounter


4
ভাল লাগল, আমি যোগ করলাম || এটি ফাইল / ফোল্ডার চেকার হিসাবে তৈরি করতে ডিরেক্টরি ()। var stats = fs.statSync (filePath); retats stats.isFile () || stats.isDirectory ();
বব

4
প্রোগ্রামটিতে ফাইল অ্যাক্সেস করার অধিকার না থাকলে ফাইলটি বিদ্যমান থাকা সত্ত্বেও এটি মিথ্যা ফিরিয়ে দেয় অর্থাত্ chmod ugo-rwx file.txt ফাইল থেকে বা উইন্ডোজ রাইট ক্লিকে সমস্ত অনর্থক অপসারণ ... ব্যতিক্রম বার্তা: ব্যতিক্রম fs.statSync (./ f.txt): ত্রুটি: EPERM: ক্রিয়াকলাপ অনুমোদিত নয়, স্ট্যাট 'X:। f.txt'। সুতরাং এই ক্ষেত্রেটি আপার কোড দ্বারা আচ্ছাদিত নয়।
ব্রডব্যান্ড

2
বাহ, জেএস কখনও কখনও প্রতিবন্ধক হয়। সুতরাং নিশ্চিত হয়ে নিন, আপনি যখন ফাইলটি ব্যবহার করবেন তখন of৯% সময়, তবে file.exists()৩% এর সাধারণ ব্যবহার নেই এবং পরিবর্তে আমাদের এটিকে একটি চেষ্টা করার জন্য আবদ্ধ করতে বাধ্য করছেন? রিয়েল পান ... দিনের বিচ
বহিষ্কারবয়

20

আরেকটি আপডেট

এই প্রশ্নের উত্তরের প্রয়োজনে আমি নোড ডকগুলি সন্ধান করেছি, মনে হচ্ছে আপনি fs.exists ব্যবহার করবেন না , পরিবর্তে fs.open ব্যবহার করুন এবং কোনও ফাইল উপস্থিত না থাকলে সনাক্ত করার জন্য আউটপুটযুক্ত ত্রুটি ব্যবহার করুন:

ডক্স থেকে:

fs.exists () একটি অ্যানক্রোনজম এবং এটি কেবল historicalতিহাসিক কারণে বিদ্যমান। এটি নিজের কোডে ব্যবহার করার কারণ নেই almost

বিশেষত, ফাইলটি খোলার আগে উপস্থিত রয়েছে কিনা তা পরীক্ষা করা একটি অ্যান্টি-প্যাটার্ন যা আপনাকে জাতিগত অবস্থার জন্য ঝুঁকির মধ্যে ফেলে দেয়: অন্য একটি প্রক্রিয়া ফাইলকে fs.exists () এবং fs.open () এর কলগুলির মধ্যে সরিয়ে ফেলতে পারে। কেবল ফাইলটি খুলুন এবং ত্রুটিটি সেখানে উপস্থিত না হলে পরিচালনা করুন।

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


1
ওপেন সিংক দিয়ে এটি করার উপায় কি ওপেন না করে রয়েছে
গ্রেগ হর্নবি

1
@ গ্রেগ হর্নবি আমি ভেবেছি ওপেনসিঙ্কের সাথে এটি একইভাবে কাজ করা উচিত
মেলবোর্ন ২

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 টি উপায়
অবহিত করা হয়েছে

বাহ, আপনি আমাকে এটি মারধর। আমি যদি এটি পড়তাম তবে আমি কিছুটা সময় বাঁচাতে পারতাম।
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 এর কলব্যাক পরামিতি () অন্যান্য নোড.জেএস কলব্যাকের সাথে সঙ্গতিপূর্ণ নয় এমন পরামিতি গ্রহণ করে f 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
পাথ.এক্সিজিস্টগুলি এখন fs এর অধীনে রয়েছে সুতরাং এটি fs.exists (পথ, কলব্যাক)
টড মোসেস

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

এই ব্যক্তিদের 'সঠিকভাবে' নির্দেশ করে এটি সরাসরি প্রশ্নের উত্তর দেয় না, আরও বিকল্প বিকল্প নিয়ে আসে।

সিঙ্ক সমাধান:

fs.existsSync('filePath')এছাড়াও এখানে ডক্স দেখুন

পথটি যদি উপস্থিত থাকে তবে সত্য, অন্যথায় মিথ্যা।

অ্যাসিঙ্ক প্রতিশ্রুতি সমাধান

একটি অ্যাসিঙ্ক প্রসঙ্গে আপনি মূল awaitশব্দটি ব্যবহার করে সিঙ্ক পদ্ধতিতে অ্যাসিঙ্ক সংস্করণটি লিখতে পারেন । আপনি সহজেই এ্যাসিঙ্ক কলব্যাক পদ্ধতিটিকে এই জাতীয় প্রতিশ্রুতিতে রূপান্তর করতে পারেন:

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
ওপি একটি
সংকীর্ণ

আপনার কোডটি আপডেট করতে হবে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); }, ); }); }
পেরি মিমন

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.relpathSync () সঠিক কাজের পরিস্থিতিতে মিথ্যা ফিরিয়ে দেবে তাই আমার মনে হয় এটি কাজ করা উচিত 100%।

আমি এমন একটি সমাধান দেখতে পছন্দ করব যা কোনও ত্রুটি এবং ফলস্বরূপ পারফরম্যান্সের হিট সৃষ্টি করে না। একটি API দৃষ্টিকোণ থেকে, 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 () => {
    try {
        console.log(await dir_exists('god'));
        console.log(await dir_exists('fsm/appendage'));
    }
    catch(e) {
        console.log(e);
    }
})();

একটি বিকল্প ব্যবহার করছে। ততক্ষণ আপনি যদি আরও নীচে প্রয়োজন হয় তবে অ্যাসিঙ্ক কল থেকে ফিরে আসা প্রতিশ্রুতিটি দেখুন।

আপনি যদি কিছু আছে কিনা তা যাচাই করতে চান তবে এটি ডিরেক্টরি বা ফাইলের মতো সঠিক ধরণের জিনিসটিও নিশ্চিত করা ভাল অভ্যাস। এটি উদাহরণের অন্তর্ভুক্ত। যদি এটি একটি সিমিলিংক হিসাবে অনুমোদিত না হয় তবে আপনাকে অবশ্যই স্ট্যাটের পরিবর্তে lstat ব্যবহার করতে হবে কারণ স্ট্যাটাস স্বয়ংক্রিয়ভাবে লিঙ্কগুলি অতিক্রম করবে।

আপনি এখানে সিঙ্ক কোডের জন্য সমস্ত অ্যাসিঙ্কটি প্রতিস্থাপন করতে পারেন এবং পরিবর্তে স্ট্যাটাসিঙ্ক ব্যবহার করতে পারেন। তবে আশা করুন যে একবার অ্যাসিঙ্ক এবং সার্বজনীন হয়ে ওঠার অপেক্ষায় রয়েছে সিঙ্ক কলগুলি অবশেষে অবমূল্যায়ন হয়ে উঠবে (অন্যথায় আপনাকে এগুলি সর্বত্র নির্ধারণ করতে হবে এবং শৃঙ্খলাবদ্ধতা ঠিক যেমন অ্যাসিঙ্ককে সত্যই অর্থহীন করে তুলবে)।


1
মূল প্রশ্নটি এটি নির্দিষ্ট করে না। আমি কীভাবে নির্বিঘ্নে জিনিসগুলি করব তাও প্রদর্শন করছি। অনেক উত্তর পরিষ্কারতার অভাবের কারণে বাগ প্ররোচিত করতে পারে। লোকেরা প্রায়শই জিনিসগুলি প্রোগ্রাম করতে চায় যাতে এটি সিঙ্ক্রোনাস প্রদর্শিত হয় তবে অগত্যা সিঙ্ক্রোনাস এক্সিকিউশন চায় না। স্টেটসিঙ্কটি আমি যে কোডটি দেখিয়েছি তার মতো নয়। হয় প্রকৃতপক্ষে যা চাওয়া হয়েছে তার অ্যাকাউন্টগুলি অস্পষ্ট, সুতরাং আপনি কেবল নিজের ব্যক্তিগত ব্যাখ্যা চাপিয়ে দিচ্ছেন। আপনি যদি কোনও উত্তর খুঁজে পান তবে আপনি বুঝতে পারছেন না যে কি সম্পাদনাগুলি প্রয়োজন তা নিয়ে মন্তব্য বা প্রধানমন্ত্রীর কাছে কেবল জিজ্ঞাসা করা ভাল।
jgmjgm

1
আপনি যদি চান আমার কোডের নমুনাও চুরি করতে পারেন, এটি যথাযথভাবে নাম দিন, গিথুব এ রাখুন, এনপিএম এ যুক্ত করুন এবং তারপরে উত্তরটি কেবল একটি লাইন / লিঙ্ক হবে: ডি।
jgmjgm

কোড উদাহরণস্বরূপ সংক্ষিপ্ত, তবে আপনাকে &&! IsFile বা সিমলিংকের জন্য একটি চেক ইত্যাদি অন্তর্ভুক্ত করার জন্য একটি সম্পাদনা প্রস্তাব জমা দিতে স্বাগত জানাই (আবার যদিও প্রশ্নটি স্পষ্টভাবে এমনকি তারা চায় তাও বর্ণনা করে না)। আমি ইতিমধ্যে চিহ্নিত করেছি যে আমার উত্তর প্রশ্নের একটি ব্যাখ্যা সন্তুষ্ট করে এবং আপনার এক লাইনের প্রস্তাবটি একই কাজ করে না।
jgmjgm
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.