node.js 如何监视文件变化
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主要是rename和change,在大多数平台上,文件在目录中出现或消失时触发'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
constfs=require('fs'); fs.watchFile('./test.txt',{interval:100},(curr,prev)=>{ console.log('当前的最近修改时间是:'+curr.mtime); console.log('之前的最近修改时间是:'+prev.mtime); }); consttid=setInterval(()=>{ fs.appendFile('./test.txt','Hello,world!\n',err=>{ if(err)throwerr; 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.jsfs.watch:
MacOS有时候不提供filename
在部分场景不触发修改事件(MacOSSublime)
经常一次修改两次触发事件
大部分文件变化eventType都是rename.
未提供简单的监视文件树方式
Node.jsfs.watchFile:
事件处理问题和fs.watch一样烂
没有嵌套监听
CPU消耗大
https://www.npmjs.com/package/chokidar
日常在监视文件变化可以选择社区的优秀方案
- node-watch
- chokidar
constchokidar=require('chokidar'); //One-linerforcurrentdirectory chokidar.watch('.').on('all',(event,path)=>{ console.log(event,path); });
//Initializewatcher. constwatcher=chokidar.watch('file,dir,glob,orarray',{ ignored:/(^|[\/\\])\../,//ignoredotfiles persistent:true }); //Somethingtousewheneventsarereceived. constlog=console.log.bind(console); //Addeventlisteners. watcher .on('add',path=>log(`File${path}hasbeenadded`)) .on('change',path=>log(`File${path}hasbeenchanged`)) .on('unlink',path=>log(`File${path}hasbeenremoved`)); //Morepossibleevents. watcher .on('addDir',path=>log(`Directory${path}hasbeenadded`)) .on('unlinkDir',path=>log(`Directory${path}hasbeenremoved`)) .on('error',error=>log(`Watchererror:${error}`)) .on('ready',()=>log('Initialscancomplete.Readyforchanges')) .on('raw',(event,path,details)=>{//internal log('Raweventinfo:',event,path,details); });
以上就是node.js如何监视文件变化的详细内容,更多关于node.js监视文件的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。