appenFile не закрывает открытые файлы в Node.js

Я прочитал, что fs.appendFile не возвращает fd ( дескриптор файла), поэтому он открывает файл и даже закрывает его. Но в приведенном ниже примере я получаю ошибку Error: EMFILE: too many open files, open

[...Array(10000)].forEach( function (item,index) {
fs.appendFile("append.txt", index+ "\n", function (err) {
    if (err) console.log(err);
})});

Что, как я предполагаю, означает, что для каждого нового добавления он открывает один и тот же файл снова и снова. Однако с потоком все в порядке

var stream = fs.createWriteStream("append.txt", {flags:'a'});
[...Array(10000)].forEach( function (item,index) {
stream.write(index + "\n")});

Итак, почему в первом случае appendFile не закрывает файл после операции?


person jack_snipe    schedule 17.03.2018    source источник


Ответы (1)


Как вы знаете, fs.appendFile является асинхронным. Итак, в коде вы вызываете fs.appendFile 10000 раз одновременно.

Вам просто нужно дождаться завершения первого добавления, прежде чем вы добавите снова.

Это должно работать:

var index = 0;
function append(){
    fs.appendFile("append.txt", index+ "\n", function (err) {
        index++;
        if (index < 10000)
            append();
        else
            console.log('Done');
    });
};
append();

Также обратите внимание, что это очень плохо для производительности.

person Molda    schedule 17.03.2018