fs readfile位置如果已经在文件末尾

时间:2018-05-23 07:24:24

标签: 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( fileDescriptor, buffer, 0, buffer.length, mark );
    await fs.close( fileDescriptor );
    return result;
}

并且它完美地工作如果有新的东西。如果没有,由于某种原因它会回到开头并读取整个文件!因此,例如,如果标记是16427 - 并且文件大小为16427 - 我读取16427个字节 - 我想要的是0。

我是如何可靠地解决这个问题的,并且具有一定的性能水平?   大多数当时,不会有任何变化 - 所以我希望这种情况尽可能快。

2 个答案:

答案 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');
    });
});