[解決済み】Node.js fs.readdir 再帰的ディレクトリ検索
2022-04-15 22:26:21
質問
fs.readdirを使った非同期ディレクトリ検索について、何かアイデアはありませんか?再帰性を導入して、次に読むディレクトリでread directory関数を呼び出すことができることは理解していますが、非同期でないことが少し心配です...。
何かアイデアはありますか?私が見たのは ノードウォーク は素晴らしいのですが、readdirのように配列の中のファイルだけを与えてくれるわけではありません。しかし
のような出力を探しています。
['file1.txt', 'file2.txt', 'dir/file3.txt']
解決方法は?
これを実現するには、基本的に2つの方法があります。非同期環境では、シリアルとパラレルという2種類のループがあることに気がつくでしょう。直列ループは、ある反復処理が完了するのを待ってから次の反復処理に移る。これにより、ループの各反復処理が順番に完了することが保証される。並列ループでは、すべての反復処理が同時に開始され、ある反復処理が先に完了する可能性がありますが、直列ループよりもはるかに高速に処理されます。この場合、並列ループを使用した方がよいでしょう。なぜなら、ウォークがどのような順序で完了しても、完了し結果を返せばよいからです(順番に結果を返したい場合は別ですが)。
並列ループは次のようになります。
var fs = require('fs');
var path = require('path');
var walk = function(dir, done) {
var results = [];
fs.readdir(dir, function(err, list) {
if (err) return done(err);
var pending = list.length;
if (!pending) return done(null, results);
list.forEach(function(file) {
file = path.resolve(dir, file);
fs.stat(file, function(err, stat) {
if (stat && stat.isDirectory()) {
walk(file, function(err, res) {
results = results.concat(res);
if (!--pending) done(null, results);
});
} else {
results.push(file);
if (!--pending) done(null, results);
}
});
});
});
};
直列ループは次のようになります。
var fs = require('fs');
var path = require('path');
var walk = function(dir, done) {
var results = [];
fs.readdir(dir, function(err, list) {
if (err) return done(err);
var i = 0;
(function next() {
var file = list[i++];
if (!file) return done(null, results);
file = path.resolve(dir, file);
fs.stat(file, function(err, stat) {
if (stat && stat.isDirectory()) {
walk(file, function(err, res) {
results = results.concat(res);
next();
});
} else {
results.push(file);
next();
}
});
})();
});
};
そして、あなたのホームディレクトリでテストするために(警告:あなたのホームディレクトリに多くのものがある場合、結果リストは巨大になります)。
walk(process.env.HOME, function(err, results) {
if (err) throw err;
console.log(results);
});
EDIT: 例を改善しました。
関連
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] Node.jsで終了する方法
-
[解決済み] Node.jsでファイルを書き込む
-
[解決済み] Node.jsアプリケーションをデバッグするにはどうすればよいですか?
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] Node.jsで環境変数を読み込む
-
[解決済み] Node.jsでファイル/ディレクトリが存在するかどうかを同期的にチェックする
-
[解決済み] Node.jsでディレクトリに存在するすべてのファイル名のリストを取得する方法は?
-
[解決済み] Node.jsを使用してディレクトリが存在しない場合に作成する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】Discord.js が特定のチャンネルにメッセージを送信する場合
-
[解決済み] 非推奨パッケージに関するNPM警告メッセージ
-
[解決済み】ブロックスコープの宣言は、ストリクトモード以外ではまだサポートされていません。
-
[解決済み】Mongooseで配列の値を更新する方法
-
webpack ENOENTソリューションの起動
-
[解決済み】AWS lambda function エラー - モジュール 'index' をインポートできません。エラー
-
[解決済み] npm install エラー - ローカルの発行者証明書を取得できません。
-
[解決済み] ExpressJS : res.redirect()が期待通りに動作しない?
-
[解決済み] JavaScriptで「!--」は何をするのですか?