Javascript Node.js异步文件打开和读取操作出现越界错误
我有以下功能来查找文件中的更改,打开文件并读取所述更改。为此,我使用fs.statSync来计算缓冲区的长度Javascript Node.js异步文件打开和读取操作出现越界错误,javascript,node.js,fs,Javascript,Node.js,Fs,我有以下功能来查找文件中的更改,打开文件并读取所述更改。为此,我使用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
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
但我得到了一个边界外的缓冲区错误。当日志文件依次收到两条消息时,就会发生这种情况
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
我假设这与异步调用有关。文件在第一次读取操作完成之前更改,因此缓冲区错误。但即使在使用了相应的同步调用之后,代码也无法工作。有什么想法吗?你有没有尝试限制fs.watch活动?@mh cbon没有。我也不知道该怎么做。你的意思是我应该只关注某些类型的更改,还是它是一个nodejs函数。我对这一切都是陌生的,所以道歉,我也不想失去任何改变事件。我基本上实现了tail-f功能,因此需要跟踪对文件的所有更改我怀疑这两个是连续的
文件从40756更改为40789
文件从40756更改为40844
。如果只捕获最后一个,则不会丢失任何数据,因为它们从同一偏移开始。顺便说一句,如果你成功地连续读取了这两个数据,你会将40756到40789的数据发送到另一端两次。是的。但问题是,当两个更改具有相同的启动缓冲区时,如何捕获此类事件。有没有办法知道任何并发挂起的调用