我们正在Ubuntu服务器上使用带有nodejs的chokidar来观察文件更改。它工作得很好,但有时我认为我们在更改时保存文件的方式有问题:在chokidar中" onchange"事件被触发,但是当我们在回调中读取文件时,它是空的或(很少)没有完全写入。我们不知道这是由文本编辑器编写文件,客户端计算机上的操作系统,服务器上的操作系统或文件系统(ext4)引起的问题,还是chokidar中的某种错误。
这个空文件问题现在几乎每次都是通过使用sublime 3的一台计算机(mac,最新的osx版本)进行文件更改而发生的。在sublime中我们尝试了设置“atomic_save”(创建临时文件,然后覆盖原始文件),但它没有解决我们的问题:
我们之前使用phpstorm遇到过这个问题,但在切换到后使用“safe write”(首先保存对临时文件的更改)' - 所以与sublime中的atomic_save设置相同,这也是为什么我们在sublime中尝试atomic_save - 在写完完成后,onchange事件被正确触发。
所以我们的问题是,当文件以某种方式完全写入时(chokidar,在OS中,在sublime中),有没有办法让“onchange”触发?或者我们是否必须在“onchange”事件中检查文件大小,直到一段时间没有改变(不太好)?或者我们的问题可能是因为其他事情而发生的?
我们非常感谢任何提示!提前谢谢!
答案 0 :(得分:2)
仔细阅读chokidar
自述文件的performance部分,我发现了以下内容:
awaitWriteFinish
(默认:false
)。默认情况下,在整个文件写入之前,当文件首次出现在磁盘上时,将触发add事件。此外,在某些情况下,在写入文件时会发出一些change
个事件。在某些情况下,尤其是在查看大文件时,需要等待写操作完成,然后才能响应文件创建或修改。将awaitWriteFinish
设置为true
(或真值)会轮询文件大小,保留其add
和change
个事件,直到大小在可配置的时间内没有变化。适当的持续时间设置在很大程度上取决于操作系统和硬件。为了准确检测,此参数应该相对较高,使文件观察响应性降低。 谨慎使用。
options.awaitWriteFinish
可以设置为一个对象,以便调整时间参数:
awaitWriteFinish.stabilityThreshold
(默认值:2000
)。文件大小在发出事件之前保持不变的时间量(以毫秒为单位)。awaitWriteFinish.pollInterval
(默认值:100
)。文件大小轮询间隔。
这看起来可以解决您的问题,假设文件保存之间经过了几秒钟。