如何监控文件的更改,只在更改完成后查看它们?

时间:2017-09-11 13:35:44

标签: node.js filesystems

我目前正在使用fs.watch监控node.js中的文件。我遇到的问题是,例如,我将1gig文件复制到我正在观看的文件夹中。文件开始复制的那一刻,我收到有关该文件的通知。如果我立即开始阅读它,由于文件尚未完成复制,我最终会收到错误的数据。例如,一个zip文件最后有目录,但我最终会在它的目录已经写好之前阅读它。

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

是否有更强大的方法可以在文件修改完成后收到通知?

1 个答案:

答案 0 :(得分:2)

所以我去年做了一个项目,需要做“文件观看”。那里有一个比fs.watch更好的图书馆。看看npm chokidar。 https://www.npmjs.com/package/chokidar

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

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

设置此属性将允许您对该文件起作用,始终确保文件已完全写入。而且您不需要关闭并实现自己的方法来确定文件是否完整。应该节省一大堆时间。

除此之外,我不相信你可以真正摆脱polling关于确定文件是否写完的问题。 Chokidar仍在进行投票,只是你不需要编写逻辑来进行投票。如果认为CPU利用率太高,您可以配置轮询间隔。

编辑:还想添加,只是试一试,看看它是如何工作的。我让你希望它尽可能地响应......但是有一些工作比没有工作更好。即使使用轮询解决方案,它也可能对您来说甚至不是问题。如果它被认为是性能问题,那么请在那时解决它并寻求“更好”的解决方案。