我使用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,
});
});
问题是:
所以,如果你有任何想法解决这个问题,请告诉我。直到那时我才会挖掘互联网。
答案 0 :(得分:0)
所以,我通过阅读别人的代码得到了解决方案。因此解决方案是使用fs.open打开文件,然后使用fs.read()函数读取整个文件而不是读取文件中的特定块。 要了解fs.open/fs.read,请阅读此nodejs-file-system。
官方文件:fs.read