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

Ryo*_*Ryo 4 file onchange node.js is-empty sublimetext3

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

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

  1. atomic_save设置为“false”时,文件在 onchange 事件中似乎始终为空,并且
  2. 使用atomic_save “true”,它有时是空的,有时是部分写入的。

我们之前在使用 phpstorm 时遇到过这个问题,但是在切换到 “使用“安全写入”(首先将更改保存到临时文件)”之后——所以与 sublime 中的 atomic_save 设置相同,这也是我们在 sublime 中尝试 atomic_save 的原因——onchange完成写入后事件被正确触发。

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

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

Mat*_*DMo 5

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

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

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

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

  • 谢谢!没看到这个设定 好吧,我安装了最新的 chokidar,但不知何故这个设置没有区别。即使awaitWriteFinish 对象和stabilityThreshold 设置为10000,也要让onchange 事件立即触发(而不是10 秒后)。但我自己只是尝试了另一种设置,“usePolling: true”,然后就可以使用了。嗯,这似乎不是很有效,但至少它有效。 (2认同)