我有以下功能来查找文件中的更改,打开文件并阅读所述更改。为此,我使用fs.statSync来计算缓冲区的长度。
var allFiles=[logfile]
allFiles.forEach (function (file) {
var fName = file;
var fNameStat = new Object;
fNameStat = fs.statSync(fName);
if (!fNameStat.isFile()) {
console.log(fName + ' is not a file');
process.exit(1);
}
console.log('watching ' + fName + ' bytes: ' + fNameStat.size);
fs.watch(fName, function (event, filename) {
var fNameStatChanged = fs.statSync(fName);
console.log('file changed from ' + fNameStat.size + ' to ' + fNameStatChanged.size);
fs.open(fName, 'r', function(err, fd) {
var newDataLength = fNameStatChanged.size - fNameStat.size;
var buffer = new Buffer(newDataLength, 'utf-8');
fs.readSync(fd, buffer, 0, newDataLength, fNameStat.size, function (err, bytesRead, newData) {
if (err) {
console.log(err);
};
logline = newData.toString()
console.log(logline);
socket.emit("log-tail",logline);
});
fNameStat = fs.statSync(fName);
});
}); // fs.watch
}); // allFiles.forEach
但是我得到了一个缓冲区outofbounds错误。当日志文件一个接一个地获得两个消息时会发生这种情况。
file changed from 40756 to 40789
file changed from 40756 to 40844
fs.js:620
binding.read(fd, buffer, offset, length, position, req);
^
Error: Offset is out of bounds
我假设它与异步调用有关。在第一次读取操作完成之前文件发生更改,因此缓冲区错误。但即使使用相应的同步调用后代码也无法正常工作。有什么想法吗?