概要
Node.jsを使って「こまけぇこたぁいいんだよ」マインドでファイル操作を実装した。
2019/12/13追記
事実を誤認させると感じたのでタイトルを変更
- 変更前「Node.jsを使った簡単なファイル操作」
- 変更後「Node.jsを使ったやっつけのファイル操作」
2018/08/07追記
以下のように記述の誤りの指摘があったので主にサンプルコードの記述を修正しています。
今「node fs」で検索するとこの記事めちゃくちゃ上に来るんですね!びっくりした!
まだ記述がおかしいところもあると思うので気づいてくれた方はコメントで指摘していただけると幸いです。
関数の用途もそうではあるけど、説明(fsは関数じゃねえ)もズレてるし、自分で定義したcheck関数呼ぶときに引数与えてないし、いきなりthis書いてあるしで、なんかお前動かしてないだろ!ってのが滲み出てて辛かった
— たっこん (@takkkolive) 2018年8月2日
公式モジュールfs
Node.jsには公式モジュールのfs
があるのでそれを使用する。
File System | Node.js v7.4.0 Documentation
ドキュメントにてメソッドを確認するとわかる通り、通常メソッドと、Syncメソッドが存在している。
メソッドの実行は基本的に非同期で行われるため、例えばファイルの存在チェックを行なった場合、fs.stat
を用いると「ファイルが存在しているのにエラーが返る」ことがある。
今回は速度とか「こまけぇこたぁいいんだよ」マインドでfs.statSync
などの同期実行メソッドを使っていく。
とりあえずvar fs = require('fs');
するのを忘れないように。
ファイルの存在確認
ファイルの存在確認にはfs.statSync
を用いる。
ファイルが存在しないとエラーになるのでtryしてcatchしてあげよう。
function check(filePath) {
var isExist = false;
try {
fs.statSync(filePath);
isExist = true;
} catch(err) {
isExist = false;
}
return isExist;
}
ファイルの中身を読む
ファイルの中身を読むにはfs.readFileSync
を用いる。
先に実装した存在チェックを用いているが、try/catchで十分な気もする。
function read(filePath) {
var content = new String();
if(check(filePath)) {;
content = fs.readFileSync(filePath, 'utf8');
}
return content;
};
ファイルに書き込む
ファイルに書き込むにはfs.writeFileSync
を用いる。
ファイルが存在しない場合はファイル作成からやってくれる。
このメソッドを使う場合、ファイルの内容を丸々書き換えてしまうので注意が必要。
追記にはfs.appendFileSync
とか使うといいのかもしれない。知らんけど。
function write(filePath, stream) {
var result = false;
try {
fs.writeFileSync(filePath, stream);
return true;
} catch(err) {
return false;
}
}
ファイルを削除する
ファイルを削除する場合はfs.unlinkSync
を用いる。
rmとかmvとかdeleteとかじゃないんだー。
追記(2019/06/20): deleteが予約語で使えないという指摘をいただいたので修正します
function deleteFile(filePath){
var result = false;
try {
fs.unlinkSync(filePath);
return true;
} catch(err) {
return false;
}
}
テストケース
テストコードは次のように書くとスムーズ
- ファイルが存在しないことをcheck
- ファイルにwrite
- ファイルが存在することをcheck
- ファイルをread
- ファイルをdelete
- ファイルが存在しないことをcheck
まとめ
あくまで動かすサービス(で合ってる?)は1こだけ、というミニマルなシステムの中で動かすこと前提で書いたコード。
同時に複数起動する場合、ファイルアクセスの監視(fs.watch
とか)とかファイル編集のロックとかも実装しなきゃいけないし、それに伴ってdurationの設定とかもしなきゃいけないから注意してほしい。
参考
Node.jsでファイルに書き込むサンプル - 感謝のプログラミング 10000時間
fs.statSyncでファイルの存在判定 - Qiita
nodejsでファイルを削除する - みんなのちからになりたい