1. ホーム
  2. node.js

[解決済み] Node.jsでファイル/ディレクトリが存在するかどうかを同期的にチェックする

2022-03-18 10:37:26

質問

を使用して、同期的にチェックするにはどうすればよいですか? node.js ファイルやディレクトリが存在するかどうか?

解決方法は?

この問いに対する答えは、時代とともに変化しています。その 現在 このページでは、その答えを一番上に掲載し、その後に歴代の答えを時系列で掲載しています。

現在の回答

を使用することができます。 fs.existsSync() :

const fs = require("fs"); // Or `import fs from "fs";` with ESM
if (fs.existsSync(path)) {
    // Do something
}

数年前から非推奨とされていましたが、現在は非推奨ではありません。docsから。

注意点 fs.exists() は非推奨ですが fs.existsSync() はありません。(この のコールバックパラメータは fs.exists() は、以下のようなパラメータを受け付けます。 は、他のNode.jsコールバックと矛盾しています。 fs.existsSync() はありません。 はコールバックを使用します)。

具体的なご要望は シンクロナス をチェックしますが、もし 非同期 を使用してください(通常、I/Oは最適です)。 fs.promises.access を使っている場合は async 関数、または fs.access (以下 exists は非推奨 ) でない場合は

には async 関数を使用します。

try {
    await fs.promises.access("somefile");
    // The check succeeded
} catch (error) {
    // The check failed
}

またはコールバックで

fs.access("somefile", error => {
    if (!error) {
        // The check succeeded
    } else {
        // The check failed
    }
});


歴史的な回答

ここでは、歴史的な回答を年代順にご紹介します。

  • 2010年のオリジナル回答
    ( stat / statSync または lstat / lstatSync )
  • 2012年9月更新
    ( exists / existsSync )
  • 2015年2月更新
    (の廃止が迫っているため exists / existsSync に戻っていると思われます。 stat / statSync または lstat / lstatSync )
  • 2015年12月更新
    (また fs.access(path, fs.F_OK, function(){}) / fs.accessSync(path, fs.F_OK) しかし、ファイルやディレクトリが存在しない場合はエラーになることに注意してください。 fs.stat を使用することをお勧めします。 fs.access を開かずに存在を確認する必要がある場合)
  • 2016年12月更新
    fs.exists() はまだ非推奨ですが fs.existsSync() はもう非推奨ではありません。ですから、もう安全に使うことができます。

2010年当時のオリジナル回答です。

を使用することができます。 statSync または lstatSync ( ドキュメントリンク を与える)。 fs.Stats オブジェクト . 一般に、ある関数の同期バージョンが利用可能な場合、非同期バージョンと同じ名前の Sync を末尾につけています。ですから statSync の同期バージョンです。 stat ; lstatSync の同期バージョンです。 lstat など。

lstatSync は、何かが存在するかどうか、存在する場合、それがファイルかディレクトリか (ファイルシステムによっては、シンボリックリンク、ブロックデバイス、キャラクタデバイスなど) の両方を知らせます、例えば、それが存在し、ディレクトリであるかどうかを知る必要がある場合。

var fs = require('fs');
try {
    // Query the entry
    stats = fs.lstatSync('/the/path');

    // Is it a directory?
    if (stats.isDirectory()) {
        // Yes it is
    }
}
catch (e) {
    // ...
}

...そして同様に、ファイルであれば isFile ブロックデバイスの場合は isBlockDevice などなど。に注意してください。 try/catch エントリーが存在しない場合はエラーになります。

を気にしないのであれば、エントリ で、存在するかどうかだけを知りたい場合は path.existsSync (または最新で。 fs.existsSync として使用することができます。 ユーザー618408の指摘 :

var path = require('path');
if (path.existsSync("/the/path")) { // or fs.existsSync
    // ...
}

を必要としません。 try/catch が、それが何であるかについての情報はなく、ただそこにあることを教えてくれる。 path.existsSync はずっと前に非推奨となりました。


余談ですが、あなたは明示的に 同期的に ということで、今回は xyzSync のバージョンがあります。しかし、可能な限り、I/Oでは、同期呼び出しは避けた方がよいでしょう。I/Oサブシステムへの呼び出しは、CPUから見てかなりの時間を要します。このように lstat よりも lstatSync :

// Is it a directory?
lstat('/the/path', function(err, stats) {
    if (!err && stats.isDirectory()) {
        // Yes it is
    }
});

しかし、同期バージョンが必要な場合は、それがあります。

2012年9月更新

数年前の以下の回答は、現在では少し古くなっています。現在の方法は fs.existsSync を使用して、ファイルやディレクトリの存在を同期的にチェックします (あるいはもちろん fs.exists 非同期チェックの場合)、むしろ path のバージョンを以下に示します。

var fs = require('fs');

if (fs.existsSync(path)) {
    // Do something
}

// Or

fs.exists(path, function(exists) {
    if (exists) {
        // Do something
    }
});

2015年2月更新

そして、2015年に入り、Nodeのドキュメントには次のように書かれています。 fs.existsSync (そして fs.exists ) "は非推奨になります"。 (Nodeの人々は、何かを開く前に存在するかどうかをチェックするのは馬鹿げていると考えているからです。それはそうですが、何かが存在するかどうかをチェックする唯一の理由ではありません!)

ということで、おそらくまたいろいろな stat というメソッドがあります... もちろん、これがまた変わるまで/変わらない限りは。

2015年12月更新

いつからあるのか知りませんが、こんなのもあります。 fs.access(path, fs.F_OK, ...) / fs.accessSync(path, fs.F_OK) . そして、少なくとも2016年10月時点では fs.stat ドキュメント を使用することを推奨しています。 fs.access を使用して存在チェックを行います ( "ファイルが存在するかどうかを、その後に操作することなく確認すること。 fs.access() をお勧めします。 ). しかし、アクセスができないことは、次のように見なされることに注意してください。 エラー そのため、ファイルがアクセス可能であることを期待している場合は、おそらくこれが最適でしょう。

var fs = require('fs');

try {
    fs.accessSync(path, fs.F_OK);
    // Do something
} catch (e) {
    // It isn't accessible
}

// Or

fs.access(path, fs.F_OK, function(err) {
    if (!err) {
        // Do something
    } else {
        // It isn't accessible
    }
});

2016年12月更新

を使用することができます。 fs.existsSync() :

if (fs.existsSync(path)) {
    // Do something
}

数年前から非推奨とされていましたが、現在は非推奨ではありません。docsから。

注意点 fs.exists() は非推奨ですが fs.existsSync() はありません。(この のコールバックパラメータは fs.exists() は、以下のようなパラメータを受け付けます。 は、他のNode.jsコールバックと矛盾しています。 fs.existsSync() はありません。 はコールバックを使用します)。