chokidar:文件的onchange事件可能被触发为快速

时间:2016-01-12 17:30:28

标签: node.js file sublimetext3 onchange is-empty

我们正在Ubuntu服务器上使用带有nodejs的chokidar来观察文件更改。它工作得很好,但有时我认为我们在更改时保存文件的方式有问题:在chokidar中" onchange"事件被触发,但是当我们在回调中读取文件时,它是空的或(很少)没有完全写入。我们不知道这是由文本编辑器编写文件,客户端计算机上的操作系统,服务器上的操作系统或文件系统(ext4)引起的问题,还是chokidar中的某种错误。

这个空文件问题现在几乎每次都是通过使用sublime 3的一台计算机(mac,最新的osx版本)进行文件更改而发生的。在sublime中我们尝试了设置“atomic_save”(创建临时文件,然后覆盖原始文件),但它没有解决我们的问题:

  1. atomic_save 设置为“false”时,onchange事件中的文件似乎总是空的
  2. 使用 atomic_save “true”时,它有时是空的,有时会部分写入。
  3. 我们之前使用phpstorm遇到过这个问题,但在切换到后使用“safe write”(首先保存对临时文件的更改)' - 所以与sublime中的atomic_save设置相同,这也是为什么我们在sublime中尝试atomic_save - 在写完完成后,onchange事件被正确触发。

    所以我们的问题是,当文件以某种方式完全写入时(chokidar,在OS中,在sublime中),有没有办法让“onchange”触发?或者我们是否必须在“onchange”事件中检查文件大小,直到一段时间没有改变(不太好)?或者我们的问题可能是因为其他事情而发生的?

    我们非常感谢任何提示!提前谢谢!

1 个答案:

答案 0 :(得分:2)

仔细阅读chokidar自述文件的performance部分,我发现了以下内容:

  

awaitWriteFinish(默认:false)。默认情况下,在整个文件写入之前,当文件首次出现在磁盘上时,将触发add事件。此外,在某些情况下,在写入文件时会发出一些change个事件。在某些情况下,尤其是在查看大文件时,需要等待写操作完成,然后才能响应文件创建或修改。将awaitWriteFinish设置为true(或真值)会轮询文件大小,保留其addchange个事件,直到大小在可配置的时间内没有变化。适当的持续时间设置在很大程度上取决于操作系统和硬件。为了准确检测,此参数应该相对较高,使文件观察响应性降低。 谨慎使用

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

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