Node.js fs.watch

🌙
手机阅读
本文目录结构

Node.js fs.watch(filename[, options][, listener])

版本历史

  • filename < string> | < Buffer> | < URL>

  • options < string> | < Object>

    • persistent < boolean> 指示如果文件已正被监视,进程是否应继续运行。默认值: true。
    • recursive < boolean> 指示应该监视所有子目录,还是仅监视当前目录。这适用于监视目录时,并且仅适用于受支持的平台(参阅注意事项)。默认值: false。
    • encoding < string> 指定用于传给监听器的文件名的字符编码。默认值: ‘utf8’。
  • listener < Function> | < undefined> 默认值: undefined。

    • eventType < string>
    • filename < string> | < Buffer>
  • 返回: < fs.FSWatcher>

监视 filename 的更改,其中 filename 是文件或目录。

第二个参数是可选的。 如果 options 传入字符串,则它指定 encoding。 否则, options 应传入对象。

监听器回调有两个参数 (eventType, filename)。 eventType 是 ‘rename’ 或 ‘change’, filename 是触发事件的文件的名称。

在大多数平台上,每当文件名在目录中出现或消失时,就会触发 ‘rename’ 事件。

监听器回调绑定在由 fs.FSWatcher 触发的 ‘change’ 事件上,但它与 eventType 的 ‘change’ 值不是一回事。

注意事项

fs.watch 的 API 在各个平台上并非 100% 一致,在某些情况下不可用。

仅在 macOS 和 Windows 上支持 recursive 选项。

可用性

此特性取决于底层操作系统,提供了一种通知文件系统更改的方法。

  • 在 Linux 系统上,使用 inotify(7)。
  • 在 BSD 系统上,使用 kqueue(2)。
  • 在 macOS 系统上,对文件使用 kqueue(2),对目录使用 FSEvents。
  • 在 SunOS 系统上(包括 Solaris 和 SmartOS),使用事件端口。
  • 在 Windows 系统上,此特性取决于 ReadDirectoryChangesW。
  • 在 Aix 系统上,此特性取决于 AHAFS 必须启动。

如果底层功能由于某些原因不可用,则 fs.watch 将无法运行。 例如,当使用虚拟化软件(如 Vagrant、Docker 等)时,在网络文件系统(NFS、SMB 等)或主文件系统上监视文件或目录可能是不可靠的,在某些情况下也是不可能的。

仍然可以使用 fs.watchFile(),因为它使用 stat 轮询 ,但这种方法较慢且不太可靠。

索引节点

在 Linux 或 macOS 系统上, fs.watch() 解析路径到索引节点并监视该索引节点。 如果删除并重新创建监视的路径,则会为其分配一个新的索引节点。 监视器会因删除而触发事件,但会继续监视原始的索引节点。 不会因新建索引节点而触发事件。 这是预期的行为。

AIX 文件在文件的生命周期中保留相同的索引节点。 在 AIX 上保存和关闭监视的文件将导致两个通知(一个用于添加新内容,一个用于截断)。

文件名参数

仅在 Linux、macOS、Windows 和 AIX 上支持在回调中提供 filename 参数。 即使在支持的平台上,也不总是保证提供 filename。 因此,不要假设在回调中始终提供 filename 参数,并且如果它为 null 则需要一些后备逻辑。

fs.watch('somedir', (eventType, filename) => {
  console.log(`事件类型是: ${eventType}`);
  if (filename) {
    console.log(`提供的文件名: ${filename}`);
  } else {
    console.log('文件名未提供');
  }
});

更多内容请参考:Node.js fs 文件系统,或者通过 点击对应菜单 进行查看;



AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

目前重心已经放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>