fs позиция чтения файла, если он уже находится в конце файла - PullRequest
0 голосов
/ 23 мая 2018

Я пишу что-то, что эффективно «следит» за файлом - время от времени браузер запрашивает ответ и говорит: «Я прочитал до позиции 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.

Любые идеи, как я могу исправить это надежно, и с некоторым уровнемпроизводительность?
В большинстве случаев изменений не будет, поэтому я хочу, чтобы этот случай был как можно быстрее.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Я не могу воспроизвести это поведение.Судя по тому, что я тестировал, ваша функция работает нормально.Пожалуйста, исправьте меня, если я неправильно понял, но после запуска этого теста:

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');
    });
});
0 голосов
/ 23 мая 2018

нашел действительно ужасный ответ - вернуться назад, прочитать два байта - и если я получу только один - решить, что я в конце - но кажется, что должен быть лучшим способом?

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;
}
...