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
)。ただし、最大公約数を採用するのではなく、各ファイルシステムで可能な限り最小の時間だけイベントを遅らせたいと思います。