2017-09-11 21 views
0

我目前使用fs.watch监控node.js中的文件。我遇到的问题是例如,假设我将1gig文件复制到我正在观看的文件夹中。文件开始复制的时刻,我收到关于该文件的通知。如果我立即开始阅读,由于文件尚未完成复制,最终导致数据不正确。例如一个zip文件在最后有它的目录,但是我最终会在它的目录被写入之前阅读它。如何监控文件的更改,并在更改完成后才查看它们?

关闭我的头顶,我可以设置一些任务,每N秒钟在文件上调用fs.stat,并且只在数据停止更改时尝试读取它。这样可行,但看起来并不理想,因为我希望我的应用程序尽可能快速响应,并且每秒调用一堆文件统计数据看起来很重,以及每5秒或10秒调用统计数据似乎无响应。

当文件完成修改时,是否有一些更健壮的方式来获得通知?

+0

可能是错误的,但不是“修改”日期是在更改后在文件上修改的最后一个信息? –

回答

1

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

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

有一个属性叫awaitWriteFinish。真的,它正在对文件进行轮询以确定文件是否完成了写入。我用它,它真的很棒。

设置此属性将允许您对该文件进行处理,始终确保该文件已被完全写入。而且您不需要离开并实施自己的确定文件是否完整的方法。应该节省一堆时间。

除此之外,我不相信你真的可以脱离polling关于确定文件是否写完。 Chokidar仍在轮询,只是你不需要编写逻辑来做到这一点。如果CPU利用率被认为太高,您可以配置轮询间隔。

编辑:也想添加,只是给它一个镜头,看看它是如何工作的。我希望你能尽可能快地做出反应......但是有一些工作要比完全不工作更好。这可能是因为即使使用轮询解决方案,它对您而言也不是问题。如果它被认为是一个性能问题,那么在那个时候解决它并寻求一个“更好的”解决方案。