Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

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

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して終了コードを書き換えている。

const util = require('util');
const exec = util.promisify(require('child_process').exec);

(async () => {
    try {
        const path = 'hoge'; // Rewrite to your folder

        const { stdout, stderr } = await exec(`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

本体に全て掲載

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
2
Help us understand the problem. What are the problem?