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,
});
});
问题是:
- on("data") 当我通过写入一些内容来保存日志文件时多次触发事件。
- 第一次加载时,它正确 return 文件的最后十行。但如果有变化,那么它 return 整个内容一次又一次。
因此,如果您有任何解决此问题的想法,请告诉我。到那时我会去上网。
所以,我通过阅读别人的代码得到了解决方案。所以解决方案是使用 fs.open 打开文件,然后我们可以使用 fs.read() 函数从文件中读取特定块,而不是读取整个文件。
要了解 fs.open/fs.read,请阅读此 nodejs-file-system.
官方文档:fs.read
我使用 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,
});
});
问题是:
- on("data") 当我通过写入一些内容来保存日志文件时多次触发事件。
- 第一次加载时,它正确 return 文件的最后十行。但如果有变化,那么它 return 整个内容一次又一次。
因此,如果您有任何解决此问题的想法,请告诉我。到那时我会去上网。
所以,我通过阅读别人的代码得到了解决方案。所以解决方案是使用 fs.open 打开文件,然后我们可以使用 fs.read() 函数从文件中读取特定块,而不是读取整个文件。 要了解 fs.open/fs.read,请阅读此 nodejs-file-system.
官方文档:fs.read