情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

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.txttextfile2.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!!

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js