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.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
}
数年間非推奨でしたが、現在は非推奨ではありません。ドキュメントより:
fs.exists()
は非推奨ですが、そうではないことに注意してくださいfs.existsSync()
。( のコールバック パラメータは、fs.exists()
他の Node.js コールバックと一致しないパラメータを受け入れます。fs.existsSync()
はコールバックを使用しません。)