web-dev-qa-db-ja.com

Node.jsが存在するファイルをチェック

どうやってファイルの存在をチェックするのですか?

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

どうすればこれができますか?

122
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.existsfs.existsはどちらも推奨されなくなりました

*編集:

変更:else if(err.code == 'ENOENT')

else if(err.code === 'ENOENT')

Linterは、Double EqualsがTriple Equalではないと文句を言います。

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);
    }
});
210
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 および https://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ステートメントによって捕捉されるエラーがスローされます。 。

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

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

@ Fox:素晴らしい答え!これは、いくつかのオプションを追加した、ちょっとした拡張です。それは私が最近Go-Toソリューションとして使用しているものです。

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


}

P.Sまだ使っていないのであれば、fs-extraをチェックしてください - それはかなり甘いです。 https://github.com/jprichardson/node-fs-extra

6
mikermcneil

fs.existsSync()が推奨されなくなったことについての不正確なコメントがたくさんあります。そうではない。

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

Fs.exists()は非推奨ですが、fs.existsSync()は非推奨です。

4
chrisw

ノード8の時点でasync/awaitを使用しているutil.promisifyバージョン:

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
  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を使った次の例がファイルが存在するかどうかを非同期的にチェックする良い方法であることがわかりました。また、あなたの "ファイル"が "ファイルである"ことを確認します(ディレクトリではありません)。

このメソッドは、非同期コードベースを使用していると仮定して、Promisesを使用します。

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

docs 非推奨のaccess()の代わりにexists()を使うべきだと言っています

ビルドインプロミスを持つノードjs(ノード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よりも優れている点は、このパッケージで完全なタイピングができることです(完全なintellisense/TypeScript)。他のライブラリが(+ -10.000)他のライブラリに依存しているため、ほとんどの場合、このライブラリはすでに含まれています。

0
Joel Harkes

現代の非同期/待機方法(Node 12.8.x)

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


console.log(await fileExists('/path/myfile.txt'));

Targetがファイルかディレクトリかを確認するために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 );
    } );

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

0
user2167003