Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript fs readfile位置(如果已在文件末尾)_Javascript_Node.js_Fs - Fatal编程技术网

Javascript fs readfile位置(如果已在文件末尾)

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

我写的东西实际上是在跟踪一个文件——浏览器时不时地回访,说我读到了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;
}
如果有新的东西,它会完美地工作。如果没有,出于某种原因,它会返回到开头并读取整个文件!例如,如果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');
    });
});