Node.jsはファイルが存在するかどうかを確認します


143

ファイルの存在を確認するにはどうすればよいですか?

モジュールのドキュメントにfsは、メソッドの説明がありfs.exists(path, callback)ます。しかし、私が理解しているように、ディレクトリのみの存在をチェックします。そして、私はファイルをチェックする必要があります

これはどのように行うことができますか?


3
2018年現在、を使用。fs.accessをfs.access('file', err => err ? 'does not exist' : 'exists')参照
mb21

回答:


227

ファイルを開いてみませんか?fs.open('YourFile', 'a', function (err, fd) { ... }) とにかく、1分検索した後、これを試してください:

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.existsfs.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うまくいきます。ファイルへのアクセス権に問題がありました。
RomanGorbatko 2013

11
path.exists実際には非推奨ですfs.exists
Arnaud Rinquin '26年

42
これを読んでいる人(Node.js v0.12.x)は、この点に留意しfs.existsfs.existsSync非推奨になっています。fs.stat上記でデモしたように、ファイルの存在を確認する最良の方法はです。
Antrikshy 2015年

8
Node jsのドキュメントから、ファイルの存在を確認した後でファイルを開く予定の場合、実際にそれを開いてエラーが存在しない場合はそれを処理するのが最善の方法のようです。存在チェックとオープン機能の間でファイルが削除される可能性があるため
newprog

6
@Antrikshy fs.existsSyncは、現在のところ、値下げされていませんfs.exists
RyanZim 2017年

52

これを同期的に行う簡単な方法。

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

API docはどのようにexistsSync機能するかを示しています:
ファイルシステムをチェックして、指定されたパスが存在するかどうかをテストします。


12
fs.existsSync(path)は現在非推奨です。nodejs.org/ api / fs.htmlfs_fs_existssync_pathを参照してください。同期実装fs.statSync(path)が推奨される場合は、私の回答を参照してください。
lmeurs

20
@Imeursだがnodejs.org/api/fs.html#fs_fs_existssync_path言う:fs.exists()は非推奨ですが、fs.existsSync()は非推奨です。
HaveF 2016

9
fs.existsSync廃止されましたが、廃止されました。
RyanZim 2017年

44

編集: ノードv10.0.0を使用できるためfs.promises.access(...)

ファイルが存在するかどうかを確認する非同期コードの例:

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

statの代わりにnewを使用することもできます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
これは間違いなく、Node.jsにファイルが存在するかどうかを検出する最も最近の(2018)方法です
AKMorris

1
はい、これはファイルが存在し、その後の操作が予期されていないかどうかを簡単に確認するための公式の推奨方法です。それ以外の場合は、open / write / readを使用してエラーを処理します。nodejs.org/api/fs.html#fs_fs_stat_path_callback
Justin

1
私が見つけたドキュメントfs.constants.F_OKなど。それらにアクセスすることも可能fs.F_OKですか?変だ。また、簡潔です。
samson

1
fs.promises.access(path, fs.constants.F_OK);プロミスを作成するのではなく、単にプロミスにするためにそれを試すことができます
Jeremy Trpka

18

fs.exists(path, callback)そしてfs.existsSync(path)今、廃止され、参照https://nodejs.org/api/fs.html#fs_fs_exists_path_callbackhttps://nodejs.org/api/fs.html#fs_fs_existssync_pathを

ファイルの存在を同期的にテストするには、ieを使用できます。fs.statSync(path)fs.Statsファイルが存在する場合、オブジェクトが参照、返されますhttps://nodejs.org/api/fs.html#fs_class_fs_statsをのtry / catch文でcatchedされるそれ以外の場合はエラーがスローされ、。

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()は非推奨です。(fs.exists()へのコールバックパラメータは、矛盾するパラメータを受け入れます他のNode.jsコールバックを使用します。fs.existsSync()はコールバックを使用しません。) "
シュレッディッシュ

最初からの(上からの)回答、fs変数の
出所

この回答が書かれた時点では、情報は正しいものでした。ただし、fs.existsSync()廃止されなくなりました。
RyanZim 2017年

12

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

更新

V6の新しいバージョン:のドキュメントfs.stat

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

1
fs.existsfs.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-extraです


7

fs.exists1.0.0から廃止されました。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
Wtower 2016

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-extraをチェックしてください。 https://github.com/jprichardson/node-fs-extra



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すると、ファイルが存在するかどうかを非同期で確認するのに適した方法であることが。また、「ファイル」が「実際にはファイルである」(ディレクトリではない)ことも確認します。

このメソッドはPromiseを使用しますが、非同期コードベースで作業していることを前提としています。

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。ファイルが存在し、それがディレクトリである場合、is resolves trueです。ファイルを読み取ろうとするエラーrejectは、エラー自体を約束します。



0

昔は座る前にいつも椅子があるかどうかチェックしてから座っているし、コーチに座るような別の計画もある。これで、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 );
    } );

2014年3月からhttp://fredkschott.com/post/2014/03/understanding-error-first-callbacks-in-node-js/から取得されたコードで、コンピューターに合わせて少し変更されています。権限もチェックします-テストするための権限を削除しますchmod a-r foo.txt


0

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

ドキュメントはあなたが使用する必要があると言う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))
  );
}

人気のJavaScriptフレームワーク

fs-extra

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

あなたがはるかに簡単に見るように。そして、promisifyに勝る利点は、このパッケージで完全なタイピングができることです(完全なインテリセンス/ typescript)。(+ -10.000)他のライブラリが依存しているため、ほとんどの場合、このライブラリはすでに含まれています。


0

を使用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

非同期バージョン!そして、約束のバージョンで!ここできれいなシンプルな方法!

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

上記の例はデモ用です!読み取りストリームのエラーイベントを使用できた可能性があります。エラーをキャッチするには!そして、2つの呼び出しをスキップします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.