Node.jsでディレクトリ内のファイル一覧を取得する
Node.jsでディレクトリ内のファイル一覧を取得する方法
Node.jsでは、fs
モジュールを使用してディレクトリ内のファイル一覧を取得することができます。
fsモジュールのインポート
const fs = require('fs');
readdirメソッドの使用
readdir
メソッドは、指定されたディレクトリ内のファイル名とサブディレクトリ名を同期的にまたは非同期的に取得します。
同期的な使用
const directoryPath = '/path/to/your/directory';
try {
const files = fs.readdirSync(directoryPath);
console.log(files);
} catch (err) {
console.error('Error:', err);
}
const directoryPath = '/path/to/your/directory';
fs.readdir(directoryPath, (err, files) => {
if (err) {
return console.error('Error:', err);
}
console.log(files);
});
ファイル情報の取得
const directoryPath = '/path/to/your/directory';
fs.readdir(directoryPath, (err, files) => {
if (err) {
return console.error('Error:', err);
}
files.forEach(file => {
const filePath = path.join(directoryPath, file);
fs.lstat(filePath, (err, stats) => {
if (err) {
return console.error('Error:', err);
}
console.log(file, stats.isFile(), stats.isDirectory());
});
});
});
注意
lstat
メソッドはシンボリックリンクのターゲットファイルの情報を取得します。実際のファイルの情報を取得するには、stat
メソッドを使用します。readdir
メソッドはディレクトリ内のファイル名のみを返します。サブディレクトリ内のファイルを取得するには、再帰的に呼び出す必要があります。
コードの全体的な流れ
Node.jsでディレクトリ内のファイル一覧を取得する際、一般的に以下の手順を踏みます。
- fsモジュールのインポート
Node.jsのファイルシステム操作を行うためのfs
モジュールをインポートします。 - ディレクトリの指定
取得したいファイル一覧のあるディレクトリのパスを指定します。 - readdirメソッドの使用
fs.readdir
メソッドを使用して、指定したディレクトリ内のファイル名の一覧を取得します。このメソッドは同期版と非同期版があります。 - エラー処理
readdir
メソッドの実行中にエラーが発生した場合に備えて、エラー処理を行います。 - 取得したファイル一覧の処理
取得したファイル一覧を、例えばコンソールに出力したり、別の処理に渡したりします。
コードの解説
同期版
const fs = require('fs');
const directoryPath = '/path/to/your/directory';
try {
const files = fs.readdirSync(directoryPath);
console.log(files);
} cat ch (err) {
console.error('Error:', err);
}
- try-catch
エラーが発生した場合に、catch
ブロック内でエラーメッセージを出力します。 - fs.readdirSync
指定したディレクトリのファイル名の一覧を同期的に取得します。
const fs = require('fs');
const directoryPath = '/path/to/your/directory';
fs.readdir(directoryPath, (err, files) => {
if (err) {
return console.error('Error:', err);
}
console.log(files);
});
- files
ファイル名の一覧が配列で渡されます。 - err
エラーが発生した場合にエラーオブジェクトが渡されます。 - コールバック関数
readdir
メソッドの第2引数に渡されるコールバック関数が、ファイル一覧の取得が完了した後に呼ばれます。
readdir
メソッドはファイル名のみを返しますが、lstat
メソッドやstat
メソッドを使用することで、ファイルの詳細な情報(ファイルサイズ、作成日時など)を取得できます。
const fs = require('fs');
const path = require('path');
// ... (readdirのコード)
files.forEach(file => {
const filePath = path.join(directoryPath, file);
fs.lstat(filePath, (err, stats) => {
if (err) {
return console.error('Error:', err);
}
console.log(file, stats.isFile(), stats.isDirectory());
});
});
- stats
ファイルの情報を含むオブジェクトです。isFile()
でファイルかどうか、isDirectory()
でディレクトリかどうかを判定できます。 - fs.lstat
指定したファイルの情報を取得します。 - path.join
ディレクトリパスとファイル名を結合して、ファイルのフルパスを作成します。
Node.jsでディレクトリ内のファイル一覧を取得するには、fs.readdir
メソッドを使用します。同期版と非同期版があり、用途に合わせて使い分けます。また、lstat
メソッドやstat
メソッドを使用することで、ファイルの詳細な情報も取得できます。
ポイント
- ファイルの種類を判別したい場合は
lstat
やstat
メソッドを使用します。 - エラー処理は必ず行いましょう。
fs.readdirSync
は処理がブロックされるため、大量のファイルがある場合や非同期処理が必要な場合はfs.readdir
を使用する方が良いです。
- パフォーマンス
大量のファイルがある場合、パフォーマンスに影響が出る可能性があります。その場合は、glob
モジュールなどの専用のモジュールを使用することを検討しましょう。 - 非同期処理
async/await
やPromise
を使用することで、よりモダンな非同期処理を行うことができます。 - 再帰的な処理
サブディレクトリも含めて全てのファイルを取得したい場合は、再帰的な関数を作成する必要があります。
globモジュール
- 例
- デメリット
- メリット
- 複雑なファイル検索に適している。
- 読みやすい構文。
- 特徴
- パターンマッチ
ファイル名のパターンを指定して柔軟にファイル検索を行うことができます。 - 再帰的な検索
サブディレクトリも含めて再帰的にファイルを探すことができます。
- パターンマッチ
const glob = require('glob');
glob('path/to/directory/**/*.js', (err, files) => {
if (err) {
console.error(err);
} else {
console.log(files);
}
});
この例では、指定したディレクトリとそのサブディレクトリから、拡張子が.js
のファイル一覧を取得します。
async/await
- デメリット
- メリット
- 非同期処理がより直感的になる。
- エラー処理が容易になる。
- 特徴
const fs = require('fs').promises;
async function getFiles(dir) {
const files = await fs.readdir(dir);
return files;
}
getFiles('path/to/directory')
.then(files => console.log(files))
.catch(err => console.error(err));
サードパーティライブラリ
- 例
- recursive-readdir
再帰的なディレクトリ探索に特化したライブラリ - fast-glob
globパターンを使用した高速なファイル検索ライブラリ
- recursive-readdir
- デメリット
- メリット
- 特定の目的に特化した機能を利用できる。
- コミュニティによるサポートが充実している。
- 特徴
Node.js Streams
- デメリット
- メリット
- メモリ使用量を抑えられる。
- パイプライン処理が可能。
- 特徴
どの方法を選ぶべきか
- 大容量ファイル
Node.js Streamsが有効。 - 特定の機能
サードパーティライブラリを検討。 - 非同期処理の簡潔化
async/await
が便利。 - 複雑なパターンマッチ
glob
モジュールが適している。 - 単純なファイル一覧の取得
fs.readdir
で十分な場合が多い。
選択のポイント
- 依存性
外部ライブラリへの依存 - 使いやすさ
習得の容易さ、コードの可読性 - 機能
必要な機能が備わっているか - パフォーマンス
処理速度、メモリ使用量
- セキュリティ
不特定のディレクトリに対してファイル操作を行う場合は、セキュリティリスクを考慮する必要があります。 - エラー処理
どの方法を選択する場合でも、エラー処理はしっかりと行うようにしましょう。 - パフォーマンスチューニング
大量のファイルを扱う場合は、非同期処理、キャッシュ、並列処理などのテクニックを検討することでパフォーマンスを向上させることができます。
javascript node.js directory-listing