node.js - 如何监视文件的更改并仅在更改完成后查看它们?

标签 node.js filesystems

我目前正在使用fs.watch监视node.js中的文件。例如,我遇到的问题是,假设我将 1gig 文件复制到我正在观看的文件夹中。文件开始复制时,我会收到有关该文件的通知。如果我立即开始阅读它,我会得到错误的数据,因为文件尚未完成复制。例如,一个 zip 文件的目录位于末尾,但我最终会在其目录写入之前阅读它。

我可以设置一些任务,每 N 秒调用一次文件上的 fs.stat,并且只在统计数据停止变化时才尝试读取它。这可行,但似乎并不理想,因为我希望我的应用程序尽可能具有响应能力,并且每秒对一堆文件调用 stat 似乎很繁重,并且每 5 或 10 秒调用 stat 似乎没有响应。

是否有一些更可靠的方法可以在文件修改完成时收到通知?

最佳答案

所以我去年做了一个项目,需要进行“文件监视”。有一个比 fs.watch 更好的库。查看 npm chokidar。 https://www.npmjs.com/package/chokidar

它的底层使用了 fs.watch,但围绕它进行了更好的改进。

有一个名为awaitWriteFinish的属性。实际上,它正在对文件进行一些轮询以确定文件是否已完成写入。我用过,效果确实很好。

设置此属性将允许您处理该文件,始终确保该文件已完全写入。而且您不需要去实现自己的方法来确定文件是否完整。应该可以节省不少时间。

除此之外,我不相信在确定文件是否已完成写入方面您真的可以摆脱轮询。 Chokidar 仍在进行轮询,只是您不需要编写逻辑来执行此操作。如果认为 CPU 利用率过高,您可以配置轮询间隔。

编辑:还想添加一下,尝试一下,看看它是如何工作的。我知道你希望它尽可能地响应...但是有一些东西可以工作总比有些东西根本不工作要好。即使使用轮询解决方案,这对您来说也可能不是问题。如果它被认为是性能问题,那么当时就去解决它并寻求“更好”的解决方案。

关于node.js - 如何监视文件的更改并仅在更改完成后查看它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46157050/

相关文章:

javascript - 为什么我的异步函数返回 Promise { <pending> } 而不是一个值?

javascript - Mocha chai-http 响应总是返回 null

ios - iOS如何为存储在磁盘上的文件添加日期和名称元数据?

linux - 如何衡量缓存性能?

javascript - 读取图像文件并在 SVG 问题上显示它(JavaScript)

node.js - 当我运行转译文件时,如何回溯 node.js 中的错误?

javascript - 从 Amazon S3 中提取 PDF 并直接在浏览器中从缓冲区/流中呈现

node.js - 无法运行 NPM 获取错误 : Cannot find module 'are-we-there-yet'

c++ - fstat() 在预加载的 mmap() 系统调用中无法按预期工作

hadoop - pyspark : how to check if a file exists in hdfs