Javascript 当行添加到文件中时,如何使用单个文件描述符或流来检测和读取它们?

Javascript 当行添加到文件中时,如何使用单个文件描述符或流来检测和读取它们?,javascript,node.js,file-descriptor,node.js-stream,Javascript,Node.js,File Descriptor,Node.js Stream,背景- 我试图使用node.js和fs模块来完成监视文件并检测附加到文件中的行的最终目标 当前实施情况- 我目前正在使用它持续监视对文件的更改,并在触发监视后读取文件 缺点- 这种实现的缺点是,以这种方式导出附加行在计算上非常昂贵且速度较慢,特别是因为它需要读取整个文件内容,尽管我只对附加行感兴趣 理想溶液- 我想改为使用,以某种方式读取文件直到结束,将文件描述符保留在末尾,并在附加文件后再次开始读取 我发现了两种读取流缓冲区内容的方法,但在这两种实现中,都是和,似乎流在没有更多数据可读取时结束

背景-

我试图使用node.js和fs模块来完成监视文件并检测附加到文件中的行的最终目标

当前实施情况-

我目前正在使用它持续监视对文件的更改,并在触发监视后读取文件

缺点-

这种实现的缺点是,以这种方式导出附加行在计算上非常昂贵且速度较慢,特别是因为它需要读取整个文件内容,尽管我只对附加行感兴趣

理想溶液-

我想改为使用,以某种方式读取文件直到结束,将文件描述符保留在末尾,并在附加文件后再次开始读取

我发现了两种读取流缓冲区内容的方法,但在这两种实现中,都是和,似乎流在没有更多数据可读取时结束,尽管流没有关闭。我不确定如何继续使用结束流,因为它似乎什么都不做

我的问题-

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


谢谢你的时间和帮助

这是我曾经遇到过的一个问题,非常头痛。这就是我提出的实现

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函数可能会触发两次,因此您可能希望添加检查以消除无用的读取,例如当开始和结束是同一字节时。

这仍然是完成此任务的最佳方法吗?