নোড.জেএস ফাইল পরীক্ষা করে দেখুন কিনা


143

আমি কীভাবে কোনও ফাইলের অস্তিত্ব পরীক্ষা করব ?

মডিউলটির জন্য ডকুমেন্টেশনে fsপদ্ধতিটির বিবরণ রয়েছে fs.exists(path, callback)। তবে, আমি যেমন বুঝতে পেরেছি, এটি কেবল ডিরেক্টরিগুলির অস্তিত্বের জন্য পরীক্ষা করে। এবং আমার ফাইলটি পরীক্ষা করা দরকার !

কিভাবে এই কাজ করা যেতে পারে?


3
2018 হিসাবে, ব্যবহার করুন fs.access('file', err => err ? 'does not exist' : 'exists'), fs.access দেখুন
এমবি 21

উত্তর:


227

শুধু ফাইল খোলার চেষ্টা করবেন না কেন? fs.open('YourFile', 'a', function (err, fd) { ... }) যাইহোক এক মিনিটের অনুসন্ধানের পরে চেষ্টা করুন:

var path = require('path'); 

path.exists('foo.txt', function(exists) { 
  if (exists) { 
    // do something 
  } 
}); 

// or 

if (path.existsSync('foo.txt')) { 
  // do something 
} 

নোড.জেএস এর জন্য v0.12.x এবং উচ্চতর

উভয়ই path.existsএবং fs.existsহতাশ হয়েছে

* সম্পাদনা করুন:

পরিবর্তিত: else if(err.code == 'ENOENT')

প্রতি: else if(err.code === 'ENOENT')

লিন্টার দ্বিগুণ সমান ট্রিপল সমান না হওয়ার বিষয়ে অভিযোগ করে।

Fs.stat ব্যবহার:

fs.stat('foo.txt', function(err, stat) {
    if(err == null) {
        console.log('File exists');
    } else if(err.code === 'ENOENT') {
        // file does not exist
        fs.writeFile('log.txt', 'Some log\n');
    } else {
        console.log('Some other error: ', err.code);
    }
});

1
কিন্তু, এটি পরিণত হিসাবে, fs.existsখুব কাজ করে। ফাইলটিতে অনুমতি নিয়ে আমার সমস্যা হয়েছে।
রোমানগোর্বাটਕੋ

11
path.existsআসলে fs.exists
অনুকৃত হয়

42
এখনই যে কেউ এটি পড়ছেন (Node.js v0.12.x) তা মনে রাখবেন fs.existsএবং অবহেলা fs.existsSyncকরা হয়েছে। ফাইলের অস্তিত্ব যাচাই করার সর্বোত্তম উপায় হ'ল fs.statউপরের মত ডেমোড।
এন্ট্রিকশ

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

6
@ আন্তরিকীক্ষা fs.existsSyncআর চিত্রিত হয় না, যদিও fs.existsএখনও রয়েছে।
রায়ানজিম

52

এটি সুসংগতভাবে করার সহজ উপায়।

if (fs.existsSync('/etc/file')) {
    console.log('Found file');
}

এপিআই ডকটি কীভাবে existsSyncকাজ করে:
ফাইল সিস্টেমটি পরীক্ষা করে প্রদত্ত পাথটি বিদ্যমান কিনা তা পরীক্ষা করুন।


12
fs.existsSync(path)এখন অবহিত করা হয়েছে, দেখুন নোডেজেএস.আর । / অ্যাপি / এফএসhtml#fs_fs_existssync_path । একটি সমকালীন বাস্তবায়নের fs.statSync(path)জন্য পরামর্শ দেওয়া হচ্ছে, আমার উত্তর দেখুন।
lmeurs

20
@ আইমারস কিন্তু নোডেজ.এস.পি / পিপিএস / এসটিএমটিএল # fs_fs_existssync_path বলেছেন: নোট করুন যে fs.exists () অবমূল্যায়িত হয়েছে, তবে fs.existsSync () নয়।
3

9
fs.existsSyncঅবচিত করা হয়েছিল, তবে এটি আর নেই।
রায়ানজিম

44

সম্পাদনা করুন: নোডের পরে v10.0.0আমরা ব্যবহার করতে পারিfs.promises.access(...)

ফাইল বিদ্যমান আছে কিনা তা যাচাই করে এমন অ্যাসিঙ্ক কোডের উদাহরণ:

async function checkFileExists(file) {
  return fs.promises.access(file, fs.constants.F_OK)
           .then(() => true)
           .catch(() => false)
}

স্ট্যাটের কোনও বিকল্প নতুন ব্যবহার করতে পারে fs.access(...):

পরীক্ষার জন্য সংক্ষিপ্ত প্রতিশ্রুতি ফাংশন:

s => new Promise(r=>fs.access(s, fs.constants.F_OK, e => r(!e)))

নমুনা ব্যবহার:

let checkFileExists = s => new Promise(r=>fs.access(s, fs.constants.F_OK, e => r(!e)))
checkFileExists("Some File Location")
  .then(bool => console.logfile exists: ${bool}´))

বর্ধিত প্রতিশ্রুতি উপায়:

// returns a promise which resolves true if file exists:
function checkFileExists(filepath){
  return new Promise((resolve, reject) => {
    fs.access(filepath, fs.constants.F_OK, error => {
      resolve(!error);
    });
  });
}

অথবা আপনি যদি এটি একযোগে করতে চান:

function checkFileExistsSync(filepath){
  let flag = true;
  try{
    fs.accessSync(filepath, fs.constants.F_OK);
  }catch(e){
    flag = false;
  }
  return flag;
}

1
উত্সাহিত, নোড.জেএস
তে

1
হ্যাঁ এটি ফাইলের উপস্থিতি এবং পরে ম্যানিপুলেশন প্রত্যাশিত নয় তা খতিয়ে দেখার জন্য এটি সরকারী প্রস্তাবিত পদ্ধতি। অন্যথায় খুলুন / লিখুন / পড়ুন এবং ত্রুটিটি পরিচালনা করুন। nodejs.org/api/fs.html#fs_fs_stat_path_callback
জাস্টিন

1
ডকুমেন্টেশনে আমি দেখতে পেয়েছি fs.constants.F_OKইত্যাদি। এগুলি কি তাদের মতো অ্যাক্সেস করাও সম্ভব fs.F_OK? রহস্যময়। এছাড়াও পরিশ্রম, যা দুর্দান্ত।
স্যামসন

1
fs.promises.access(path, fs.constants.F_OK);এটি প্রতিশ্রুতি তৈরির পরিবর্তে কেবল একটি প্রতিশ্রুতি হিসাবে তৈরি করার চেষ্টা করে ।
জেরেমি ট্রপকা

18

fs.exists(path, callback)এবং fs.existsSync(path)এখন অবহেলিত হয়েছে, https://nodejs.org/api/fs.html#fs_fs_exists_path_callback এবং https://nodejs.org/api/fs.html#fs_fs_existssync_path দেখুন

একটি ফাইলের অস্তিত্ব পরীক্ষা করার জন্য সিঙ্ক্রোনস করে কেউ ব্যবহার করতে পারে যেমন। fs.statSync(path)fs.Statsফাইল উপস্থিত থাকলে কোনও বস্তু ফিরে আসবে, https://nodejs.org/api/fs.html#fs_class_fs_stats দেখুন , অন্যথায় একটি ত্রুটি নিক্ষেপ করা হয়েছে যা চেষ্টা / ধরার বিবৃতি দ্বারা ধরা হবে।

var fs = require('fs'),
  path = '/path/to/my/file',
  stats;

try {
  stats = fs.statSync(path);
  console.log("File exists.");
}
catch (e) {
  console.log("File does not exist.");
}

10
আপনি fs.existsync এর জন্য সরবরাহিত লিঙ্কটি পরিষ্কারভাবে উল্লেখ করেছে যে এটি অবহেলা করা হয়নি "নোট করুন fs.exists () অবচয় করা হয়েছে, তবে fs.existsSync () নেই not অন্যান্য নোড.জেএস কলব্যাকের সাথে। fs.existsSync () কলব্যাক ব্যবহার করে না)) "
শ্রাদ্ধিশ

প্রথম (শীর্ষ থেকে) উত্তর, যা উল্লেখ করেছে যে fsচলকটি কোথা থেকে আসে
দিমিত্রি করোলিওভ

এই উত্তরটি লেখার সময় তথ্যটি সঠিক ছিল; যাইহোক, fs.existsSync()আর হ্রাস করা হয় না।
রায়ানজিম

12

ভি 6 এর পূর্বে পুরানো সংস্করণ: এখানে ডকুমেন্টেশন রয়েছে

  const fs = require('fs');    
  fs.exists('/etc/passwd', (exists) => {
     console.log(exists ? 'it\'s there' : 'no passwd!');
  });
// or Sync

  if (fs.existsSync('/etc/passwd')) {
    console.log('it\'s there');
  }

হালনাগাদ

ভি 6 থেকে নতুন সংস্করণ: এর জন্য ডকুমেন্টেশনfs.stat

fs.stat('/etc/passwd', function(err, stat) {
    if(err == null) {
        //Exist
    } else if(err.code == 'ENOENT') {
        // NO exist
    } 
});

1
উভয়ই fs.existsএবং fs.existsSyncআপনার ভাগ করা লিংক অনুসারে হ্রাস করা হয়।
অ্যান্ডি

existsSyncসেই দস্তাবেজ অনুসারে অবনমিত হয় না, আপনি যখন এটি পড়তেন তখন হতে পারে।
দর্পণ

11

আধুনিক অ্যাসিঙ্ক / অপেক্ষা করার উপায় (নোড 12.8.x)

const fileExists = async path => !!(await fs.promises.stat(path).catch(e => false));

const main = async () => {
    console.log(await fileExists('/path/myfile.txt'));
}

main();

আমাদের ব্যবহার করা দরকার fs.stat() or fs.access()কারণ fs.exists(path, callback)এখন হ্রাস করা হয়েছে

আর একটি ভাল উপায় fs- অতিরিক্ত


7

fs.exists০.০.০.০ থেকে অবহেলা করা হয়েছে। আপনি তার fs.statপরিবর্তে ব্যবহার করতে পারেন ।

var fs = require('fs');
fs.stat(path, (err, stats) => {
if ( !stats.isFile(filename) ) { // do this 
}  
else { // do this 
}});

ডকুমেন্টেশন fs.stats এর লিঙ্কটি এখানে


stats.isFile()প্রয়োজন নেই filename
ওয়াটওয়ার

6

@ ফক্স: দুর্দান্ত উত্তর! এখানে আরও কিছু বিকল্প সহ কিছুটা এক্সটেনশান দেওয়া হয়েছে। এটি আমি যেতে যাওয়ার সমাধান হিসাবে ইদানীং ব্যবহার করেছি:

var fs = require('fs');

fs.lstat( targetPath, function (err, inodeStatus) {
  if (err) {

    // file does not exist-
    if (err.code === 'ENOENT' ) {
      console.log('No file or directory at',targetPath);
      return;
    }

    // miscellaneous error (e.g. permissions)
    console.error(err);
    return;
  }


  // Check if this is a file or directory
  var isDirectory = inodeStatus.isDirectory();


  // Get file size
  //
  // NOTE: this won't work recursively for directories-- see:
  // http://stackoverflow.com/a/7550430/486547
  //
  var sizeInBytes = inodeStatus.size;

  console.log(
    (isDirectory ? 'Folder' : 'File'),
    'at',targetPath,
    'is',sizeInBytes,'bytes.'
  );


}

PS যদি আপনি ইতিমধ্যে এটি ব্যবহার না করে থাকেন তবে fs-অতিরিক্ত দেখুন it's এটি বেশ মিষ্টি pretty https://github.com/jprichardson/node-fs-extra )


6

অবহেলিত fs.existsSync()হওয়ার বিষয়ে অনেকগুলি ভুল মন্তব্য রয়েছে ; এইটা না.

https://nodejs.org/api/fs.html#fs_fs_existssync_path

নোট করুন যে fs.exists () অবচয় করা হয়েছে, কিন্তু fs.existsSync () নয়।


3

async/awaitutil.promisifyনোড 8 হিসাবে সংস্করণ ব্যবহার করে :

const fs = require('fs');
const { promisify } = require('util');
const stat = promisify(fs.stat);

describe('async stat', () => {
  it('should not throw if file does exist', async () => {
    try {
      const stats = await stat(path.join('path', 'to', 'existingfile.txt'));
      assert.notEqual(stats, null);
    } catch (err) {
      // shouldn't happen
    }
  });
});

describe('async stat', () => {
  it('should throw if file does not exist', async () => {
    try {
      const stats = await stat(path.join('path', 'to', 'not', 'existingfile.txt'));
    } catch (err) {
      assert.notEqual(err, null);
    }
  });
});

2
  fs.statSync(path, function(err, stat){
      if(err == null) {
          console.log('File exists');
          //code when all ok
      }else if (err.code == "ENOENT") {
        //file doesn't exist
        console.log('not file');

      }
      else {
        console.log('Some other error: ', err.code);
      }
    });

2

কিছুটা পরীক্ষা-নিরীক্ষার পরে, আমি নীচের উদাহরণটি খুঁজে পেয়েছি fs.statঅসমর্থিতভাবে কোনও ফাইলের উপস্থিতি আছে কিনা তা যাচাই করার একটি ভাল উপায়। এটিও পরীক্ষা করে যে আপনার "ফাইল" "সত্যই একটি ফাইল" (এবং ডিরেক্টরি নয়)।

এই পদ্ধতিটি প্রতিশ্রুতি ব্যবহার করে ধরে নিয়েছে যে আপনি একটি অ্যাসিক্রোনাস কোডবেস নিয়ে কাজ করছেন:

const fileExists = path => {
  return new Promise((resolve, reject) => {
    try {
      fs.stat(path, (error, file) => {
        if (!error && file.isFile()) {
          return resolve(true);
        }

        if (error && error.code === 'ENOENT') {
          return resolve(false);
        }
      });
    } catch (err) {
      reject(err);
    }
  });
};

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


1

ভাল আমি এটি এইভাবে করেছি, যেমন https://nodejs.org/api/fs.html#fs_fs_access_path_mode_callback এ দেখা গেছে

fs.access('./settings', fs.constants.F_OK | fs.constants.R_OK | fs.constants.W_OK, function(err){
  console.log(err ? 'no access or dir doesnt exist' : 'R/W ok');

  if(err && err.code === 'ENOENT'){
    fs.mkdir('settings');
  }
});

এ নিয়ে কি কোন সমস্যা আছে?


0

পুরানো দিনগুলিতে বসার আগে আমি সর্বদা পরীক্ষা করে রাখি যে চেয়ার আছে কিনা তবে আমি বসে থাকি অন্যথায় আমার কাছে বিকল্প পরিকল্পনা আছে কোচের উপর বসার মতো। এখন নোড.জেএস সাইটের পরামর্শ দেয় কেবল যান (চেক করার দরকার নেই) এবং উত্তরটি এর মতো দেখাচ্ছে:

    fs.readFile( '/foo.txt', function( err, data )
    {
      if(err) 
      {
        if( err.code === 'ENOENT' )
        {
            console.log( 'File Doesn\'t Exist' );
            return;
        }
        if( err.code === 'EACCES' )
        {
            console.log( 'No Permission' );
            return;
        }       
        console.log( 'Unknown Error' );
        return;
      }
      console.log( data );
    } );

মার্চ ২০১৪ থেকে http://fredkschott.com/post/2014/03/unders سمج-error-first-callbacks-in-node-js/ থেকে কোড নেওয়া হয়েছে এবং কম্পিউটারে ফিট করার জন্য কিছুটা পরিবর্তন করা হয়েছে। এটি পাশাপাশি অনুমতিও পরীক্ষা করে - পরীক্ষার জন্য অনুমতি সরান removechmod a-r foo.txt


0

ভ্যানিলা নোডেজ কলব্যাক

function fileExists(path, cb){
  return fs.access(path, fs.constants.F_OK,(er, result)=> cb(!err && result)) //F_OK checks if file is visible, is default does no need to be specified.
}

ডক্স বলে ব্যবহার করা উচিত access()পরিবর্তে অবচিত জন্যexists()

প্রতিশ্রুতি সহ নোডেজ (নোড 7+)

function fileExists(path, cb){
  return new Promise((accept,deny) => 
    fs.access(path, fs.constants.F_OK,(er, result)=> cb(!err && result))
  );
}

জনপ্রিয় জাভাস্ক্রিপ্ট ফ্রেমওয়ার্ক

FS-অতিরিক্ত

var fs = require('fs-extra')
await fs.pathExists(filepath)

আপনি দেখতে অনেক সহজ। এবং প্রতিশ্রুতি দেওয়ার সুবিধাটি হ'ল এই প্যাকেজটির সাথে আপনার সম্পূর্ণ টাইপিং রয়েছে (সম্পূর্ণ ইন্টেলিজেন্স / টাইপসক্রিপ্ট)! বেশিরভাগ ক্ষেত্রে আপনি ইতিমধ্যে এই লাইব্রেরিটি অন্তর্ভুক্ত করবেন কারণ (+ -10.000) অন্যান্য গ্রন্থাগার এটির উপর নির্ভর করে।


0

আপনি ব্যবহার করতে পারেন fs.statএবং যদি লক্ষ্য একটি ফাইল বা ডিরেক্টরির কিনা চেক করতে আপনি ব্যবহার করতে পারেন fs.accessযদি আপনি লিখতে পারেন পরীক্ষা / পড়া / ফাইল চালানো। ( path.resolveলক্ষ্য জন্য পুরো পথ পেতে ব্যবহার মনে রাখবেন )

ডকুমেন্টেশন:

সম্পূর্ণ উদাহরণ (টাইপস্ক্রিপ্ট)

import * as fs from 'fs';
import * as path from 'path';

const targetPath = path.resolve(process.argv[2]);

function statExists(checkPath): Promise<fs.Stats> {
  return new Promise((resolve) => {
    fs.stat(checkPath, (err, result) => {
      if (err) {
        return resolve(undefined);
      }

      return resolve(result);
    });
  });
}

function checkAccess(checkPath: string, mode: number = fs.constants.F_OK): Promise<boolean> {
  return new Promise((resolve) => {
    fs.access(checkPath, mode, (err) => {
      resolve(!err);
    });
  });
}

(async function () {
  const result = await statExists(targetPath);
  const accessResult = await checkAccess(targetPath, fs.constants.F_OK);
  const readResult = await checkAccess(targetPath, fs.constants.R_OK);
  const writeResult = await checkAccess(targetPath, fs.constants.W_OK);
  const executeResult = await checkAccess(targetPath, fs.constants.X_OK);
  const allAccessResult = await checkAccess(targetPath, fs.constants.F_OK | fs.constants.R_OK | fs.constants.W_OK | fs.constants.X_OK);

  if (result) {
    console.group('stat');
    console.log('isFile: ', result.isFile());
    console.log('isDir: ', result.isDirectory());
    console.groupEnd();
  }
  else {
    console.log('file/dir does not exist');
  }

  console.group('access');
  console.log('access:', accessResult);
  console.log('read access:', readResult);
  console.log('write access:', writeResult);
  console.log('execute access:', executeResult);
  console.log('all (combined) access:', allAccessResult);
  console.groupEnd();

  process.exit(0);
}());

0

অ্যাসিঙ্ক্রোনাস সংস্করণের জন্য! এবং প্রতিশ্রুতি সংস্করণ সহ! এখানে পরিষ্কার সহজ উপায়!

try {
    await fsPromise.stat(filePath);
    /**
     * File exists!
     */
    // do something
} catch (err) {
    if (err.code = 'ENOENT') {
        /**
        * File not found
        */
    } else {
        // Another error!
    }
}

আরও ভাল চিত্রিত করার জন্য আমার কোড থেকে আরও ব্যবহারিক স্নিপেট:


try {
    const filePath = path.join(FILES_DIR, fileName);
    await fsPromise.stat(filePath);
    /**
     * File exists!
     */
    const readStream = fs.createReadStream(
        filePath,
        {
            autoClose: true,
            start: 0
        }
    );

    return {
        success: true,
        readStream
    };
} catch (err) {
    /**
     * Mapped file doesn't exists
     */
    if (err.code = 'ENOENT') {
        return {
            err: {
                msg: 'Mapped file doesn\'t exists',
                code: EErrorCode.MappedFileNotFound
            }
        };
    } else {
        return {
            err: {
                msg: 'Mapped file failed to load! File system error',
                code: EErrorCode.MappedFileFileSystemError
            }
        }; 
   }
}

উপরের উদাহরণটি কেবল প্রদর্শনের জন্য! আমি পড়ার স্ট্রিমের ত্রুটি ইভেন্টটি ব্যবহার করতে পারতাম! কোনও ত্রুটি ধরা! এবং দুটি কল এড়িয়ে যান!

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