it-swarm.dev

Node.js التحقق من وجود الملف

كيف يمكنني التحقق من وجود ملف ؟

في وثائق الوحدة fs يوجد وصف للطريقة fs.exists(path, callback) . ولكن ، كما فهمت ، فإنه يتحقق من وجود الدلائل فقط. ولست بحاجة للتحقق من ملف !

كيف يمكن القيام بذلك؟

120
RomanGorbatko

لماذا لا تحاول فقط فتح الملف؟ 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 
} 

للحصول على Node.js v0.12.x وأعلى

تم إهمال كل من path.exists و fs.exists

*تصحيح:

تم التغيير: else if(err.code == 'ENOENT')

إلى: else if(err.code === 'ENOENT')

يشتكي Linter من عدم المساواة المزدوجة في كونه متساويًا الثلاثي.

باستخدام 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);
    }
});
206
Fox

أسهل طريقة للقيام بذلك بشكل متزامن.

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

يوضح مستند API كيف تعمل existsSync:
اختبار ما إذا كان المسار المحدد موجودًا أم لا عن طريق التحقق من نظام الملفات.

46
Paul Ho

قد يكون البديل لـ stat يستخدم fs.access(...) :

وظيفة الوعد القصير المصغر للفحص:

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

استخدام عينة:

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

طريقة الوعد الموسعة:

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

أو إذا كنت تريد أن تفعل ذلك بشكل متزامن:

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

يتم الآن إهمال fs.exists(path, callback) و fs.existsSync(path) ، راجع https://nodejs.org/api/fs.html#fs_fs_exists_path_callback and 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 ، وإلا فسيتم إلقاء خطأ سيتم التقاطه بواسطة عبارة try/catch.

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.");
}
18
lmeurs

الإصدار القديم قبل V6: إليك الوثائق

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

UPDATE

إصدارات جديدة من V6: وثائق fs.stat

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

تم إهمال fs.exists منذ 1.0.0. يمكنك استخدام fs.stat بدلاً من ذلك.

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

هنا هو الرابط للوثائق fs.stats

7
Koushik Das

@ فوكس: إجابة رائعة! إليك بعض الامتداد مع بعض الخيارات الأخرى. هذا ما كنت أستخدمه مؤخرًا كحل بديل:

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.'
  );


}

ملاحظة تحقق من الخدمات الإضافية إذا لم تكن تستخدمها بالفعل - إنها حلوة جدًا. https://github.com/jprichardson/node-fs-extra )

5
mikermcneil

هناك الكثير من التعليقات غير الدقيقة حول fs.existsSync() يجري إهمالها ؛ ليس.

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

لاحظ أنه تم إهمال fs.exists () ، لكن fs.existsSync () غير مهم.

4
chrisw

إصدار async/await باستخدام util.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);
    }
  });
});
3
Alexander Zeitler
  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
D.Belda

بعد قليل من التجربة ، وجدت المثال التالي باستخدام 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 الوعد الخطأ نفسه.

2
f1lt3r

حسنًا ، لقد فعلت ذلك بهذه الطريقة ، كما هو موضح في 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');
  }
});

هل هناك أي مشكلة مع هذا؟

1
nthapa

vannilla Nodejs رد الاتصال

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

the docs say عليك استخدام access() كبديل عن exists() المهملة

Nodejs مع بناء وعد (عقدة 7+)

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

إطار جافا سكريبت الشعبي

fs-extra

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

كما ترى أبسط بكثير. والميزة على الوعد هو أن لديك كتابات كاملة مع هذه الحزمة (intellisense/TypeScript كاملة)! معظم الحالات التي قمت بتضمينها بالفعل هذه المكتبة لأن (+ -10.000) مكتبات أخرى تعتمد عليها.

0
Joel Harkes

يمكنك استخدام fs.stat للتحقق مما إذا كان الهدف عبارة عن ملف أو دليل ويمكنك استخدام fs.access للتحقق مما إذا كان يمكنك كتابة/قراءة/تنفيذ الملف. (تذكر أن تستخدم path.resolve للحصول على المسار الكامل للهدف)

كابل بيانات:

المثال الكامل (TypeScript)

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
BrunoLM

في الأيام الخوالي قبل الجلوس ، أتحقق دائمًا مما إذا كان الكرسي هناك ، ثم أجلس آخر ، لدي خطة بديلة مثل الجلوس على مدرب. الآن اقترح موقع node.js اذهب فقط (لا حاجة للتحقق) والإجابة تبدو كما يلي:

    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/understanding-error-first-callbacks-in-node-js/ من مارس 2014 ، وتعديله طفيفًا ليناسب الكمبيوتر. إنه يبحث عن إذن أيضًا - قم بإزالة إذن اختبار chmod a-r foo.txt

0
user2167003