Edited at

Node.jsを使った簡単なファイル操作


概要

Node.jsを使って「こまけぇこたぁいいんだよ」マインドでファイル操作を実装した。


2018/08/07追記

以下のように記述の誤りの指摘があったので主にサンプルコードの記述を修正しています。

今「node fs」で検索するとこの記事めちゃくちゃ上に来るんですね!びっくりした!

まだ記述がおかしいところもあると思うので気づいてくれた方はコメントで指摘していただけると幸いです。


公式モジュール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でファイルを削除する - みんなのちからになりたい