Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8873

[Node.js]フォルダを配下のファイルも含めて一括削除する(since 2019)

$
0
0

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(しかもベータ)で使用できない:sob:
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

本体に全て掲載


Viewing all articles
Browse latest Browse all 8873

Trending Articles