Как получить текущее смещение потока или дескриптор файла? - PullRequest
1 голос
/ 15 февраля 2020

В Node.js, есть ли способ получить текущее смещение дескриптора файла или потока? В настоящее время возможно установить смещение дескриптора файла , но, похоже, нет способа его получить.

В C получение смещения потока файла выполняется через ftell, а дескриптор файла - через lseek(fd, 0, SEEK_CUR).

Пример

Если программе Node.js необходимо проверить, если в файле есть предыдущие данные после его открытия в режиме добавления, в этом случае поможет вызов ftell. Это можно сделать в C следующим образом:

#include <stdio.h>

int main() {
    FILE* f = fopen("test.txt", "a");
    fprintf(f, ftell(f) ? "Subsequent line\n" : "First line\n");
    fclose(f);
}

При запуске вышеуказанной программы три раза test.txt становится:

First line
Subsequent line
Subsequent line

Уровень техники

  • Выпущен выпуск GitHub для старой версии узла. В обсуждении упоминаются bytesWritten и bytesEmitted, ни один из которых не эквивалентен ftell (в приведенном выше примере C байты, записанные при первом открытии файла, всегда равны 0). https://github.com/nodejs/node-v0.x-archive/issues/1527.
  • Пакет fs-ext NPM. Предлагает низкий уровень lseek для использования в Node.js. https://www.npmjs.com/package/fs-ext.

Ответы [ 2 ]

1 голос
/ 15 февраля 2020

В node.js нет эквивалента ftell() или fseek(), и я не совсем уверен, почему. Вместо этого вы обычно указываете положение, в котором вы хотите читать или писать, когда вы читаете или пишете, с помощью fs.read() или fs.write(). Если вы хотите просто записать кучу данных последовательно или хотите использовать буферизованную запись, вы, скорее всего, будете использовать поток, который буферизует и последовательности для вас.

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

Вот код node.js, который делает что-то похожее на ваш C код.

const fs = require('fs');

async function myFunc() {
     let handle = await fs.promises.open("test.txt");
     try {
         const {size} = await handle.stat();
         await handle.appendFile(size ? "Subsequent line\n" : "First line\n");
     } finally {
         await handle.close();
     }
}

И, если вы трижды назовете это так:

async function test() {
    await myFunc();
    await myFunc();
    await myFunc();
}

test();

Вы получите желаемые три строки в файле:

First line
Subsequent line
Subsequent line
1 голос
/ 15 февраля 2020

У fs.read есть параметр позиции.

fs.read(fd, buffer, offset, length, position, callback)

Здесь важен параметр позиции.

Будет ли этого достаточно, если я не смог правильно понять ваш вопрос?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...