node.js中的tail -f实现

时间:2016-05-04 09:51:59

标签: node.js socket.io readfile watch tail

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

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

fileContent.slice(oldLength, fileContent.length)

这给了我改变的内容。所以跑得很好。

问题:我每次更改文件时都会读取整个文件,如果文件太大,则无效。那么有没有办法,只读一次文件,然后在有任何变化的情况下获取更改后的内容?

我也尝试过,为#34; 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. 首次加载时,它会正确返回文件的最后十行。但如果有变化,那么它会一次又一次地返回整个内容。
  3. 所以,如果你有任何想法解决这个问题,请告诉我。直到那时我才会挖掘互联网。

1 个答案:

答案 0 :(得分:0)

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

官方文件:fs.read