您好,欢迎访问一九零五行业门户网

浅谈Node.js监视文件变化的方法

相关推荐:《nodejs 教程》
fs.fswatcherfs.fswatcher类 继承了 eventemitter,用于监视文件变化,调用 fs.watch 后返回一个 fs.fswatcher 实例,每当指定监视的文件被修改时,实例会触发事件调用回调函数
fs.watch('./tmp', (eventtype, filename) => {  if (filename) {    console.log(filename);  }});
fs.watch()fs.watch(filename[, options][, listener]) 监视文件变化,返回 fs.fswatcher 实例
1、filename:文件或文件夹路径
2、options
encodingrecursive:默认值 false,应该监视所有子目录,还是仅监视当前目录,仅在 macos 和 windows 上支持persistent:默认值 true,指示如果文件已正被监视,进程是否应继续运行listener(eventtype, filename):文件变化回调函数eventtype 主要是 rename 和 change ,在大多数平台上,文件在目录中出现或消失时触发 'rename' 事件,在 windows 上,如果监视的目录被移动或重命名,则不会触发任何事件,当监视的目录被删除时,则报告 eperm 错误
fs.watch('./', { recursive: true }, (eventtype, filename) => {  console.log(eventtype, filename);});
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
const fs = require('fs');fs.watchfile('./test.txt', { interval: 100 }, (curr, prev) => {  console.log('当前的最近修改时间是: ' + curr.mtime);  console.log('之前的最近修改时间是: ' + prev.mtime);});const tid = setinterval(() => {  fs.appendfile('./test.txt', 'hello, world!\n', err => {    if (err) throw err;    console.log('文件修改完成');  });}, 300);settimeout(() => {  clearinterval(tid);  fs.unwatchfile('./test.txt');}, 2000);
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.unwatchfilefs.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 消耗大https://www.npmjs.com/package/chokidar
日常在监视文件变化可以选择社区的优秀方案
node-watch
chokidar
const chokidar = require('chokidar'); // one-liner for current directorychokidar.watch('.').on('all', (event, path) => {  console.log(event, path);});
// initialize watcher.const watcher = chokidar.watch('file, dir, glob, or array', {  ignored: /(^|[\/\\])\../, // ignore dotfiles  persistent: true}); // something to use when events are received.const log = console.log.bind(console);// add event listeners.watcher  .on('add', path => log(`file ${path} has been added`))  .on('change', path => log(`file ${path} has been changed`))  .on('unlink', path => log(`file ${path} has been removed`)); // more possible events.watcher  .on('adddir', path => log(`directory ${path} has been added`))  .on('unlinkdir', path => log(`directory ${path} has been removed`))  .on('error', error => log(`watcher error: ${error}`))  .on('ready', () => log('initial scan complete. ready for changes'))  .on('raw', (event, path, details) => { // internal    log('raw event info:', event, path, details);  });
更多编程相关知识,请访问:编程视频!!
以上就是浅谈node.js监视文件变化的方法的详细内容。
其它类似信息

推荐信息