06-文件系统监听器
6.3.2 文件系统监听器
应用程序“监听”文件或目录的变化并根据变化执行一些任务,这种做法并不稀奇。 fs.FSWatcher
是Node中处理这件事的接口。不幸的是,Node开发人员注意到,这个方法在各平台上的表现不一致,而且并不总是有效。
我会跳过 fs.FSWatcher
的介绍,以及与之关联的用于返回对象的 fs.watch()函数
。相反,我会介绍第三方模块:在一个月的时间里下载量达到200万以上的Chokidar。这个模块是众多被广泛使用的模块之一(它已被并入非常受欢迎的应用程序Gulp中)。
用下面的命令进行安装(添加 –g
可以全局安装):
npm install chokidar
下面的代码会给当前目录添加一个监听器,它会检查目录和文件的变化。该监听器执行递归监听,提取目录中新添加的子目录和子目录中所有的新文件。原始的操作系统事件会监听所有的操作系统事件,而其他事件处理器则会监听更高级别的事件。
var chokidar = require('chokidar');
var watcher = chokidar.watch('.', {
ignored: /[\/\\]\./,
persistent: true
});
var log = console.log.bind(console);
watcher
.on('add', function(path) { log('File', path, 'has been added'); })
.on('unlink', function(path) { log('File', path, 'has been removed'); })
.on('addDir', function(path) { log('Directory', path, 'has been added'); })
.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); });
watcher.on('change', function(path, stats) {
if (stats) log('File', path, 'changed size to', stats.size);
});
在控制台中可以看到添加、删除文件或目录(这些操作也改变了文件大小)的日志。 unlink()
和 unlinkDir()
函数直观地反映出“删除”就意味着对象不再被链接到当前目录了。如果这正好是绑定到文件/子目录的最后一个连接,那么就表示它们被删除了。
捕捉所有原始事件可能会产生相当庞大的输出。不过,在第一次接触Chokidar时,最好仔细看看。