কোনও ফাইল বা ডিরেক্টরি উপস্থিত থাকলে নোড.জেএস ব্যবহার করে আমি কীভাবে একযোগে পরীক্ষা করতে পারি ?
exists
কেবল অপ্রয়োজনীয় কলব্যাক যোগ করে।
কোনও ফাইল বা ডিরেক্টরি উপস্থিত থাকলে নোড.জেএস ব্যবহার করে আমি কীভাবে একযোগে পরীক্ষা করতে পারি ?
exists
কেবল অপ্রয়োজনীয় কলব্যাক যোগ করে।
উত্তর:
এই প্রশ্নের উত্তর বছরের পর বছর পরিবর্তিত হয়েছে। কালানুক্রমিক ক্রমে বিভিন্ন উত্তর অনুসরণ করার পরে বর্তমান উত্তরটি এখানে শীর্ষে রয়েছে:
আপনি ব্যবহার করতে পারেন 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
) এর আসল উত্তরexists
/ existsSync
)exists
/ existsSync
, তাই আমরা সম্ভবত ফিরে যেতে বসেছেন stat
/ statSync
বা lstat
/ lstatSync
)fs.access(path, fs.F_OK, function(){})
/ fs.accessSync(path, fs.F_OK)
তবে নোট করুন যে ফাইল / ডিরেক্টরিটি যদি উপস্থিত না থাকে তবে এটি একটি ত্রুটি; ডকসই fs.stat
ব্যবহারের পরামর্শ দেওয়ার জন্য fs.access
আপনাকে যদি না খোলার অস্তিত্বের জন্য পরীক্ষা করতে হয়)fs.exists()
এখনও অবচিত হয় কিন্তু fs.existsSync()
আর হ্রাস করা হয় না। সুতরাং আপনি এখন এটি নিরাপদে ব্যবহার করতে পারেন।আপনি ব্যবহার করতে পারেন 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
}
});
তবে আপনার যদি সিঙ্ক্রোনাস সংস্করণ প্রয়োজন হয় তবে এটি সেখানে।
কয়েক বছর আগে নীচের উত্তরটি এখন কিছুটা পুরানো। বর্তমান উপায় হ'ল 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 এ আছি এবং নোড ডক্স এখন বলে যে fs.existsSync
(এবং fs.exists
) "অবমূল্যায়ন করা হবে"। (কারণ নোডের লোকেরা মনে করে যে এটি খোলার আগে কিছু আছে কিনা তা যাচাই করা বোবা, যা এটি; তবে কোনও কিছুর অস্তিত্ব আছে কিনা তা যাচাই করার একমাত্র কারণ এটি নয়!)
সুতরাং আমরা সম্ভবত বিভিন্ন stat
পদ্ধতিতে ফিরে এসেছি ... যতক্ষণ না / না এটি অবশ্যই আবার পরিবর্তন না করে অবশ্যই।
জানি না এটি কত দিন ছিল, তবে এছাড়াও 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
}
});
আপনি ব্যবহার করতে পারেন fs.existsSync()
:
if (fs.existsSync(path)) {
// Do something
}
এটি বেশ কয়েক বছর ধরে অবহেলিত ছিল, তবে আর নেই। ডক্স থেকে:
নোট যে
fs.exists()
অবচয় হয়, কিন্তুfs.existsSync()
হয় না। (fs.exists()
অন্যান্য নোড.জেএস কলব্যাকের সাথে সঙ্গতিপূর্ণ এমন পরামিতিগুলি গ্রহণ করার জন্য কলব্যাক পরামিতি কলব্যাকfs.existsSync()
ব্যবহার করে না))
open
কলটি প্রকাশ করা এবং ব্যতিক্রমটি হ্যান্ডেল করা বা ফাইলটি যদি না থাকুক তবে ভাল হবে পাওয়া যায় নি। সর্বোপরি, আসল বিশৃঙ্খলা বিশৃঙ্খল: আপনি যদি প্রথমে পরীক্ষা করেন এবং এটি সেখানে রয়েছে, এর অর্থ এই নয় যে আপনি যখন এটি খোলার চেষ্টা করবেন তখন এখনও সেখানে থাকবেন; আপনি যদি প্রথমে যাচাই করেন এবং এটি সেখানে নেই, তার মানে এই নয় যে এটি এক মুহুর্ত পরে সেখানে আসবে না। এ জাতীয় সময়সীমার বিষয়গুলি প্রান্তের মতো মনে হয় তবে তারা সর্বদা সামনে আসে । আপনি যদি খুলতে যাচ্ছেন তবে প্রথমে চেক করার কোনও মানে নেই point
উত্সটির দিকে তাকালে, path.exists
- এর একটি সিঙ্ক্রোনাস সংস্করণ রয়েছে path.existsSync
। দেখে মনে হচ্ছে এটি ডক্সে মিস হয়েছে missed
path.exists
এবং path.existsSync
এখন অবচিত । দয়া করে ব্যবহার করুন ।fs.exists
এবংfs.existsSync
fs.exists
এবং অবচিত হয়েছে । ব্যবহারের fs.stat () বা fs.access () পরিবর্তে।fs.existsSync
এছাড়াও আছে
ব্যবহার fs.existsSync
। এটি অবচয় করা হয়নি।
https://nodejs.org/api/fs.html#fs_fs_existssync_path
fs.existsSync
।
exists
ফাংশনটি প্রতিস্থাপন করার জন্য আমি একটি ছোট লাইব্রেরি লিখেছি :is-there
fs.exists
হিসাবে লেবেলযুক্ত fs.existsSync
নয়!
বর্তমানে প্রস্তাবিত (2015 হিসাবে) এপিআইগুলি (নোড ডক্স অনুসারে) ব্যবহার করে আমি এটি করি:
var fs = require('fs');
function fileExists(filePath)
{
try
{
return fs.statSync(filePath).isFile();
}
catch (err)
{
return false;
}
}
মন্তব্যগুলিতে @ ব্রডব্যান্ড দ্বারা উত্থাপিত ইপিআরএম ইস্যুটির জবাবে, এটি একটি ভাল বিষয় নিয়ে আসে। ফাইলএক্সিস্টগুলি () সম্ভবত অনেক ক্ষেত্রে এটি সম্পর্কে ভাবার পক্ষে ভাল উপায় নয় কারণ ফাইলএক্সিস্টরা () সত্যিই কোনও বুলিয়ান রিটার্নের প্রতিশ্রুতি দিতে পারে না। আপনি ফাইলটি বিদ্যমান বা বিদ্যমান নেই তা সুনির্দিষ্টভাবে নির্ধারণ করতে সক্ষম হতে পারেন তবে আপনি অনুমতি ত্রুটিও পেতে পারেন। অনুমতিগুলির ত্রুটিটি অগত্যা এই ফাইলটি উপস্থিত হওয়ার ইঙ্গিত দেয় না কারণ আপনি যে ফাইলটিতে যাচাই করে যাচ্ছেন এটির ডিরেক্টরিতে আপনার অনুমতিের অভাব হতে পারে। এবং অবশ্যই ফাইল অস্তিত্বের জন্য যাচাই করার ক্ষেত্রে আপনি অন্য কোনও ত্রুটির মুখোমুখি হতে পারেন।
সুতরাং উপরের আমার কোডটি আসলে ফাইলফিজিস্টএন্ডডোআইইভএভস্যাক্সটোটি (), তবে আপনার প্রশ্নটি ফাইলফট নটএক্সিস্টঅ্যান্ডকোল্ডিকারিক্যাট () হতে পারে, যা সম্পূর্ণ ভিন্ন যুক্তিযুক্ত হতে পারে (এর জন্য অন্যান্য বিষয়গুলির মধ্যে একটি ইপিআরএম ত্রুটির জন্য অ্যাকাউন্ট প্রয়োজন)।
যখন fs.existsSync উত্তরটি সরাসরি এখানে জিজ্ঞাসিত প্রশ্নকে সম্বোধন করে, আপনি যা চান তা প্রায়শই ঘটে না (কোনও পথের মধ্যে "কিছু" আছে কিনা তা আপনি কেবল জানতে চান না, আপনি সম্ভবত "জিনিস" কিনা তা যত্নবান হন এটি বিদ্যমান একটি ফাইল বা ডিরেক্টরি)।
তল লাইনটি হ'ল যদি আপনি কোনও ফাইল বিদ্যমান কিনা তা পরীক্ষা করে দেখেন তবে আপনি সম্ভবত এটি করছেন কারণ আপনি ফলাফলের উপর ভিত্তি করে কিছু পদক্ষেপ নেওয়ার পরিকল্পনা করছেন এবং সেই যুক্তিটি (চেক এবং / বা পরবর্তী ক্রিয়া) ধারণ করা উচিত এই পথে যে জিনিসটি পাওয়া গেছে সেটি ফাইল বা ডিরেক্টরি হতে পারে এবং আপনি EPERM বা অন্য ত্রুটিগুলির পরীক্ষা করতে পারেন encounter
file.exists()
৩% এর সাধারণ ব্যবহার নেই এবং পরিবর্তে আমাদের এটিকে একটি চেষ্টা করার জন্য আবদ্ধ করতে বাধ্য করছেন? রিয়েল পান ... দিনের বিচ
আরেকটি আপডেট
এই প্রশ্নের উত্তরের প্রয়োজনে আমি নোড ডকগুলি সন্ধান করেছি, মনে হচ্ছে আপনি fs.exists ব্যবহার করবেন না , পরিবর্তে fs.open ব্যবহার করুন এবং কোনও ফাইল উপস্থিত না থাকলে সনাক্ত করার জন্য আউটপুটযুক্ত ত্রুটি ব্যবহার করুন:
ডক্স থেকে:
fs.exists () একটি অ্যানক্রোনজম এবং এটি কেবল historicalতিহাসিক কারণে বিদ্যমান। এটি নিজের কোডে ব্যবহার করার কারণ নেই almost
বিশেষত, ফাইলটি খোলার আগে উপস্থিত রয়েছে কিনা তা পরীক্ষা করা একটি অ্যান্টি-প্যাটার্ন যা আপনাকে জাতিগত অবস্থার জন্য ঝুঁকির মধ্যে ফেলে দেয়: অন্য একটি প্রক্রিয়া ফাইলকে fs.exists () এবং fs.open () এর কলগুলির মধ্যে সরিয়ে ফেলতে পারে। কেবল ফাইলটি খুলুন এবং ত্রুটিটি সেখানে উপস্থিত না হলে পরিচালনা করুন।
যদি ফাইল বিদ্যমান থাকে তা পরীক্ষা করতে আমি নীচে ফাংশনটি ব্যবহার করি। এটি অন্যান্য ব্যতিক্রমও ধরা দেয়। সুতরাং অধিকার সম্পর্কিত সমস্যাগুলি যেমন, যেমন 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'
}
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
}
কিছু উত্তর এখানে বলে যে fs.exists
এবং fs.existsSync
উভয় হ্রাস করা হয়। ডক্স অনুসারে এটি আর সত্য নয়। কেবল fs.exists
এখনই হ্রাস করা হয়েছে:
নোট করুন যে fs.exists () অবমূল্যায়িত হয়েছে, কিন্তু fs.existsSync () নয়। (Fs.exists এর কলব্যাক পরামিতি () অন্যান্য নোড.জেএস কলব্যাকের সাথে সঙ্গতিপূর্ণ নয় এমন পরামিতি গ্রহণ করে f fs.existsSync () কলব্যাক ব্যবহার করে না))
সুতরাং কোনও ফাইলের উপস্থিত রয়েছে কিনা তা সিঙ্ক্রোনালি পরীক্ষা করতে আপনি নিরাপদে fs.existsSync () ব্যবহার করতে পারেন ।
path
মডিউল একটি সমকালীন সংস্করণ উপলব্ধ করা হয় না path.exists
তাই আপনার সাথে প্রায় রত আছে fs
মডিউল।
আমি কল্পনা করতে পারি দ্রুততম জিনিসটি এটি ব্যবহার করছে fs.realpathSync
যা আপনাকে ধরতে হবে এমন একটি ত্রুটি ছুঁড়ে দেবে, তাই চেষ্টা / ধরা দিয়ে আপনার নিজের র্যাপার ফাংশনটি তৈরি করা দরকার।
ফাইলসিস্টেম (এফএস) পরীক্ষা ব্যবহার করা ত্রুটিযুক্ত বস্তুগুলিকে ট্রিগার করবে, যার পরে আপনার চেষ্টা / ক্যাপচার স্টেটমেন্টে মোড়ানো দরকার। নিজেকে কিছুটা চেষ্টা সংরক্ষণ করুন এবং 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.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;
}
এই ব্যক্তিদের 'সঠিকভাবে' নির্দেশ করে এটি সরাসরি প্রশ্নের উত্তর দেয় না, আরও বিকল্প বিকল্প নিয়ে আসে।
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');
}
}
অ্যাক্সেসে থাকা ডক্স ()।
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); }, ); }); }
সম্ভাবনাগুলি হ'ল, যদি আপনি কোনও ফাইল বিদ্যমান কিনা তা জানতে চান, আপনি যদি এটির প্রয়োজন হয় তবে এটির প্রয়োজন হয়।
function getFile(path){
try{
return require(path);
}catch(e){
return false;
}
}
এটির জন্য এখানে একটি সহজ মোড়কের সমাধান:
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 () সর্বাধিক মার্জিত সমাধান বলে মনে হচ্ছে।
উত্তরগুলি থেকে দেখা যাচ্ছে যে এর জন্য কোনও সরকারী এপিআই সমর্থন নেই (যেমন প্রত্যক্ষ এবং স্পষ্ট চেক হিসাবে)। উত্তরগুলির অনেকগুলি স্ট্যাট ব্যবহার করতে বলে, তবে সেগুলি কঠোর নয়। আমরা উদাহরণস্বরূপ ধরে নিতে পারি না যে স্ট্যাটাস দ্বারা নিক্ষিপ্ত কোনও ত্রুটির অর্থ হল যে কিছু উপস্থিত নেই।
আসুন আমরা এটি এমন কিছু দিয়ে চেষ্টা করি যা বিদ্যমান নেই:
$ 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 ব্যবহার করতে হবে কারণ স্ট্যাটাস স্বয়ংক্রিয়ভাবে লিঙ্কগুলি অতিক্রম করবে।
আপনি এখানে সিঙ্ক কোডের জন্য সমস্ত অ্যাসিঙ্কটি প্রতিস্থাপন করতে পারেন এবং পরিবর্তে স্ট্যাটাসিঙ্ক ব্যবহার করতে পারেন। তবে আশা করুন যে একবার অ্যাসিঙ্ক এবং সার্বজনীন হয়ে ওঠার অপেক্ষায় রয়েছে সিঙ্ক কলগুলি অবশেষে অবমূল্যায়ন হয়ে উঠবে (অন্যথায় আপনাকে এগুলি সর্বত্র নির্ধারণ করতে হবে এবং শৃঙ্খলাবদ্ধতা ঠিক যেমন অ্যাসিঙ্ককে সত্যই অর্থহীন করে তুলবে)।