0

背景 -

我正在尝试使用 node.js 和 fs 模块来完成监视文件的最终目标,并检测已附加到它的行。

当前实施 -

我目前正在使用fs.watch持续监视文件的更改,并在触发监视后使用fs.readFile读取文件。

缺点 -

这种实现的缺点是,以这种方式导出附加行的计算成本高且速度慢,特别是因为尽管我只对附加行感兴趣,但它需要读取整个文件内容。

理想的解决方案 -

我想改用fs.createReadStream以某种方式读取文件直到最后,将文件描述符留在最后,并在附加文件后再次开始读取。

我找到了两种读取流缓冲区内容的方法,但是在readable.read()readable.on('data',...)这两种实现中,似乎一旦存在流就结束了尽管流没有关闭,但没有更多数据要读取。我不确定如何继续使用已结束的流,因为readable.resume()似乎没有做任何事情。

我的问题 -

如何以修改文件后触发的方式从文件中读取附加行?我的理想解决方案是否正确?

感谢您的时间和帮助!

4

1 回答 1

1

这是我曾经遇到的一个问题,非常头疼。这是我想出的实现。

var fs = require('fs');

var file = __dirname + '/file.log';
fs.stat(file, function(err, stats) {
  var start = stats.size;
  // read the entire file here if you need it
  watchFile(start);
});

function watchFile(start) {
  fs.watch(file, function(event, filename) {
    fs.stat(file, function(err, stats) {
      var stream = fs.createReadStream(file, {
        start: start,
        end: stats.size
      });

      var lines = new String();
      stream.on('data', function(data) {
        lines += data;
      });

      stream.on('end', function() {
        // you have the new lines
      });

      start = stats.size + 1;
    });
  });
};

首先,我找到文件的大小,并将其传递给 watch 函数。每次文件更改时,我都会找出文件的新大小,并从旧位置读取到新位置。在某些系统上,watch 函数每次更改可能会触发两次,因此您可能需要添加检查以消除无用的读取,例如当开始和结束是相同字节时。

于 2013-09-13T00:23:27.907 回答