2

Node.jsからシステムのmtime解像度を確認するにはどうすればよいですか?

なぜ私が尋ねているのか

Node.jsでは、fs.watch重複するchangeイベントが発生することがあります。冗長なアクションを回避するために、次のようなコードを使用するのが一般的です(CoffeeScriptのcoffeeユーティリティから):

  if event is 'change'
    fs.stat source, (err, stats) ->
      throw err if err
      return if stats.size is prevStats.size and
        stats.mtime.getTime() is prevStats.mtime.getTime()
      prevStats = stats
      ...

問題は次のとおりです。OSXでは、基盤となるHFS +ファイルシステムのためmtime、解像度は1秒しかありません。つまり、mtime.getTime()値は次の形式になります

1322068921000

したがって、2つの変更が互いに1秒以内に発生する場合は常に、2番目の変更がファイルのに影響を与えない可能性がありますmtime。チェックのおかげでstats.size、これは2番目の変更がファイルのサイズに影響を与えなかった場合にのみ問題になります。それでも、それは問題です。

change信頼できる解決策は、mtime間隔でイベントを「デバウンス」することです。つまり、OS Xでは、achangeが発生すると、1秒待って処理します(これにより、同じものを持つ可能性のあるすべての変更イベントがグループ化されますmtime)。ただし、最大公約数を採用するのではなく、各ファイルシステムで可能な限り最小の時間だけイベントを遅らせたいと思います。

4

2 に答える 2

1

いくつかのディレクトリ(/ tmpなど)内のすべてのファイルを繰り返し、次のようなことを行います

files.forEach(function(filename) {
    sum += fs.statSync(filename).mtime % 1000;
});

if (sum == 0) {
   // supports only 1 second resolution
} 

少しハッキー、私は知っています。

于 2011-11-23T19:03:37.797 に答える