阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      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 文件系统,或者通过 点击对应菜单 进行查看;


      目录
      目录