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

根据Node 0.4.3的API文档 , fs.watchFile(filename, [options], listener)函数启动一个例程

注意filename变化。 每次访问文件时都会调用callback监听器。

它也说

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

这表明它会根据间隔时间来检查每一个。 但它也说

缺省值是{ persistent: true, interval: 0 }

那么这是否意味着它将检查每一毫秒,看文件时间是否改变? 它是否监听操作系统级别的事件? 这是如何运作的?

是的,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版本。

为了延伸tjameson的梦幻般的答案,你可以使用watchr来规范节点versiosn和OS之间的差异。 它还提供了unlinknew unlink事件,而不仅仅是change ,还增加了对目录树监视的支持。