欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

node.js 如何监视文件变化

程序员文章站 2022-06-23 18:26:00
fs.fswatcherfs.fswatcher类 继承了 eventemitter,用于监视文件变化,调用 fs.watch 后返回一个 fs.fswatcher 实例,每当指定监视的文件被修改时,...

fs.fswatcher

fs.fswatcher类 继承了 eventemitter,用于监视文件变化,调用 fs.watch 后返回一个 fs.fswatcher 实例,每当指定监视的文件被修改时,实例会触发事件调用回调函数

fs.watch()

fs.watch(filename[, options][, listener]) 监视文件变化,返回 fs.fswatcher 实例

1.filename:文件或文件夹路径

2.options

  • encoding
  • recursive:默认值 false,应该监视所有子目录,还是仅监视当前目录,仅在 macos 和 windows 上支持
  • persistent:默认值 true,指示如果文件已正被监视,进程是否应继续运行
  • listener(eventtype, filename):文件变化回调函数

eventtype 主要是 renamechange ,在大多数平台上,文件在目录中出现或消失时触发 'rename' 事件,在 windows 上,如果监视的目录被移动或重命名,则不会触发任何事件,当监视的目录被删除时,则报告 eperm 错误

fs.watchfile()

fs.watchfile(filename[, options], listener) 用于监视文件变化

1.filename

2.options

  • biginit:默认值 false,指定回调 stat 中的数值是否为 biginit 类型
  • persistent:默认值 true,当文件正在被监视时,进程是否应该继续运行
  • interval:默认值 5007,用来指定轮询频率(ms)

3.listener(currentstats, previousstats):listener 有两个参数,当前的 stat 对象和之前的 stat 对象
要在修改文件时收到通知,则需要比较 curr.mtime prev.mtime

fs.watch() 与 fs.watchfile()

因为 fs.watchfile() 使用轮训方式检测文件变化,如果不设置 interval 或者设置较高的值会发现文件变化的监视有延迟
而 fs.watch() 监听操作系统提供的事件,而且可以监视目录变化,使用 fs.watch() 比 fs.watchfile() 更高效,平常应尽可能使用 fs.watch() 代替 fs.watchfile()

当然 fs.watch() 依赖操作系统的实现,在不同平台上表现会有差异

  • linux 操作系统使用 inotify
  • 在 macos 系统使用 fsevents
  • 在 windows 系统使用 readdirectorychangesw

fs.unwatchfile

fs.unwatchfile(filename[, listener]) 停止监视 filename 的变化,如果指定了 listener,则仅移除此特定监听器,否则将移除所有监听器,从而停止监视 filename

fs.unwatchfile('./test.txt');

社区选择

fs.watchfile() 性能问题,fs.watch() 平台不一致等两个方法都有不尽如人意的地方

node.js fs.watch:

macos 有时候不提供 filename
在部分场景不触发修改事件(macos sublime)
经常一次修改两次触发事件
大部分文件变化 eventtype 都是 rename.
未提供简单的监视文件树方式

node.js fs.watchfile:

事件处理问题和 fs.watch 一样烂
没有嵌套监听
cpu 消耗大

日常在监视文件变化可以选择社区的优秀方案

以上就是node.js 如何监视文件变化的详细内容,更多关于node.js 监视文件的资料请关注其它相关文章!