【问题标题】:Node.JS: How does "fs.watchFile" work?Node.JS:“fs.watchFile”是如何工作的?
【发布时间】:2011-03-22 16:33:28
【问题描述】:

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

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

它也说

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

这表明它将根据间隔中的内容每隔一段时间检查一次。但它也说

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

这是否意味着它会每毫秒检查文件时间是否更改?它是否侦听操作系统级别的事件?它是如何工作的?

【问题讨论】:

  • 我认为这是stackoverflow.com/questions/4482352/…的副本
  • 查看 tjameson 的回答:虽然它可能是重复的,但在那个旧问题中提供的答案已经过时了。我认为截至 2013 年,更多的现代解决方案比比皆是。
  • 值得注意的是,在 Node v6 中,默认值为 { persistent: true, interval: 5007 }。 0 的区间没有逻辑意义。在提出问题时,情况似乎并非如此,但 the current implementation in the C source 将 0 更改为 1:ctx->interval = interval ? interval : 1;

标签: filesystems node.js filesystemwatcher


【解决方案1】:

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

【讨论】:

  • 这是在 Windows 上的 Cygwin(unix 模拟器)上进行测试,最终将在 Solaris 中使用。
  • 我相信 Node.js 仅在 Linux 上受支持,因此它可能会在不支持 inotify 的情况下进行某种轮询。
  • @tjameson 你提到不要用这个观看大量文件或文件夹。您有没有想到更适合查看大量文件或文件夹的方法?
  • @tjameson File Watch 现在支持 Windows。
  • @tjameson 你介意发布一个小例子,说明你如何将 node-inotify-pluspls 与 node-walk 集成,如果你有它,请 :)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-18
    • 2012-09-23
    • 1970-01-01
    • 2012-03-17
    • 2012-09-19
    • 2011-08-16
    • 2011-07-08
    • 1970-01-01
    相关资源
    最近更新 更多