Node.JS:“fs.watchFile”如何工作?

时间:2011-03-22 16:33:28

标签: filesystems node.js filesystemwatcher

根据API docs for Node 0.4.3fs.watchFile(filename, [options], listener)函数启动一个

的例程
  

关注filename的变化。每次访问文件时都会调用callback侦听器。

它也说

  

如果提供的options应该是一个包含两个成员的对象,一个布尔值,persistentinterval,一个以毫秒为单位的轮询值

这表示它将根据间隔内的频率进行检查。但它也说

  

默认值为{ persistent: true, interval: 0 }

这是否意味着它将检查每毫秒以查看文件时间是否已更改?它是否监听操作系统级事件?这有什么作用?

2 个答案:

答案 0 :(得分:12)

是的,cpedros是正确的,这似乎是重复的。我想我可以对此有所了解。

每个操作系统都有自己的文件更改事件被触发。在Linux上,它是inotify(曾经是dnotify),在Mac上它是fsevents,而在Windows上它是FileSystemWatcher。我不确定底层代码是否处理每个案例,但这是一般的想法。

如果您只想在Linux上观看文件,我建议node-inotify-plus-plus。如果要查看目录,请使用inotify-plus-plus和node-walk。我已经实现了它,它就像一个魅力。

如果您有兴趣,我可以发布一些代码。 node-inotify-plus-plus背后的美妙之处在于它抽象了inotify的大部分内容,并提供了一个直观的API来监听文件中的特定事件。

编辑:这不应该用于观看大量的文件。在我的系统上,最大值为8192.使用此命令cat /proc/sys/fs/inotify/max_user_watches可以找到最大值。这可以用于仅查看目录以进行更改,然后从中找出各个文件。如果直接在该目录下的文件被修改,则会触发修改后的事件。

编辑:感谢@guiomie指出现在Windows上完全支持观看文件。我假设这是v0.6.x版本。

答案 1 :(得分:3)

要扩展tjameson的精彩答案,您可以使用watchr来规范化节点versiosn和操作系统观察差异之间的API。它还为unlinknew而不仅仅是change提供了事件,并添加了对目录树观看的支持。