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 相关文章推荐
jQuery 创建Dom元素
May 07 Javascript
javscript对象原型的一些看法
Sep 19 Javascript
jqPlot 基于jquery的画图插件
Apr 26 Javascript
Javascript实现返回上一页面并刷新的小例子
Dec 11 Javascript
js实现带有介绍的Select列表菜单实例
Aug 18 Javascript
js 获取经纬度的实现方法
Jun 20 Javascript
走进javascript——不起眼的基础,值和分号
Feb 24 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
Mar 23 Javascript
JavaScript中递归实现的方法及其区别
Sep 12 Javascript
php 解压zip压缩包内容到指定目录的实例
Jan 23 Javascript
解决layui表格内文本超出隐藏的问题
Sep 12 Javascript
js实现翻牌小游戏
Jul 31 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数据库解决方案分析介绍
2015/09/24 PHP
php图片添加文字水印实现代码
2016/03/15 PHP
zen cart实现订单中增加paypal中预留电话的方法
2016/07/12 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
jquery简单体验
2007/01/10 Javascript
json跟xml的对比分析
2008/06/10 Javascript
Jquery Ajax的Get方式时需要注意URL地方
2011/04/07 Javascript
nodejs npm包管理的配置方法及常用命令介绍
2014/06/05 NodeJs
js动态往表格的td中添加图片并注册事件
2014/06/12 Javascript
JavaScript的null和undefined区别示例介绍
2014/09/15 Javascript
jQueryUI DatePicker 添加时分秒
2016/06/04 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
微信小程序  audio音频播放详解及实例
2016/11/02 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2017/01/22 Javascript
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
JS实现扫码枪扫描二维码功能
2020/01/03 Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
2020/05/09 Javascript
Python subprocess模块功能与常见用法实例详解
2018/06/28 Python
运用PyTorch动手搭建一个共享单车预测器
2019/08/06 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
2019/11/21 Python
Python3的socket使用方法详解
2020/02/18 Python
OpenCV Python实现拼图小游戏
2020/03/23 Python
python seaborn heatmap可视化相关性矩阵实例
2020/06/03 Python
Python 内存管理机制全面分析
2021/01/16 Python
使用HTML5和CSS3表单验证功能
2017/05/05 HTML / CSS
在HTML5 Canvas中放入图片和保存为图片的方法
2014/05/03 HTML / CSS
分别介绍一下Session Bean和Entity Bean
2015/03/13 面试题
文秘专业毕业生就业推荐信
2013/11/08 职场文书
经典优秀毕业生求职信范文分享
2013/12/18 职场文书
大学军训感言800字
2014/02/27 职场文书
基层党员四风问题自我剖析材料
2014/09/29 职场文书
我爱我班主题班会
2015/08/13 职场文书
大学军训口号大全
2015/12/24 职场文书
公司与个人合作协议书
2016/03/19 职场文书
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript
Zabbix对Kafka topic积压数据监控的解决方案
2022/07/07 Servers