Node.jsでフォルダを再帰的に削除する
フォルダを再帰的に削除するには非同期的に削除する方法と同期的に削除する方法の2つがあります。
非同期的な削除
フォルダを非同期的に再帰的に削除するにはrimraf
モジュールのrimraf
関数やfs-extra
モジュールのfsExtra.remove
関数を使用します。
var rimraf = require('rimraf');
rimraf('xxx', function (err) {
});
var fsExtra = require('fs-extra');
fsExtra.remove('xxx', function (err) {
});
第1引数にフォルダのパスを指定します。
第2引数にコールバック関数を指定します。この関数の第1引数はエラーオブジェクトです。
同期的な削除
フォルダを同期的に再帰的に削除するにはrimraf
モジュールのrimraf.sync
関数やfs-extra
モジュールのfsExtra.removeSync
関数を使用します。
rimraf.sync('xxx');
fsExtra.removeSync('xxx');
第1引数にフォルダのパスを指定します。
使い分け
原則的にはrimraf
関数やfsExtra.remove
関数を使用するべきであり、特に理由がないならrimraf.sync
関数やfsExtra.removeSync
関数は使用するべきではありません。
これは、フォルダへのアクセスは非常に時間の掛かる処理であるためです。フォルダへのアクセスを同期的に行うとアクセスが完了するまでプログラムは待機状態となり、他の処理を行うことができません。長い時間プログラムが待機状態になると様々な問題を引き起こす可能性があります(このような現象をスターベーションと言います)。
スターベーションとは?
サンプルコード1
rimraf
関数の使用例です。
3つ目のコマンドライン引数として与えられたフォルダを非同期的に再帰的に削除します。
rimraf.js
var rimraf = require('rimraf');
if (process.argv.length < 3) {
console.error('lack argument.');
process.exit(1);
}
rimraf(process.argv[2], function (err) {
if (err) {
console.error(err);
process.exit(1);
}
else {
console.log('finished!!');
}
});
使用パッケージ
- rimraf
npm install rimraf
でインストールします。
実行結果
現在のフォルダにはtmp\tmp2\tmp3
という名称のフォルダが存在しています。
C:\work\node>dir tmp\tmp2\tmp3
Volume in drive C is TI31035600A
Volume Serial Number is 1CBD-3C48
Directory of C:\work\node\tmp\tmp2\tmp3
2016/10/19 10:28 <DIR> .
2016/10/19 10:28 <DIR> ..
0 File(s) 0 bytes
2 Dir(s) 30,115,241,984 bytes free
tmp
を3つ目のコマンドライン引数に指定してコードを実行するとフォルダが再帰的に削除されます。
C:\work\node>node rimraf.js tmp
finished!!
C:\work\node>dir tmp
Volume in drive C is TI31035600A
Volume Serial Number is 1CBD-3C48
Directory of C:\work\node
File Not Found
関連
