Node.js でファイル/ディレクトリが存在するかどうかを同期的に確認する 質問する

Node.js でファイル/ディレクトリが存在するかどうかを同期的に確認する 質問する

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

ベストアンサー1

この質問に対する答えは、長年にわたって変化してきました。現在の答えはここに一番上にあり、その後に、長年にわたるさまざまな答えが時系列で続きます。

現在の回答

使用できますfs.existsSync():

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

数年間非推奨でしたが、現在は非推奨ではありません。ドキュメントより:

fs.exists()は非推奨ですが、そうではないことに注意してくださいfs.existsSync()。( のコールバック パラメータは、fs.exists()他の Node.js コールバックと一致しないパラメータを受け入れます。fs.existsSync()はコールバックを使用しません。)

同期チェックを要求していますが、代わりに非同期チェックを使用できる場合は(通常はI/Oが最適です)、fs.promises.accessasync関数を使用している場合や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 月更新 ( /
    が廃止される予定であるため、おそらく/または/に戻ると思われます)existsexistsSyncstatstatSynclstatlstatSync
  • 2015 年 12 月更新 ( /
    もありますが、ファイル/ディレクトリが存在しない場合はエラーになることに注意してください。開かずに存在を確認する必要がある場合は、のドキュメントを使用することを推奨しています)fs.access(path, fs.F_OK, function(){})fs.accessSync(path, fs.F_OK)fs.statfs.access
  • 2016 年 12 月のアップデートは
    fs.exists()まだ非推奨ですが、fs.existsSync()非推奨ではなくなりました。そのため、現在は安全に使用できます。

2010 年の元の回答:

またはstatSynclstatSyncドキュメントリンク)を使用すると、fs.Stats物体一般に、関数の同期バージョンが使用可能な場合、その名前は非同期バージョンと同じで、Sync末尾に が付きます。statSyncの同期バージョンは でありstatlstatSyncの同期バージョンは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
}

数年間非推奨でしたが、現在は非推奨ではありません。ドキュメントより:

fs.exists()は非推奨ですが、そうではないことに注意してくださいfs.existsSync()。( のコールバック パラメータは、fs.exists()他の Node.js コールバックと一致しないパラメータを受け入れます。fs.existsSync()はコールバックを使用しません。)

おすすめ記事