【问题标题】:Watch a directory and handle complete new files as soon as possible查看目录并尽快处理完整的新文件
【发布时间】:2013-09-05 16:13:28
【问题描述】:

我有一个目录,其他一些程序在其中编写 XML 文件,当它们完成时我必须处理这些文件。

到目前为止,我通过要求编写程序首先使用临时名称并仅在最后重命名 ".xml" 中的文件来避免处理未完全写入的文件。我的代码如下所示:

var fs  = require("fs");
var handleFiles = function(){
    fs.readdirSync(args.in).forEach(function(filename) {
        if (filename.slice(-4)!=='.xml') return;
        // handle XML file here
    });
}
fs.watch(args.in, handleFiles);

但是我必须支持的一些新程序无法使用临时名称编写。

当文件完全以高效、可靠、跨浏览器(windows 和 linux)编写且不基于超时(即不每 10 毫秒测试一次重命名直到它工作)方式时,我如何确保我处理这些文件?

写入操作是一次性的,所以我想我想要(对于 linux,更重要的是对于 windows)是在有新文件未被写入锁定时得到通知。

【问题讨论】:

  • Linux 不会隐式写锁定文件。如果您希望发生锁定,请明确使用flocklockf。特别是,两个进程可以同时写入同一个文件(即使这不是可取的)。

标签: javascript linux windows node.js watch


【解决方案1】:

在 linux 上,您可以使用 inotify 工具。见inotify(7)

也许使用incrontab 可能是值得的。

【讨论】:

  • 好吧,自从我使用fs.watch 以来,我已经这样做了,但我的问题是 1) 跨浏览器 2) 在不再写入文件时收到通知。
  • 您应该定义不再写入的文件对您意味着什么。以追加模式打开的文件呢?例如,有人在 someprog > out.xml 和 5 分钟(或 30 秒)后 someotherprog >> out.xml ?那样的话,out.xml什么时候不写了??
  • 这样一个文件将被写入。我猜一个文件在写入锁定时正在写入。
【解决方案2】:

处理此问题的一种技术是使用在主文件完成后写入的零字节“信号文件”。例如

mybigfile.txt
mybigfile.txt.done

“.done”文件的长度为 0 字节,由“touch”或类似进程在完成写入数据文件后创建。您扫描 .done 文件,如果它丢失则不执行任何操作。不幸的是,您暗示您无法控制写入过程,因此这可能不是您可以使用的解决方案。

【讨论】:

  • 问题在于处理编写过于简单而无法处理的程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
相关资源
最近更新 更多