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 查找新建元素代码
Jul 06 Javascript
javascript中的float运算精度实例分析
Aug 21 Javascript
js调用浏览器打印模块实现点击按钮触发自定义函数
Mar 21 Javascript
利用jquery操作Radio方法小结
Oct 20 Javascript
JS限制文本框只能输入数字和字母方法
Feb 28 Javascript
JS中生成随机数的用法及相关函数
Jan 09 Javascript
vue2滚动条加载更多数据实现代码
Jan 10 Javascript
label+input实现按钮开关切换效果的实例
Aug 16 Javascript
深入理解JavaScript和TypeScript中的class
Apr 22 Javascript
angular的输入和输出的使用方法
Sep 22 Javascript
echarts统计x轴区间的数值实例代码详解
Jul 07 Javascript
利用JS判断元素是否为数组的方法示例
Jan 08 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
PHPnow安装服务[apache_pn]失败的问题的解决方法
2010/09/10 PHP
七款最流行的PHP本地服务器分享
2013/02/19 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
正则表达式判断是否存在中文和全角字符和判断包含中文字符串长度
2008/09/27 Javascript
js form 验证函数 当前比较流行的错误提示
2009/06/23 Javascript
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
js读写(删除)Cookie实例详解
2013/04/17 Javascript
jquery实现人性化的有选择性禁用鼠标右键
2014/06/30 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
2016/03/30 Javascript
jquery实现ajax提交表单信息的简单方法(推荐)
2016/08/24 Javascript
微信小程序实现图片轮播及文件上传
2017/04/07 Javascript
基于JS脚本语言的基础语法详解
2017/07/22 Javascript
jQuery中库的引用方法
2018/01/06 jQuery
详解Vue用cmd创建项目
2019/02/12 Javascript
Node.js实现批量下载图片简单操作示例
2020/01/18 Javascript
JavaScript中的全局属性与方法深入解析
2020/06/14 Javascript
[02:44]DOTA2英雄基础教程 钢背兽
2013/12/19 DOTA
[01:45]绝对公平!DOTA2队长征召模式详解
2014/04/25 DOTA
pandas string转dataframe的方法
2018/04/11 Python
解决Django中多条件查询的问题
2019/07/18 Python
关于阿里云oss获取sts凭证 app直传 python的实例
2019/08/20 Python
tensorflow求导和梯度计算实例
2020/01/23 Python
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
个人找工作求职简历的自我评价
2013/10/20 职场文书
干部行政关系介绍信
2014/01/17 职场文书
党员大会主持词
2014/04/02 职场文书
小学生运动会报道稿
2014/09/12 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
学术会议通知
2015/04/15 职场文书
2015年大学生村官工作总结
2015/04/21 职场文书
承诺书范本大全
2015/05/04 职场文书
2015年会计年终工作总结
2015/05/26 职场文书
导游词之无锡东林书院
2019/12/11 职场文书
python实现手机推送 代码也就10行左右
2022/04/12 Python