node.js 中的 tail -f 实施

tail -f implementation in node.js

我使用 socket.io 和 fs.watch 函数在 node.js 中创建了 tail -f 的实现。

我使用 fs.readFile 读取文件,将其转换为行数组并 return 发送给客户端。将当前长度存储在变量中。 然后每当 "file changed" 事件触发时,我重新读取整个文件,将其转换为行数组。然后比较旧长度和当前长度。切成薄片

fileContent.slice(oldLength, fileContent.length)

这给了我更改后的内容。所以 运行 非常好。

问题:每次文件更改时我都在读取整个文件,如果文件太大,效率不高。那么有什么办法,读取一次文件,如果有变化就获取变化的内容?

我也试过,为 "tail -f"

生成子进程
var spawn = require ('child_process').spawn;
var child = spawn ('tail', ['-f', logfile]);
   child.stdout.on ('data', function (data){
   linesArray = data.toString().split("\n")
   console.log ( "Data sent" + linesArray[0]);

   io.emit('changed', {
      data: linesArray,
   });
});

问题是:

  1. on("data") 当我通过写入一些内容来保存日志文件时多次触发事件。
  2. 第一次加载时,它正确 return 文件的最后十行。但如果有变化,那么它 return 整个内容一次又一次。

因此,如果您有任何解决此问题的想法,请告诉我。到那时我会去上网。

所以,我通过阅读别人的代码得到了解决方案。所以解决方案是使用 fs.open 打开文件,然后我们可以使用 fs.read() 函数从文件中读取特定块,而不是读取整个文件。 要了解 fs.open/fs.read,请阅读此 nodejs-file-system.

官方文档:fs.read