নোড.জেএস পরীক্ষা করে পাথ ফাইল বা ডিরেক্টরি কিনা


379

আমি এমন কোনও অনুসন্ধানের ফলাফল পেয়েছি বলে মনে হচ্ছে না যা এটি কীভাবে করতে হয় তা ব্যাখ্যা করে।

আমি যা করতে চাই তা প্রদত্ত পাথটি কোনও ফাইল বা ডিরেক্টরি (ফোল্ডার) কিনা তা জানতে সক্ষম।

উত্তর:


609

fs.lstatSync(path_string).isDirectory()আপনাকে বলা উচিত। ডক্স থেকে :

Fs.stat () এবং fs.lstat () থেকে ফিরে আসা বস্তুগুলি এই ধরণের।

stats.isFile()
stats.isDirectory()
stats.isBlockDevice()
stats.isCharacterDevice()
stats.isSymbolicLink() (only valid with fs.lstat())
stats.isFIFO()
stats.isSocket()

বিঃদ্রঃ:

সমাধান উপরে হবে throwএকটি Errorযদি; প্রাক্তন জন্য, না fileবা directoryবিদ্যমান নেই।

যদি আপনি কোনও মতামত চান trueবা নীচে চান তবে নীচের মন্তব্যে জোসেফের দ্বারা বর্ণিত falseচেষ্টা করুন fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();


18
মনে রাখবেন যে অ্যাসিক্রোনাস সংস্করণটি সাধারণত আপনি সাধারণ অ্যাপ্লিকেশন কর্মক্ষমতা সম্পর্কে যত্নশীল হলে সাধারণত পছন্দনীয়।
অ্যালেক্সএমএ

45
মনে রাখবেন যে ডিরেক্টরি বা ফাইল উপস্থিত না থাকলে আপনি ত্রুটি ফিরে পেয়ে যাবেন।
ইথান মিক

9
let isDirExists = fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();
জোসেফ হারুশ

মনে রাখবেন যে ফাইল বা ডিরেক্টরি উপস্থিত না থাকলে এটি ব্যতিক্রম ছুঁড়ে ফেলবে যা ধরতে হবে অন্যথায় এটি অস্বাভাবিক প্রস্থান করতে পারে।
সের্গেই কুজনেটসভ

59

আপডেট: নোড.জেস> = 10

আমরা নতুন fs.promises API ব্যবহার করতে পারি

const fs = require('fs').promises;

(async() => {
    const stat = await fs.lstat('test.txt');
    console.log(stat.isFile());
})().catch(console.error)

যে কোনও নোড.জেএস সংস্করণ

এখানে আপনি কীভাবে সনাক্ত করতে পারবেন যে কোনও পথ কোনও ফাইল বা ডিরেক্টরি অ্যাসিক্রোনোনালিভাবে হয় , যা নোডের প্রস্তাবিত পদ্ধতির। fs.lstat ব্যবহার করে

const fs = require("fs");

let path = "/path/to/something";

fs.lstat(path, (err, stats) => {

    if(err)
        return console.log(err); //Handle error

    console.log(`Is file: ${stats.isFile()}`);
    console.log(`Is directory: ${stats.isDirectory()}`);
    console.log(`Is symbolic link: ${stats.isSymbolicLink()}`);
    console.log(`Is FIFO: ${stats.isFIFO()}`);
    console.log(`Is socket: ${stats.isSocket()}`);
    console.log(`Is character device: ${stats.isCharacterDevice()}`);
    console.log(`Is block device: ${stats.isBlockDevice()}`);
});

সিঙ্ক্রোনাস এপিআই ব্যবহার করার সময় নোট করুন:

সিঙ্ক্রোনাস ফর্ম ব্যবহার করার সাথে সাথে কোনও ব্যতিক্রম তত্ক্ষণাত নিক্ষেপ করা হয়। আপনি ব্যতিক্রমগুলি পরিচালনা করতে চেষ্টা করতে / ধরতে বা তাদের বুদ্বুদ করতে অনুমতি দিতে পারেন।

try{
     fs.lstatSync("/some/path").isDirectory()
}catch(e){
   // Handle error
   if(e.code == 'ENOENT'){
     //no such file or directory
     //do something
   }else {
     //do something else
   }
}

এটি কি এখনও ২০২০ সালের মার্চ হিসাবে পরীক্ষামূলক হিসাবে বিবেচিত হয়? আমরা কোথায় দেখতে পারেন? - উফ আমি যখন দেখি উপরের লিঙ্কটি এখন স্থিতিশীল হয় (এটি আর পরীক্ষামূলকভাবে বোঝায় না)।
আলফ্রিমা

20

সিরিয়াসলি, প্রশ্নটি পাঁচ বছর বিদ্যমান এবং কোনও সুন্দর মুখোশ নেই?

function is_dir(path) {
    try {
        var stat = fs.lstatSync(path);
        return stat.isDirectory();
    } catch (e) {
        // lstatSync throws an error if path doesn't exist
        return false;
    }
}

14

আপনার প্রয়োজনের উপর নির্ভর করে আপনি সম্ভবত নোডের pathমডিউলটির উপর নির্ভর করতে পারেন ।

আপনি ফাইল সিস্টেমে আঘাত করতে সক্ষম হবেন না (উদাহরণস্বরূপ ফাইলটি এখনও তৈরি হয়নি) এবং tbh আপনি সম্ভবত অতিরিক্ত সিস্টেমের সত্যতা প্রয়োজন না হলে আপনি সম্ভবত ফাইল সিস্টেমে আঘাত করা এড়াতে চান। আপনি যদি অনুমান করতে পারেন যে আপনি নীচের .<extname>ফর্ম্যাটটির জন্য যা যাচাই করছেন , কেবল নামটি দেখুন।

স্পষ্টতই যদি আপনি কোনও নাম ছাড়াই একটি ফাইল সন্ধান করছেন তবে আপনার অবশ্যই নিশ্চিত হওয়ার জন্য ফাইল সিস্টেমটিকে আঘাত করতে হবে। তবে আপনার আরও জটিল হওয়ার প্রয়োজন পর্যন্ত এটিকে সহজ রাখুন।

const path = require('path');

function isFile(pathItem) {
  return !!path.extname(pathItem);
}

2
স্পষ্টতই এটি সমস্ত পরিস্থিতিতে কাজ করবে না তবে আপনি যদি প্রয়োজনীয় অনুমানগুলি করতে পারেন তবে অন্যান্য উত্তরের তুলনায় এটি অনেক দ্রুত এবং সহজ।
electrovir

1

উপরের উত্তরগুলি পরীক্ষা করে যে কোনও ফাইলসিস্টেমটিতে এমন কোনও পথ রয়েছে যা কোনও ফাইল বা ডিরেক্টরি। তবে এটি চিহ্নিত করা যায় না যে প্রদত্ত পাথটি একা কোনও ফাইল বা ডিরেক্টরি।

উত্তরটি হ'ল "/" ব্যবহার করে ডিরেক্টরি ভিত্তিক পাথ চিহ্নিত করা identify লাইক -> "/ সি / ডস / রান /"। <- পিছনের সময়কাল।

কোনও ডিরেক্টরি বা ফাইলের পথের মতো যা এখনও লেখা হয়নি। বা অন্য একটি কম্পিউটার থেকে পাথ। বা এমন একটি পথ যেখানে একই নামের ফাইল এবং ডিরেক্টরি উভয়ই বিদ্যমান।

// /tmp/
// |- dozen.path
// |- dozen.path/.
//    |- eggs.txt
//
// "/tmp/dozen.path" !== "/tmp/dozen.path/"
//
// Very few fs allow this. But still. Don't trust the filesystem alone!

// Converts the non-standard "path-ends-in-slash" to the standard "path-is-identified-by current "." or previous ".." directory symbol.
function tryGetPath(pathItem) {
    const isPosix = pathItem.includes("/");
    if ((isPosix && pathItem.endsWith("/")) ||
        (!isPosix && pathItem.endsWith("\\"))) {
        pathItem = pathItem + ".";
    }
    return pathItem;
}
// If a path ends with a current directory identifier, it is a path! /c/dos/run/. and c:\dos\run\.
function isDirectory(pathItem) {
    const isPosix = pathItem.includes("/");
    if (pathItem === "." || pathItem ==- "..") {
        pathItem = (isPosix ? "./" : ".\\") + pathItem;
    }
    return (isPosix ? pathItem.endsWith("/.") || pathItem.endsWith("/..") : pathItem.endsWith("\\.") || pathItem.endsWith("\\.."));
} 
// If a path is not a directory, and it isn't empty, it must be a file
function isFile(pathItem) {
    if (pathItem === "") {
        return false;
    }
    return !isDirectory(pathItem);
}

নোড সংস্করণ: v11.10.0 - ফেব্রুয়ারী 2019

শেষ চিন্তা: এমনকি ফাইল সিস্টেমে আঘাত কেন?


1

এখানে আমি ব্যবহার করি একটি ফাংশন। এই পোস্টে কেউই এর ব্যবহার promisifyawait/asyncবৈশিষ্ট্য ব্যবহার করছে না তাই ভেবেছিলাম ভাগ করে নেব।

const promisify = require('util').promisify;
const lstat = promisify(require('fs').lstat);

async function isDirectory (path) {
  try {
    return (await lstat(path)).isDirectory();
  }
  catch (e) {
    return false;
  }
}

দ্রষ্টব্য: আমি require('fs').promises;এটি ব্যবহার করি না কারণ এটি এখন এক বছরের জন্য পরীক্ষামূলক, এটির উপর নির্ভর না করাই ভাল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.