我正在写一些有效“拖尾”文件的东西 - 浏览器不时会回过头来说“我读到23123号位置,再给我一些东西”。我写过这个函数应该给我任何新东西:
async function readNew( filename, mark )
{
var fileDescriptor = await fs.open( filename, "r" );
var buffer = new Buffer( 32768 );
var result = await fs.read( fileDescriptor, buffer, 0, buffer.length, mark );
await fs.close( fileDescriptor );
return result;
}
并且它完美地工作如果有新的东西。如果没有,由于某种原因它会回到开头并读取整个文件!因此,例如,如果标记是16427 - 并且文件大小为16427 - 我读取16427个字节 - 我想要的是0。
我是如何可靠地解决这个问题的,并且具有一定的性能水平? 大多数当时,不会有任何变化 - 所以我希望这种情况尽可能快。
答案 0 :(得分:1)
发现了一个非常可怕的答案 - 回过头来,读取两个字节 - 如果我只得到一个 - 决定我最后 - 但似乎必须更好的方法?
async function readPart( filename, mark )
{
var fileDescriptor = await fs.open( filename, "r" );
var buffer = new Buffer( 32768 );
var result = await fs.read( fileDescriptor, buffer, 0, 2, Math.max( 0, mark-1));
if (result[0] == 1)
return [0, new Buffer(0)];
result = await fs.read( fileDescriptor, buffer, 0, buffer.length-1, mark );
await fs.close( fileDescriptor );
return result;
}
答案 1 :(得分:0)
我无法重现此行为。从我测试的,你的功能似乎工作正常。如果我误解了但经过这个测试后请纠正我:
readNew(path.join(__dirname, 'test.txt'), 0).then((result) => {
console.log('Read: ' + result.bytesRead + ' bytes');
readNew(path.join(__dirname, 'test.txt'), result.bytesRead).then((result) => {
console.log('Read: ' + result.bytesRead + ' bytes');
});
});
本例中的文件test.txt包含:几个字节!
这是我的输出:
Read: 13 bytes
Read: 0 bytes
也许代码中的其他地方出现了问题,例如提供超出范围的位置。
修改强>
这是使用mz
库的完整测试。它使用fs-extra
提供与其他测试相同的输出。
const fs = require('mz/fs');
const path = require('path');
async function readNew(filename, mark) {
var fileDescriptor = await fs.open(filename, "r");
var buffer = new Buffer(32768);
var result = await fs.read(fileDescriptor, buffer, 0, buffer.length, mark);
await fs.close(fileDescriptor);
return result;
}
readNew(path.join(__dirname, 'test.txt'), 0).then(([bytesRead, buffer]) => {
console.log('Read: ' + bytesRead + ' bytes');
readNew(path.join(__dirname, 'test.txt'), bytesRead).then(([bytesRead, buffer]) => {
console.log('Read: ' + bytesRead + ' bytes');
});
});