我目前正在使用fs.watch
监控node.js中的文件。我遇到的问题是,例如,我将1gig文件复制到我正在观看的文件夹中。文件开始复制的那一刻,我收到有关该文件的通知。如果我立即开始阅读它,由于文件尚未完成复制,我最终会收到错误的数据。例如,一个zip文件最后有目录,但我最终会在它的目录已经写好之前阅读它。
在我的脑海中,我可以设置一些任务,每N秒在文件上调用fs.stat
,并且只在统计数据停止变化时尝试读取它。这可能会有效,但似乎并不理想,因为我希望我的应用程序尽可能快速响应,并且每秒对一堆文件调用stat似乎很重,并且每5或10秒调用一次数据似乎没有响应。
是否有更强大的方法可以在文件修改完成后收到通知?
答案 0 :(得分:2)
所以我去年做了一个项目,需要做“文件观看”。那里有一个比fs.watch
更好的图书馆。看看npm chokidar。
https://www.npmjs.com/package/chokidar
它下面使用了fs.watch,但围绕它进行了更好的改进。
有一个名为awaitWriteFinish
的属性。实际上,它正在对文件进行一些轮询以确定文件是否已完成写入。我用它,它真的很棒。
设置此属性将允许您对该文件起作用,始终确保文件已完全写入。而且您不需要关闭并实现自己的方法来确定文件是否完整。应该节省一大堆时间。
除此之外,我不相信你可以真正摆脱polling
关于确定文件是否写完的问题。 Chokidar仍在进行投票,只是你不需要编写逻辑来进行投票。如果认为CPU利用率太高,您可以配置轮询间隔。
编辑:还想添加,只是试一试,看看它是如何工作的。我让你希望它尽可能地响应......但是有一些工作比没有工作更好。即使使用轮询解决方案,它也可能对您来说甚至不是问题。如果它被认为是性能问题,那么请在那时解决它并寻求“更好”的解决方案。