fs.watchでハマったところ

node.jsでファイルを監視したくてfs.watchを使ってみたのですが、ちょっとハマったのでメモを。
環境:Ubuntu 11.10 64bit / nodebrew 0.5.0 / node 0.6.14

やりたいこと

  • ファイルが保存されたことを検知
  • ファイルの内容を読み込み
  • 読み込んだデータを出力

コード

このコードを実行中に./aaa.txtというファイルが変更されたら、それを表示しなおすスクリプトです。

#!/usr/bin/env node
// watchFile.js

var fs = require('fs')
  ;

var watchFile = './aaa.txt'
  ;

function watch(event, filename) {

  // ファイル内容が変わったイベントでないなら無視
  if (event !== 'change') {
    return;
  }

  fs.readFile(filename, 'utf8', function (err, data) {
    if (err) throw err;
    console.log(data);
    fs.watch(watchFile, watch); // ここが大事
  });
}

fs.watch(watchFile, watch);

実行

$ touch aaa.txt
$ node watchFile.js

実行中にaaa.txtを変更してみると、標準出力に保存されている内容が表示されます。


てっきりfs.watchを一度実行するとずっと監視してくれるのかと思っていたら、イベントが終わったあとに登録し直さないといけないみたいで。
第二引数に指定できる、persistentにtrueを渡すことでそれが実現できるのかと思ったら、そうでもないみたいですし。


「ファイルが監視されている間、プロセスが実行し続ける」ってどういう意味だろう?trueだとプロセスが終わろうとしても監視を続けるってこと?


追記:
多分使い方間違ってる……