如何从 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
...
这就是问题所在:在 OS X 下,由于底层 HFS+ 文件系统,mtime
分辨率只有 1 秒。也就是说,mtime.getTime()
值的形式为
1322068921000
因此,每当在 1 秒内发生两次更改时,第二次更改就有可能不会影响文件的mtime
. 多亏了stats.size
检查,如果第二次更改对文件大小没有影响,这只是一个问题。不过,这仍然是个问题。
change
一个可靠的解决方案是按 mtime 间隔“去抖动”事件;即在 OS X 下,当 achange
发生时,我会等待 1 秒对其采取行动(从而将可能具有相同的所有更改事件mtime
组合在一起)。但是我想在每个文件系统下将事件延迟尽可能短的时间,而不是采用最大的公分母。