chokidar:文件的onchange事件可能会被触发

我们正在使用Ubuntu服务器上的nodejs使用chokidar监视文件更改。 它工作的很好,但有时我认为我们有一个文件被保存的方式改变时的问题:在chokidar“onchange”事件触发,但是当我们在callback中读取文件,它是空的或(很less)不完全写。 我们不知道这是由文本编辑器写入文件,客户端计算机上的操作系统,操作系统还是服务器上的文件系统(ext4)引起的问题,还是由于chokidar中的某种错误造成的。

这个空文件问题现在几乎每次都是由使用sublime 3的计算机(mac,最新的osx版本)所做的文件更改发生的。 在崇高,我们尝试了设置“atomic_save”(创build一个临时文件,然后覆盖原来的文件),但它没有解决我们的问题:

  1. atomic_save设置为“false”时,文件在onchange事件中似乎总是空的
  2. 有了atomic_save “真”,它有时是空的,有时是部分写的。

我们之前用phpstorm有过这个问题,但是在切换到'use'安全写入之后(先保存一个临时文件的变化)' – 与sub_sim中的atomic_save设置相同,这也是我们为什么尝试atomic_save在sublime中,onchange事件在完成写入后被正确触发。

所以我们的问题是,有什么办法可以在文件完全写入的时候触发“onchange”(在chokidar中,在OS中,在sublime中)? 或者,我们必须检查“onchange”事件的文件大小,直到一段时间没有改变(不太好)? 或者,我们的问题可能是由于其他原因而发生的?

我们将不胜感激任何提示! 提前致谢!

通过chokidar自述文件的性能部分,我发现了以下内容:

awaitWriteFinish (默认值: false )。 默认情况下,当文件首次出现在磁盘上时,添加事件将会触发,整个文件被写入之前。 此外,在某些情况下,文件写入时会发生一些change事件。 在某些情况下,特别是在查看大文件时,在对文件创build或修改作出响应之前,需要等待写操作完成。 将awaitWriteFinish设置为true (或truthy值)将轮询文件大小,保持其addchange事件,直到大小不会改变一个可configuration的时间量。 适当的持续时间设置严重依赖于操作系统和硬件。 为了准确的检测这个参数应该是相对较高的,使得文件看起来不那么敏感。 谨慎使用

  • options.awaitWriteFinish可以设置为一个对象,以调整计时参数:
    • awaitWriteFinish.stabilityThreshold (默认值: 2000 )。 文件大小在发出事件之前保持不变的时间量(以毫秒为单位)。
    • awaitWriteFinish.pollInterval (默认值: 100 )。 文件大小轮询间隔。

这看起来像可以解决您的问题,假设文件保存之间超过几秒钟。