Node.jsでファイルを削除する3つの方法:rimraf、fs.rm、自作関数
Node.jsにおける「rimraf」の意味と使い方
概要
「rimraf」は、Node.jsでディレクトリとファイルの再帰削除を行うためのモジュールです。rm -rf
コマンドのNode.js版とも言える存在で、ディレクトリ内のすべてのファイルを再帰的に削除し、その後ディレクトリ自体も削除します。
使い方
rimraf
モジュールを使用するには、以下の手順が必要です。
- インストール
npm install rimraf
- モジュールの読み込み
const rimraf = require('rimraf');
- 削除対象のパスを指定
const pathToDelete = '/path/to/directory';
- 削除実行
rimraf(pathToDelete, (err) => {
if (err) {
console.error(err);
return;
}
console.log('削除完了');
});
オプション
rimraf
には、オプションを指定して削除動作を制御することができます。主なオプションは以下の通りです。
glob
: globパターンで削除対象を指定noGlobstar
:**
ワイルドカードの使用を無効化maxRetries
: 再試行回数を指定graceful
: エラーが発生してもプロセスを終了しない
補足
rimraf
は非同期処理なので、削除完了後に処理を実行する場合は、コールバック関数を使用する必要があります。rimraf
は強力なモジュールなので、削除対象を間違えないよう注意が必要です。- Node.js v12.10.0以降では、
fs.rmSync
とfs.promises.rm
を使用して同様の処理を行うことができます。
「セマンティクス」という言葉は、プログラミングにおいて様々な意味で使用されますが、ここでは**「意味論」**という意味で解釈します。
「rimraf」という名前は、**「Recursive In My Asynchronous Function」**の略称です。つまり、「再帰的に削除する非同期関数」という意味であり、このモジュールの機能を的確に表しています。
「rimraf」は、Node.jsでディレクトリとファイルを再帰削除する際に便利なモジュールです。使い方を理解し、オプションを活用することで、より効率的に削除処理を行うことができます。
- 上記の説明は、Node.js v16.14.0時点の情報に基づいています。
- 最新の情報については、公式ドキュメントを参照することをお勧めします。
Node.jsにおける「rimraf」のサンプルコード
例1:ディレクトリとファイルの再帰削除
const rimraf = require('rimraf');
const pathToDelete = '/path/to/directory';
rimraf(pathToDelete, (err) => {
if (err) {
console.error(err);
return;
}
console.log('削除完了');
});
例2:globパターンを使用した削除
const rimraf = require('rimraf');
const globPattern = '/path/to/directory/*.txt';
rimraf(globPattern, (err) => {
if (err) {
console.error(err);
return;
}
console.log('削除完了');
});
例3:オプションを使用した削除
const rimraf = require('rimraf');
const pathToDelete = '/path/to/directory';
const options = {
glob: true,
maxRetries: 3,
graceful: true
};
rimraf(pathToDelete, options, (err) => {
if (err) {
console.error(err);
return;
}
console.log('削除完了');
});
説明
- 上記のコードは、
rimraf
モジュールを使用してディレクトリとファイルを再帰削除する例です。 - 例1は、最も基本的な使用方法で、指定されたパスにあるすべてのファイルを削除します。
- 例2は、globパターンを使用して削除対象を指定する方法です。この例では、
/path/to/directory
ディレクトリ内のすべての.txt
ファイルを削除します。 - 例3は、オプションを使用して削除動作を制御する方法です。この例では、
glob
オプションを使用してglobパターンによる削除を有効化し、maxRetries
オプションを使用して再試行回数を3回に設定し、graceful
オプションを使用してエラーが発生してもプロセスを終了しないように設定しています。
注意事項
- 上記のコードはあくまで例であり、状況に応じて変更する必要があります。
Node.jsでディレクトリを再帰削除するその他の方法
fs.rmSyncとfs.promises.rm
Node.js v12.10.0以降では、fs.rmSync
とfs.promises.rm
を使用して、rimraf
と同様の処理を行うことができます。これらの関数は、非同期版と同期版の2種類があり、それぞれ以下の通り使用できます。
非同期
const fs = require('fs').promises;
const pathToDelete = '/path/to/directory';
fs.rm(pathToDelete, { recursive: true, force: true })
.then(() => console.log('削除完了'))
.catch(err => console.error(err));
const fs = require('fs');
const pathToDelete = '/path/to/directory';
try {
fs.rmSync(pathToDelete, { recursive: true, force: true });
console.log('削除完了');
} catch (err) {
console.error(err);
}
fs.readdirSyncとfs.statSync
この方法は、再帰的にディレクトリを削除する自作関数を作成する場合に使用できます。以下のコードは、その例です。
const fs = require('fs');
function removeDirectory(path) {
if (!fs.existsSync(path)) {
return;
}
const stats = fs.statSync(path);
if (stats.isDirectory()) {
const files = fs.readdirSync(path);
for (const file of files) {
removeDirectory(path + '/' + file);
}
fs.rmdirSync(path);
} else {
fs.unlinkSync(path);
}
}
const pathToDelete = '/path/to/directory';
removeDirectory(pathToDelete);
サードパーティ製ライブラリ
glob
やgraceful-fs
などのサードパーティ製ライブラリを使用して、ディレクトリを再帰削除することもできます。これらのライブラリは、rimraf
よりも多くの機能を提供する場合があります。
- 上記の方法を使用する場合は、削除対象を間違えないよう注意が必要です。
- これらの方法は、
rimraf
よりもパフォーマンスが劣る場合があることに注意してください。
Node.jsでディレクトリを再帰削除するには、様々な方法があります。状況に応じて最適な方法を選択してください。
node.js semantics