Overview
フォルダを配下のファイルも含めて一括削除しようかと思ったら意外と過渡期であることが判明。
ググると古いコードが上位にいるため、2019年以降のフォルダ削除の方法を残しておく。
Target reader
- Node.jsでフォルダをファイルも含めてスマートに削除したい方。
Prerequisite
なし。
Body
Special thanks
今回はstack overflowの内容をなぞるだけなので、必要に応じてリンク先を確認してください。
Remove directory which is not empty
https://stackoverflow.com/questions/18052762/remove-directory-which-is-not-empty
Node v12.10以降の場合
この回答がすべて。
https://stackoverflow.com/a/57866165
fs.rmdir(dir,{recursive:true});
APIリファレンス見てみるとrecursiveのオプションはまだ実験段階。
https://nodejs.org/api/fs.html#fs_fs_rmdir_path_options_callback
時が解決するだろうが、問題なさそうならテストコードとともに投入してもいいでしょう。
ちなみに私はGoogle Cloud Functions(以降、GCF)のNode.jsとバージョンを合わせているため、これを試せていない…
Node v12.10以前の場合
実はメインはこちらで、私の環境はGCFでNode.jsのバージョンがv10(しかもベータ)で使用できない
stack overflowに載っている再起で削除するのもなんとなく気乗りしない。
パッケージ導入もできることなら避けたい。
そんな中、Rashさんが載せていたOSのコマンド使う案が気に入った。
私のPJはクラウドとローカルの両方で実行可能で、今回のフォルダ削除はローカルのWindows環境でしか実行しない。
GCFもあと半年もすればv12になるだろうからそれまでの間、OSのコマンドでハマるリスクを回避するのがベストだろう。
Windowsのフォルダ削除コマンドrmdirをコールして、hogeというフォルダを削除するサンプルコード。
async関数の未捕縛例外は正常終了するため、catchして終了コードを書き換えている。
constutil=require('util');constexec=util.promisify(require('child_process').exec);(async()=>{try{constpath='hoge';// Rewrite to your folderconst{stdout,stderr}=awaitexec(`rmdir /s /q ${path}`);console.log('stdout:',stdout);console.error('stderr:',stderr);}catch(e){console.error(e);process.exit(1);}})();
注意点は以下の二点。
- child_processのexecメソッドはOSコマンドインジェクションのリスクがあるため、フォルダ名を指定可能にする場合には不正なコードが割り込まないようにすること。
- フォルダがないとエラーになるため、呼び出す前にフォルダの存在確認が必要。
Conclusion
Node v12.10より、フォルダ削除をスマートに行える未来が来ていることを理解した。
APIリファレンスやバージョンアップ時の新機能は抑えないとだめだなと思った次第。
GCFにもv12はよ…
Have a great day!
Appendices
なし
References
本体に全て掲載