Node.js でディレクトリ内のファイルパスを再帰的に取得するワンライナー
Node.js の fs.readdir を使った再帰ディレクトリ検索
readdir
を使って再帰的にディレクトリを検索するには、次の手順を実行する必要があります。
fs
モジュールを読み込みます。- 検索を開始するディレクトリを指定します。
readdir
関数を呼び出して、ディレクトリ内のファイル名のリストを取得します。- ファイル名のリストをループ処理し、各ファイルに対して次のいずれかの操作を実行します。
- ファイルがディレクトリの場合は、そのディレクトリに対して再帰的にステップ 3 と 4 を実行します。
- ファイルがファイルの場合は、そのファイルを読み込みます。
次のコードは、fs.readdir
を使って再帰的にディレクトリを検索する例です。
const fs = require('fs');
function readdirRecursive(dir) {
fs.readdir(dir, (err, files) => {
if (err) throw err;
files.forEach(file => {
const filePath = `${dir}/${file}`;
fs.stat(filePath, (err, stats) => {
if (err) throw err;
if (stats.isDirectory()) {
readdirRecursive(filePath);
} else {
// ファイルを読み込む
console.log(filePath);
}
});
});
});
}
// 検索を開始するディレクトリを指定
const dir = '/path/to/directory';
readdirRecursive(dir);
このコードは、/path/to/directory
ディレクトリとそのサブディレクトリ内のすべてのファイルを読み込み、ファイルパスをコンソールに出力します。
注意事項
readdir
関数は非同期関数なので、コールバック関数を指定する必要があります。- 大量のファイルを読み込む場合は、メモリ使用量に注意する必要があります。
関連用語
- Node.js
- fs モジュール
- readdir
- 再帰ディレクトリ検索
日本語での情報
Node.js の fs.readdir
を使った再帰ディレクトリ検索については、日本語で書かれた情報もたくさんあります。上記のリンク以外にも、以下のサイトを参考にしてみてください。
Node.js の fs.readdir を使った再帰ディレクトリ検索のサンプルコード
const fs = require('fs');
function readdirRecursive(dir) {
fs.readdir(dir, (err, files) => {
if (err) throw err;
files.forEach(file => {
const filePath = `${dir}/${file}`;
fs.stat(filePath, (err, stats) => {
if (err) throw err;
if (stats.isDirectory()) {
readdirRecursive(filePath);
} else {
// ファイルを読み込む
console.log(filePath);
}
});
});
});
}
// 検索を開始するディレクトリを指定
const dir = '/path/to/directory';
readdirRecursive(dir);
コードの説明
require('fs')
は、fs
モジュールを読み込みます。readdirRecursive
関数は、指定されたディレクトリとそのサブディレクトリ内のすべてのファイルを読み込みます。files.forEach
ループは、ファイル名のリストをループ処理します。fs.stat
関数は、ファイルのステータスを取得します。if (stats.isDirectory())
は、ファイルがディレクトリの場合は、readdirRecursive
関数を再帰的に呼び出します。if (!stats.isDirectory())
は、ファイルがファイルの場合は、ファイルパスをコンソールに出力します。
実行方法
このコードを実行するには、次の手順を実行します。
- コードをファイルに保存します。
- ファイルを Node.js で実行します。
node filename.js
出力結果
このコードの出力結果は、次のようになります。
/path/to/directory/file1.txt
/path/to/directory/file2.txt
/path/to/directory/subdirectory/file3.txt
/path/to/directory/subdirectory/file4.txt
- このコードは、基本的な例です。必要に応じて、コードを変更して、さまざまな機能を追加できます。
- 例えば、ファイルの内容を読み込む、ファイルのサイズを取得する、ファイルの変更日時を取得するなどの機能を追加できます。
Node.js で再帰ディレクトリ検索を行う他の方法
fs.walk
は、Node.js 10.12.0 以降で導入された新しい API です。fs.readdir
よりも効率的で使いやすいという特徴があります。
const fs = require('fs');
function readdirRecursive(dir) {
fs.walk(dir, (err, files) => {
if (err) throw err;
files.forEach(file => {
// ファイルの処理
});
});
}
// 検索を開始するディレクトリを指定
const dir = '/path/to/directory';
readdirRecursive(dir);
第三者ライブラリを使う
readdir-recursive
や recursive-readdir
などの第三者ライブラリを使う方法もあります。これらのライブラリは、fs.readdir
や fs.walk
よりもさらに使いやすく、さまざまな機能が提供されています。
const readdirRecursive = require('readdir-recursive');
// 検索を開始するディレクトリを指定
const dir = '/path/to/directory';
const files = readdirRecursive(dir);
// ファイルの処理
ジェネレータを使う方法もあります。ジェネレータを使うと、コードをより簡潔に書くことができます。
function* readdirRecursive(dir) {
const files = yield fs.readdir(dir);
for (const file of files) {
const filePath = `${dir}/${file}`;
const stats = yield fs.stat(filePath);
if (stats.isDirectory()) {
yield* readdirRecursive(filePath);
} else {
// ファイルの処理
}
}
}
// 検索を開始するディレクトリを指定
const dir = '/path/to/directory';
const generator = readdirRecursive(dir);
// ファイルの処理
- 効率と使いやすさを重視する場合は、
fs.walk
を使うのがおすすめです。 - さまざまな機能が必要な場合は、第三者ライブラリを使うのがおすすめです。
- コードを簡潔に書きたい場合は、ジェネレータを使うのがおすすめです。
関連用語
- fs.walk
- readdir-recursive
- recursive-readdir
- ジェネレータ
node.js readdir