有没有办法在使用Node.js fs.watch
更改目录内容时 仅 ?通过更改目录内容,我的意思是添加/删除一堆文件?
换句话说,我希望{<1}}触发第一个文件的第一个事件,并忽略特定更改dir内容周期的任何其他事件。
我只能使用fs.watch
执行此操作但节点人员建议尽可能使用fs.watchFile
。
注意:fs.watch()比fs.watchFile和fs.unwatchFile更有效。应尽可能使用fs.watch代替fs.watchFile和fs.unwatchFile。
https://nodejs.org/docs/latest/api/fs.html#fs_fs_watchfile_filename_options_listener
答案 0 :(得分:0)
Yury Tarabanko贵族回答了这个问题,但不久之后 删除了他的回答:
您只是在第一次通话时停止观看
const watcher = fs.watch(somePath, (ev, file) => { watcher.close() // logic goes here console.log(`${ev} ${file}`) })
关闭观察者后,我们会在问题中提出1次重复拍摄行为:
const fs = require('fs')
let dir = './watch1'
function watchOnce()
{
const watcher = fs.watch(dir, (evt, file) => {
watcher.close()
// logic goes here
console.log(Date(), evt, file)
// resurrecting watcher after 1 sec
setTimeout(watchOnce, 1000)
})
}
watchOnce()
测试
在原始文件中创建和删除10,000个文件5次,延迟时间为1秒:
$ for i in {1..5}; do touch {1..10000}; sleep 1; rm {1..10000}; sleep 1; done
验证观察者正好发射10次(5次创建10,000个文件,5次删除10,000个文件):
$ node watchers.js
Wed Jun 07 2017 12:01:44 GMT+0300 (EEST) rename 1
Wed Jun 07 2017 12:01:46 GMT+0300 (EEST) rename 1
Wed Jun 07 2017 12:01:47 GMT+0300 (EEST) rename 1
Wed Jun 07 2017 12:01:49 GMT+0300 (EEST) rename 1
Wed Jun 07 2017 12:01:50 GMT+0300 (EEST) rename 1
Wed Jun 07 2017 12:01:52 GMT+0300 (EEST) rename 1
Wed Jun 07 2017 12:01:53 GMT+0300 (EEST) rename 1
Wed Jun 07 2017 12:01:55 GMT+0300 (EEST) rename 1
Wed Jun 07 2017 12:01:56 GMT+0300 (EEST) rename 1
Wed Jun 07 2017 12:01:58 GMT+0300 (EEST) rename 1
我不会将我的回答标记为已接受,因为他的watcher.close()
想法主要归功于Yury。也许其他人会写更多整洁的解决方案,因为我使用函数延迟并不是很有趣。