node.js 如何监视文件变化


Posted in Javascript onSeptember 01, 2020

fs.FSWatcher

fs.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

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

eventType 主要是 renamechange ,在大多数平台上,文件在目录中出现或消失时触发 '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.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 消耗大

https://www.npmjs.com/package/chokidar

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

  1. node-watch
  2. chokidar
const chokidar = require('chokidar');
 
// One-liner for current directory
chokidar.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 如何监视文件变化的详细内容,更多关于node.js 监视文件的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
javascript中使用replaceAll()函数实现字符替换的方法
Dec 25 Javascript
Javascript堆排序算法详解
Dec 03 Javascript
JS实现点击按钮自动增加一个单元格的方法
Mar 09 Javascript
跟我学习javascript的prototype,getPrototypeOf和__proto__
Nov 17 Javascript
jquery实现无刷新验证码的简单实例
May 19 Javascript
jQuery内容筛选选择器实例代码
Feb 06 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
Jul 21 Javascript
12条写出高质量JS代码的方法
Jan 07 Javascript
Vue高版本中一些新特性的使用详解
Sep 25 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
Oct 28 Javascript
jQuery实现移动端图片上传预览组件的方法分析
May 01 jQuery
如何利用React实现图片识别App
Feb 18 Javascript
JS JQuery获取data-*属性值方法解析
Sep 01 #jQuery
谈谈node.js中的模块系统
Sep 01 #Javascript
JavaScript浅层克隆与深度克隆示例详解
Sep 01 #Javascript
VUE子组件向父组件传值详解(含传多值及添加额外参数场景)
Sep 01 #Javascript
vue离开当前页面触发的函数代码
Sep 01 #Javascript
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
Sep 01 #Javascript
Node.js web 应用如何封装到Docker容器中
Sep 01 #Javascript
You might like
用PHP写的基于Memcache的Queue实现代码
2011/11/27 PHP
基于PHP+Ajax实现表单验证的详解
2013/06/25 PHP
php实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
修改WordPress中文章编辑器的样式的方法详解
2015/12/15 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
2019/04/04 PHP
Laravel基础_关于view共享数据的示例讲解
2019/10/14 PHP
jquery 入门教程 [翻译] 推荐
2009/08/17 Javascript
js 替换功能函数,用正则表达式解决,js的全部替换
2010/12/08 Javascript
Javascript判断对象是否相等实现代码
2013/03/18 Javascript
获得Javascript对象属性个数的示例代码
2013/11/21 Javascript
浅谈Javascript实现继承的方法
2015/07/06 Javascript
JS实现分页浏览横向图片(类轮播)实例代码
2017/11/06 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
[15:41]教你分分钟做大人——灰烬之灵
2015/03/11 DOTA
Python搜索引擎实现原理和方法
2017/11/27 Python
python实现BackPropagation算法
2017/12/14 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
2018/01/20 Python
Python http接口自动化测试框架实现方法示例
2018/12/06 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
2019/06/04 Python
Pytorch evaluation每次运行结果不同的解决
2020/01/02 Python
Tensorflow Summary用法学习笔记
2020/01/10 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
Pytorch 使用不同版本的cuda的方法步骤
2020/04/02 Python
Python configparser模块常用方法解析
2020/05/22 Python
在线吉他课程,学习如何弹吉他:Fender Play
2019/02/28 全球购物
英国外籍人士的在线超市:British Corner Shop
2019/06/03 全球购物
高级运动鞋:GREATS
2019/07/19 全球购物
德国富尔达运动鞋店:43einhalb
2020/12/25 全球购物
信息技术专业个人自我评价
2013/12/11 职场文书
计算机专业毕业生自我鉴定
2014/01/16 职场文书
初中同学聚会邀请函
2014/02/03 职场文书
减负增效提质方案
2014/05/23 职场文书
干部对照检查材料范文
2014/08/26 职场文书
判缓刑人员个人思想汇报
2014/10/10 职场文书
公司感恩节活动策划书
2014/10/11 职场文书
Canvas三种动态画圆实现方法说明(小结)
2021/04/16 Javascript