Node.js WriteStream не записывает данные в файл до закрытия

Как сделать так, чтобы данные записывались в файл при вызове WriteStream.write()?

Изменить: как оказалось, это работает, когда я использую REPL и вызываю функцию. Однако в моей программе это не работает:

import * as FS from "fs";
import { LetterGroup } from "./LetterGroup";
import { Dictionary } from "./Dictionary";
import { Word } from "./Word";
import * as OS from "os";

const groups: Array<LetterGroup> = LetterGroup.letterGroupsFromString(FS.readFileSync("./letterGroups.txt").toString());
const dictionary = Dictionary.create(FS.readFileSync("./dictionary.txt").toString());

const inputStr: string = FS.readFileSync("./input.txt").toString();
const inputWords = new Array<Word>();
const fileStream = FS.createWriteStream("./output.txt");

for (const line of inputStr.trim().split(OS.EOL))
{
    inputWords.push(new Word(line));
}

function permute(index: number)
{
    index = Math.floor(index);

    if (!(index >= 0 && index < inputWords.length))
    {
        return;
    }

    const word: Word = inputWords[index];

    let outputString: string = "";

    outputString += `Valid permutations of '${word.wordString}':` + OS.EOL;

    console.log(`Testing '${ word.wordString }'...`);

    for (const permutation of word.generatePermutations(groups, dictionary, true))
    {
        outputString += permutation.wordString + OS.EOL;
    }

    outputString += OS.EOL;
    console.log();

    if (!fileStream.write(outputString))
    {
        console.log("Wrote to file too fast! Will resume writing once the system catches up...");
        fileStream.once("drain", () => permute(index));
        return;
    }

    permute(index + 1);
}

permute(0);

Следует отметить, что word.generatePermutations - чрезвычайно интенсивная функция, и ее возврат может занять несколько минут (иногда более часа). Моя проблема в том, что данные, которые он возвращает, должны быть немедленно записаны в выходной файл, чтобы не нужно было завершать работу всей программы, чтобы результаты были прочитаны. Надеюсь, кто-нибудь сможет понять все это.

Чтобы уточнить, данные, записанные в WriteStream в REPL, немедленно записываются в файл, в то время как данные не записываются в файл в моей программе, пока вся программа не завершит работу.


person John Leuenhagen    schedule 23.01.2018    source источник
comment
Возможный дубликат записи файлов в Node.js   -  person CDspace    schedule 24.01.2018
comment
@CDspace На самом деле я решил использовать файловые дескрипторы и fs.write() для решения проблемы, но это не меняет того факта, что на мой исходный вопрос нет ответа. Я специально хочу знать, есть ли способ заставить WriteStream синхронизировать свои данные с диском, когда данные записываются на него. Кажется, это работает в REPL, но не в моей программе. Отредактирую исходный вопрос.   -  person John Leuenhagen    schedule 24.01.2018
comment
У меня здесь такая же проблема. Решение найдено?   -  person yue you    schedule 26.10.2018


Ответы (1)


Попробуйте эти пакеты:

https://www.npmjs.com/package/flushwritable

https://www.npmjs.com/package/flush-write-stream

И я думаю, что ваш вопрос является дубликатом Как очистить файл Node.js writeStream правильно?

person Aleksei Semidotskii    schedule 23.01.2018
comment
Я проверю эти пакеты, но предложенный вами поток отличается от моего, поскольку он пытался очистить файл после закрытия потока, а я хочу сбросить его в файл, пока поток активен. - person John Leuenhagen; 23.01.2018