Node.jsでファイル削除を極める!ディレクトリ内のファイルを効率的に削除する方法
Node.jsでディレクトリ内のファイルを削除する方法(ディレクトリは削除しない)
Node.jsでディレクトリ内のすべてのファイルを削除したいけど、ディレクトリ自体は残しておきたい場合は、以下の2つの方法があります。
fs.readdirSync と fs.unlinkSync を使用する
fs
モジュールをインポートします。fs.readdirSync
を使用して、削除したいディレクトリ内のすべてのファイル名のリストを取得します。- ループを使用して、各ファイル名に対して
fs.unlinkSync
を使用してファイルを削除します。
const fs = require('fs');
const directoryPath = './target-directory';
const files = fs.readdirSync(directoryPath);
for (const fileName of files) {
const filePath = path.join(directoryPath, fileName);
fs.unlinkSync(filePath);
}
説明:
fs.readdirSync(directoryPath)
は、directoryPath
ディレクトリ内のすべてのファイル名の配列を返します。for...of
ループは、files
配列の各要素に対して反復処理します。path.join(directoryPath, fileName)
は、directoryPath
とfileName
を結合して、ファイルの絶対パスを作成します。fs.unlinkSync(filePath)
は、指定されたパスのファイルを削除します。
注意点:
- この方法は、非同期的に動作しません。すべてのファイルが削除されるまで、スクリプトはブロックされます。
- エラー処理が実装されていません。ファイルの削除中にエラーが発生すると、スクリプトがクラッシュする可能性があります。
fs.promises.readdir と fs.promises.unlink を使用する
Promise.all
を使用して、各ファイル名の非同期的な削除を並行して実行します。
const fs = require('fs/promises');
const directoryPath = './target-directory';
(async () => {
const files = await fs.readdir(directoryPath);
await Promise.all(files.map(async fileName => {
const filePath = path.join(directoryPath, fileName);
await fs.unlink(filePath);
}));
})();
fs/promises
モジュールは、Node.js 10以降で導入された非同期版のファイルシステム API を提供します。await
キーワードを使用して、非同期操作の結果を待機します。Promise.all
は、引数として渡されたすべての Promise が完了するのを待って、新しい Promise を返します。map
関数は、files
配列の各要素に対して、fs.promises.unlink
を使用してファイルを削除する非同期操作を返す新しい配列を作成します。
補足
- 上記のコード例は、基本的な実装を示しています。実際の使用状況に応じて、エラー処理、ログ記録、進行状況の表示などの機能を追加する必要があります。
- 大規模なディレクトリを処理する場合は、パフォーマンスを向上させるために、非同期的な方法を使用することをお勧めします。
- ファイルを削除する前に、そのファイルに必要なアクセス許可を持っていることを確認してください。
以下のコードは、fs.readdirSync
と fs.unlinkSync
を使用して、ディレクトリ内のすべてのファイルを削除する方法を示しています。
const fs = require('fs');
const directoryPath = './target-directory';
const files = fs.readdirSync(directoryPath);
for (const fileName of files) {
const filePath = path.join(directoryPath, fileName);
fs.unlinkSync(filePath);
}
fs
モジュールは、Node.jsのファイルシステム操作のためのモジュールです。
補足:
- このコードは、Node.js 12.10以降で動作します。
const fs = require('fs/promises');
const directoryPath = './target-directory';
(async () => {
const files = await fs.readdir(directoryPath);
await Promise.all(files.map(async fileName => {
const filePath = path.join(directoryPath, fileName);
await fs.unlink(filePath);
}));
})();
Node.jsでディレクトリ内のファイルを削除するその他の方法
従来の説明に加えて、Node.jsでディレクトリ内のファイルを削除する方法はいくつかあります。以下に、2つの代替方法と、それぞれの長所と短所をご紹介します。
glob モジュールを使用する:
glob
モジュールは、ファイルシステム内のファイルをパターンに基づいて検索するのに役立ちます。- 利点:
- ワイルドカードを使用して、特定のタイプのファイルのみを削除できます。
- サブディレクトリ内のファイルも削除できます。
- 欠点:
const glob = require('glob');
const fs = require('fs');
const directoryPath = './target-directory';
const pattern = '*.txt'; // すべての .txt ファイルを削除
glob(pattern, { cwd: directoryPath }, (err, files) => {
if (err) {
console.error(err);
return;
}
Promise.all(files.map(filePath => fs.unlink(filePath)))
.then(() => console.log('削除完了'))
.catch(err => console.error(err));
});
rimraf
モジュールは、ディレクトリとその内容を再帰的に削除するために使用されます。- 利点:
- ディレクトリとその内容を簡単に削除できます。
fs
モジュールよりもエラー処理が容易です。
const rimraf = require('rimraf');
const directoryPath = './target-directory';
rimraf(directoryPath, { glob: true }, (err) => {
if (err) {
console.error(err);
} else {
console.log('削除完了');
}
});
- 単純な場合や、特定のタイプのファイルのみを削除したい場合は、
fs
モジュールとreaddirSync
/readdir
関数を使用するのが良いでしょう。 - ワイルドカードを使用してファイルを選択したい場合、またはサブディレクトリ内のファイルも削除したい場合は、
glob
モジュールを使用するのが良いでしょう。 - ディレクトリとその内容を完全に削除したい場合は、
rimraf
モジュールを使用するのが良いでしょう。
どの方法を選択する場合も、削除するファイルに十分なアクセス許可を持っていることを確認してください。また、重要なファイルを誤って削除しないように、常にバックアップを取ることをお勧めします。
javascript node.js