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 动态云标签插件
Nov 11 Javascript
javascript事件模型实例分析
Jan 30 Javascript
JavaScript中setUTCMilliseconds()方法的使用详解
Jun 12 Javascript
jquery Easyui快速开发总结
Aug 20 Javascript
关于JSON与JSONP简单总结
Aug 16 Javascript
ES6中Math对象新增的方法实例详解
Apr 25 Javascript
JavaScript实现省市县三级级联特效
May 16 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
Nov 27 Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
May 03 Javascript
vue keep-alive 动态删除组件缓存的例子
Nov 04 Javascript
vue ajax 拦截原理与实现方法示例
Nov 29 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
May 12 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里面的抽象类
2010/01/28 PHP
php ckeditor上传图片文件名乱码解决方法
2013/11/15 PHP
Codeigniter实现多文件上传并创建多个缩略图
2014/06/12 PHP
浅析PHP中strlen和mb_strlen的区别
2014/08/31 PHP
详解WordPress中提醒安装插件以及隐藏插件的功能实现
2015/12/25 PHP
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
javascript之水平横向滚动歌词同步的应用
2007/05/07 Javascript
js仿百度有啊通栏展示效果实现代码
2013/05/28 Javascript
node.js中的fs.write方法使用说明
2014/12/15 Javascript
PHPExcel中的一些常用方法汇总
2015/01/23 Javascript
jquery中的工具使用方法$.isFunction, $.isArray(), $.isWindow()
2015/08/09 Javascript
JS获取html元素的标记名实现方法
2016/10/08 Javascript
深入理解ES6学习笔记之块级作用域绑定
2017/08/19 Javascript
小程序实现左滑删除效果
2019/07/25 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
教你学会使用Python正则表达式
2017/09/07 Python
Anaconda下安装mysql-python的包实例
2018/06/11 Python
python中的单引号双引号区别知识点总结
2019/06/23 Python
pytorch sampler对数据进行采样的实现
2019/12/31 Python
python检查目录文件权限并修改目录文件权限的操作
2020/03/11 Python
Python新手学习raise用法
2020/06/03 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
详解基于python的全局与局部序列比对的实现(DNA)
2020/10/07 Python
利用python 下载bilibili视频
2020/11/13 Python
python安装及变量名介绍详解
2020/12/12 Python
虚拟环境及venv和virtualenv的区别说明
2021/02/05 Python
C#中有没有静态构造函数,如果有是做什么用的?
2016/06/04 面试题
高中地理教学反思
2014/01/29 职场文书
《春到梅花山》教学反思
2014/04/16 职场文书
研修心得体会
2014/09/04 职场文书
初三语文教学计划
2015/01/22 职场文书
评奖评优个人先进事迹材料
2015/11/04 职场文书
浅谈:电影《孔子》观后感(范文)
2019/10/14 职场文书
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL
Win10加载疑难解答时出错发生意外错误的解决方法
2022/07/07 数码科技