使用Node.JS监听文件夹变化

本文介绍如何使用 Node.js 的 fs.watch 和第三方模块 chokidar 与 watch 来监听文件夹及其子文件夹的变化,包括文件的添加、删除和修改等事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Node.JS监听文件夹变化

使用Node.JS监听文件夹改变有许多应用场合,比如:

构建自动编绎工具

当源文件改变时,自动运行build过程,比如当你写CoffeeScript文件或SASS CSS文件时,保存之后可即时生成对应的JS或CSS.

构建自动布署工具

通过侦听源文件夹的改变,你可以自动即时将改后的文件布署到测试服务器,加快你的开发测试速度。

这些工具其实都需要侦听文件夹的改变,基于Node.JS的侦听文件夹改变的模块有很多。

fs.watch

其中Node.JS的文件系统也可侦听某个目录的改变, 如 fs.watch

fs.watch( 'somedir' , function  (event, filename) {
   console.log( 'event is: '  + event);
   if  (filename) {
     console.log( 'filename provided: '  + filename);
   } else  {
     console.log( 'filename not provided' );
   }
});

其中fs.watch的最大缺点就是不支持子文件夹的侦听,并且在很多情况下会侦听到两次事件(很多编辑器在保存的时侯是先把原文件清空,再进行保存,因此会触发两次文件夹改变事件)。因此需要一些开源的模块来监听文件夹目录的改变。

chokidar

chokidar  是一个基于node.JS的监听文件夹改变模块。

安装

npm install chokidar

示例

var  chokidar = require( 'chokidar' );
 
var  watcher = chokidar.watch( 'file, dir, or glob' , {
   ignored: /[\/\\]\./, persistent: true
});
 
var  log = console.log.bind(console);
 
watcher
   .on( 'add' , function (path) { log( 'File' , path, 'has been added' ); })
   .on( 'addDir' , function (path) { log( 'Directory' , path, 'has been added' ); })
   .on( 'change' , function (path) { log( 'File' , path, 'has been changed' ); })
   .on( 'unlink' , function (path) { log( 'File' , path, 'has been removed' ); })
   .on( 'unlinkDir' , function (path) { log( 'Directory' , path, 'has been removed' ); })
   .on( 'error' , function (error) { log( 'Error happened' , error); })
   .on( 'ready' , function () { log( 'Initial scan complete. Ready for changes.' ); })
   .on( 'raw' , function (event, path, details) { log( 'Raw event info:' , event, path, details); })

watch

Watch 是另一个监听文件夹改变的Node.JS模块

安装

npm install watch
npm install watch

示例,侦听所有改变事件

watch.watchTree( '/home/mikeal' , function  (f, curr, prev) {
     if  ( typeof  f == "object"  && prev === null  && curr === null ) {
       // Finished walking the tree
     } else  if  (prev === null ) {
       // f is a new file
     } else  if  (curr.nlink === 0) {
       // f was removed
     } else  {
       // f was changed
     }
})

示例,侦听不同事件

var  watch = require( 'watch' )
watch.createMonitor( '/home/mikeal' , function  (monitor) {
     monitor.files[ '/home/mikeal/.zshrc' ] // Stat object for my zshrc.
     monitor.on( "created" , function  (f, stat) {
       // Handle new files
     })
     monitor.on( "changed" , function  (f, curr, prev) {
       // Handle file changes
     })
     monitor.on( "removed" , function  (f, stat) {
       // Handle removed files
     })
     monitor.stop(); // Stop watching
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值