Node.jsでファイルやフォルダが存在するかチェックする
ファイルやフォルダが存在するかチェックするには非同期的にチェックする方法と同期的にチェックする方法の2つがあります。
非同期的なチェック
ファイルやフォルダが存在するか非同期的にチェックするにはfs.access
関数を使用します。
var fs = require('fs');
fs.access('xxx', function (err) {
});
第1引数にファイルやフォルダのパスを指定します。
第2引数にコールバック関数を指定します。この関数の第1引数はエラーオブジェクトです。
ファイルが存在しない場合にはcode
プロパティがENOENT
のエラーが発生します。
同期的なチェック
ファイルやフォルダが存在するか同期的にチェックするするにはfs.accessSync
関数を使用します。
fs.accessSync('xxx');
第1引数にファイルやフォルダのパスを指定します。
ファイルが存在しない場合にはcode
プロパティがENOENT
の例外が発生します。
使い分け
原則的にはfs.access
関数を使用するべきであり、特に理由がないならfs.accessSync
関数は使用するべきではありません。
これは、ファイルやフォルダへのアクセスは非常に時間の掛かる処理であるためです。ファイルやフォルダへのアクセスを同期的に行うとアクセスが完了するまでプログラムは待機状態となり、他の処理を行うことができません。長い時間プログラムが待機状態になると様々な問題を引き起こす可能性があります(このような現象をスターベーションと言います)。
スターベーションとは?
注意事項
fs.access
関数やfs.accessSync
関数はファイルやフォルダが存在するかのみをチェックしたい場合に使用するようにしてください。
ファイルやフォルダが存在するかチェックしてからその結果に応じてそのファイルやフォルダに対して別の操作を行うのには意味がありませんので注意してください。
ファイルやフォルダに対して存在チェック以外の操作を行う場合にはまず操作を試みてから後でファイルやフォルダが存在しなかったり、存在していたりした場合のエラー処理を行います。
サンプルコード1
fs.access
関数の使用例です。
3つ目のコマンドライン引数として与えられたファイルやフォルダが存在するかチェックし、結果を標準出力に出力します。
fs-access.js
var fs = require('fs');
if (process.argv.length < 3) {
console.error('lack argument.');
process.exit(1);
}
fs.access(process.argv[2], function (err) {
if (err) {
if (err.code === 'ENOENT') {
console.log('not exists!!');
}
else {
console.error(err);
process.exit(1);
}
}
else {
console.log('exists!!');
}
});
実行結果
現在のフォルダにはtextfile.txt
という名称のファイルは存在していますがtextfile2.txt
という名称のファイルは存在していません。
C:\work\node>type textfile.txt
test
C:\work\node>type textfile2.txt
The system cannot find the file specified.
また、tmp
という名称のフォルダも存在していません。
C:\work\node>dir tmp
Volume in drive C is TI31035600A
Volume Serial Number is 1CBD-3C48
Directory of C:\work\node
File Not Found
textfile.txt
、textfile2.txt
、.
、tmp
を3つ目のコマンドライン引数に指定してコードを実行すると結果が標準出力に出力されます。
C:\work\node>node fs-access.js textfile.txt
exists!!
C:\work\node>node fs-access.js textfile2.txt
not exists!!
C:\work\node>node fs-access.js .
exists!!
C:\work\node>node fs-access.js tmp
not exists!!
関連
