[Nodejs] 多重階層のフォルダを一括で削除するスニペット

Posted on 2022/01/11 by 弓削田公司
#Nodejs#ファイル操作
最近、仕事でも自分用でも使っていたweb用フレームワークをPHPからNodejsに変更した、ユゲタです。 Nodejsって、Javascriptベースだから便利というわけではなく、おそらくサーバーサイドも、フロントサイドも、非同期も、理解していないと、 まったくもって、意味がわからない仕組みなのではないかと思います。 ReactやView.jsなどを使っている人は、慣れっこなのかもしれませんが、サーバーサイドのCGI系ばかりを使っている人からすると、 サーバー側処理とクライアント処理がごっちゃになって、しかも、どちらもJavascriptなんでワケワカメになってしまうんじゃないかな〜と・・・ ユゲタも、たまにごっちゃになっていしまうこともありますが、改めてしっかりと設計をしてプログラミングすれば、 そういう自体は大体回避出来ることも、最近覚えました。

階層がいくつもあるフォルダの削除が難しいんじゃ

そんな、Nodejs系フレームワークを自作している時に、サーバーに溜め込んだデータなどを一括で削除したいという場面があり、 ファイル操作はfsライブラリを使って行うのが、nodejsのセオリーなんですが、nodejsでは、下記のように書くことで、フォルダ削除できるようですが、この機能がまだまだ実験段階ということで、安定しないということと、下位バージョンによっては、エラーになってしまうので、安定したプログラムを書いてみたいと思いました。
fs.rmdir(dir, { recursive: true });
参考 : https://qiita.com/qrusadorz/items/aa6ac6a6d6b3e7d458d5

ファイルを全て削除してからフォルダを削除する方法

Linuxコマンドの "rm -rf ***"というような、強制削除機能があっても良さそうなものですが、どうやら、デメリットを危惧するあまり、こうした機能を手軽に付けていないのではないかと想像できます。 でも、安全を確認した上でやりたくても出来ないということでは、システムとして成り立ちません。 ということで、強制削除するプログラムを書いてみました。 rm_all.js var fs = require('fs'); module.exports = function(path){ if(!path){ return { status : "error", message : "not designation path." }; } if(fs.existsSync(path) === false){ return { status : "error", message : "not exists. ("+ path +")" }; } // remove-all var counts = rmPaths(path); // return return { status : "ok", message : "directory removed.", count : counts }; }; function rmPaths(path){console.log(path); var counts = 0; switch(checkPathType(path)){ case "dir": let dir = path.replace(/\/$/g , ""); var lists = fs.readdirSync(path); for(let p of lists){ counts += rmPaths(dir +"/"+ p); } fs.rmdirSync(path); break; case "file": fs.unlinkSync(path); break; } counts++; return counts; } function checkPathType(path){ if(!fs.existsSync(path)){return;} return (fs.lstatSync(path).isDirectory()) ? "dir" : "file"; }; これを次のように使うと、恐らく想定した動作になるでしょう。 require("rm_all")(%削除したいフォルダ);

解説

基本的に一番古いfsのバージョンを使っても動作するように、コッテコテの書き方をしましたが、 要するに、上位階層でファイルをどんどん削除していって、フォルダにぶち当たった場合は、その中身を再帰的に処理するようにしています。 ユゲタのNodeフレームワークは、これで上手いこ動作して便利に使えています。 良かったら、使ってみてください。 npm登録して、配布してもいいかもですね。 え?もしかして、もうある?だったら、先に教えてよ〜〜〜!
SNS
Groups
  • テクノロジー
  • ビジネス
  • 日記
  • 映画
  • マーケティング
  • 学習
Tags
  • #PHP
  • #コマンド
  • #Docker
  • #Error
  • #ライフプラン
  • #思考
  • #コミュニケーション
  • #プログラミング学習
  • #思考学習
  • #モチベーション
  • #学習ポイント
  • #Javascript
  • #AudioAPI
  • #思考法
  • #成功する秘訣
  • #Cinema
  • #マネタイズポイント
  • #Job
  • #魔法の言葉
  • #Idea
  • ...
関連記事