LoginSignup
20
20

More than 5 years have passed since last update.

fs.watchFileを使ってみた

Posted at

fs.watchfileとは?

 ファイルの変更を監視して、変化が起きたらcallback関数を呼び出して教えてくれる。node以外では見たことない気がするのは、不勉強かしら。
 とにかく、そういうファイルの変更を検知するやつを作りたかったので、こまかい動きを調べてメモしました。

実験に使ったコード

watchfile.js
var fs = require('fs');

var filepath = 'message.txt';

// filepathが存在しなくても、watchFileはエラーとか出してくれないので、
// 先にfs.existsで調べておく
if (!fs.existsSync(filepath)) {
    console.error('%s doesn\'t exist.', filepath);
    process.exit();
}

console.log('start watch: %s', filepath);
fs.watchFile(filepath, function (curr, prev) {
    // プロパティ丸ごと出力してもらう
    console.dir(curr);

    // 以前のmtimeと比較
    console.log('the current mtime is: ' + curr.mtime);
    console.log('the previous mtime was: ' + prev.mtime);
});

分かったこと

開始時に、指定したfilepathが存在しなくても、特にエラーは発生しない。

  • なので、その前に自分でfs.existsとかしてあげる必要がある。(上のコード参照)

ファイル名を変更しても、ファイルの変更とはみなされない。

  • ただし、ファイル名を変更した後も、監視は続いている。
  • chmodとかは、ちゃんと変更とみなされる。

callbackに帰ってくるのはstatオブジェクト。

  • なので、更新時間や属性などは即時でとれるが、ファイルの内容がどうなったかは、別途fs.readFileなどしないと分からない。
  • diff的な機能もなし。

対象がディレクトリでもちゃんと動く。

  • ディレクトリの中のファイルが変更された時、中にファイルが追加された時等ちゃんと検知します。
  • viで中身のファイル開いた時に、一時ファイルができるのも検知してしまうので、ちょっととまどった。(そりゃそうなんだけど)

当然、「常時待ち」のイベントをひとつ増やすことになる。

  • 例えばexpressサーバーとかは、平常時はhttpサーバーへのアクセスのみ待っている状態になっている。そこに別の常時待ちが入ってくると、なにかしら計算が狂うこともありうる。
  • 自分は、start-stop-daemonとexpressを組み合わせて使っていたので、daemon化する部分にwatchFileの開始処理も組込んでやる必要があった。

そのうち調べる

  • 監視周期1回の間に、変更が2回以上発生したら? (たぶん1回しか反応しないと思うけど)
  • 存在しないファイル名を与えてwatchを開始、その後そのファイルが追加されたら? (たぶん反応しないと思うけど)
  • unwatchも調べなきゃ……。
20
20
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
20