最近、仕事でも自分用でも使っていた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 ***"というような、強制削除機能があっても良さそうなものですが、どうやら、デメリットを危惧するあまり、こうした機能を手軽に付けていないのではないかと想像できます。
でも、安全を確認した上でやりたくても出来ないということでは、システムとして成り立ちません。
ということで、強制削除するプログラムを書いてみました。
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登録して、配布してもいいかもですね。
え?もしかして、もうある?だったら、先に教えてよ〜〜〜!
0 件のコメント:
コメントを投稿