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 相关文章推荐
js下弹出窗口的变通
Apr 18 Javascript
jQuery对Select的操作大集合(收藏)
Dec 28 Javascript
javascript操作excel生成报表全攻略
May 04 Javascript
jquery 中的each()跳出循环的语句
May 23 Javascript
JS获取多维数组中相同键的值实现方法示例
Jan 06 Javascript
JavaScript严格模式详解
Jan 16 Javascript
vue 2.1.3 实时显示当前时间,每秒更新的方法
Sep 16 Javascript
详解ES6中的 Set Map 数据结构学习总结
Nov 06 Javascript
node.js的Express服务器基本使用教程
Jan 09 Javascript
Vue封装的组件全局注册并引用
Jul 24 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
Jan 11 jQuery
Antd下拉选择,自动匹配功能的实现
Oct 24 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输出缓存(output_buffering)的深入理解
2013/06/13 PHP
PHP 生成N个不重复的随机数
2015/01/21 PHP
浅析iis7.5安装配置php环境
2015/05/10 PHP
深入了解PHP中的Array数组和foreach
2016/11/06 PHP
PHP对象、模式与实践之高级特性分析
2016/12/08 PHP
PHP的重载使用魔术方法代码实例详解
2021/02/26 PHP
filemanage功能中用到的lib.js
2007/04/08 Javascript
获取服务器传来的数据 用JS去空格的正则表达式
2012/03/26 Javascript
jQuery中的read和JavaScript中的onload函数的区别
2014/08/27 Javascript
JavaScript中的操作符类型转换示例总结
2016/05/30 Javascript
轻松掌握JavaScript状态模式
2016/09/07 Javascript
基于JavaScript实现自动更新倒计时效果
2016/12/19 Javascript
JS中IP地址与整数相互转换的实现代码
2017/04/10 Javascript
react开发教程之React 组件之间的通信方式
2017/08/12 Javascript
微信小程序之数据缓存的实例详解
2017/09/29 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
2019/05/14 Javascript
Python中random模块生成随机数详解
2016/03/10 Python
Python简单计算文件MD5值的方法示例
2018/04/11 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
Pyinstaller打包.py生成.exe的方法和报错总结
2019/04/02 Python
由Python编写的MySQL管理工具代码实例
2019/04/09 Python
详解python运行三种方式
2019/05/13 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
如何提高python 中for循环的效率
2020/04/15 Python
Python爬虫抓取论坛关键字过程解析
2020/10/19 Python
MVMT手表官方网站:时尚又实惠的高品质手表
2016/12/04 全球购物
美国购买肉、鸭、家禽、鹅肝和熟食网站:D’Artagnan
2018/11/13 全球购物
什么是makefile? 如何编写makefile?
2013/01/02 面试题
往来会计岗位职责
2013/12/19 职场文书
如何写一份好的自荐信
2014/01/02 职场文书
青年文明号服务承诺
2014/03/31 职场文书
门卫岗位职责说明书
2014/08/18 职场文书
CSS 伪元素::marker详解
2021/06/26 HTML / CSS
AngularJS实现多级下拉框
2022/03/25 Javascript
Spring Boot 实现 WebSocket
2022/04/30 Java/Android