Javascript 当行添加到文件中时,如何使用单个文件描述符或流来检测和读取它们?
背景- 我试图使用node.js和fs模块来完成监视文件并检测附加到文件中的行的最终目标 当前实施情况- 我目前正在使用它持续监视对文件的更改,并在触发监视后读取文件 缺点- 这种实现的缺点是,以这种方式导出附加行在计算上非常昂贵且速度较慢,特别是因为它需要读取整个文件内容,尽管我只对附加行感兴趣 理想溶液- 我想改为使用,以某种方式读取文件直到结束,将文件描述符保留在末尾,并在附加文件后再次开始读取 我发现了两种读取流缓冲区内容的方法,但在这两种实现中,都是和,似乎流在没有更多数据可读取时结束,尽管流没有关闭。我不确定如何继续使用结束流,因为它似乎什么都不做 我的问题- 如何以文件修改后触发的方式从文件中读取附加行?我的理想解决方案是否正确Javascript 当行添加到文件中时,如何使用单个文件描述符或流来检测和读取它们?,javascript,node.js,file-descriptor,node.js-stream,Javascript,Node.js,File Descriptor,Node.js Stream,背景- 我试图使用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函数可能会触发两次,因此您可能希望添加检查以消除无用的读取,例如当开始和结束是同一字节时。这仍然是完成此任务的最佳方法吗?