如何使用fs.watch?

时间:2017-06-07 07:10:06

标签: node.js watch

有没有办法在使用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

1 个答案:

答案 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。也许其他人会写更多整洁的解决方案,因为我使用函数延迟并不是很有趣。