Javascript fs readfile位置(如果已在文件末尾)
我写的东西实际上是在跟踪一个文件——浏览器时不时地回访,说我读到了23123位,给我更多。我已经编写了这个函数,它应该给我任何新的东西:Javascript fs readfile位置(如果已在文件末尾),javascript,node.js,fs,Javascript,Node.js,Fs,我写的东西实际上是在跟踪一个文件——浏览器时不时地回访,说我读到了23123位,给我更多。我已经编写了这个函数,它应该给我任何新的东西: async function readNew( filename, mark ) { var fileDescriptor = await fs.open( filename, "r" ); var buffer = new Buffer( 32768 ); var result = await fs.read( fileDescrip
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;
}
如果有新的东西,它会完美地工作。如果没有,出于某种原因,它会返回到开头并读取整个文件!例如,如果mark是16427,文件的大小是16427,那么我将读取16427字节,而我想要的是0
你知道我怎样才能可靠地解决这个问题,并且有一定的性能水平吗?
大多数情况下,不会有任何变化-所以我希望这个案例尽快解决。找到了一个非常糟糕的答案-返回,读取两个字节-如果我只得到一个字节-确定我已经结束了-但似乎一定有更好的方法
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;
}
我不能复制这种行为。从我测试的结果来看,你的函数似乎工作得很好。如果我有误解,请纠正我,但在运行此测试后:
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包含:几个字节
这是我的输出:
读取:13字节
读取:0字节
也许代码中的其他地方出了问题,例如提供超出范围的位置
编辑:
下面是使用mz库的完整测试。它使用fs extra提供与其他测试相同的输出
这是非常奇怪的-尤其是当我遇到问题,我提供的黑客代码修复了它-我将不得不做更多的调查。我感谢你的努力!我正在使用fs的mz版本,以获得承诺-我不知道它是节点版本还是包版本。我明白了。在测试用例中,我使用了fs额外包,它通过为本机fs模块提供承诺包装来完成同样的工作。也许实现不同,这可以解释这种差异。不过我希望这两个测试都能像他们的本地测试一样。@Darrenakey我刚刚用你正在使用的同一个库进行了测试。该库在返回其值的方式上确实与fs extra有点不同,但是,在将测试调整为与mz一起使用后,该函数的行为仍然是它应该的。
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');
});
});