Kiedy chcesz zapisywać w pliku dziennika, tj. Dołączać dane na końcu pliku, nigdy nie używaj appendFile. appendFileotwiera uchwyt pliku dla każdego elementu danych, który dodajesz do pliku, po chwili pojawia się piękny EMFILEbłąd.
Mogę dodać, że appendFilenie jest łatwiejszy w użyciu niż WriteStream.
Przykład z appendFile:
console.log(new Date().toISOString());
[...Array(10000)].forEach( function (item,index) {
fs.appendFile("append.txt", index+ "\n", function (err) {
if (err) console.log(err);
});
});
console.log(new Date().toISOString());
Do 8000 na moim komputerze możesz dołączyć dane do pliku, a następnie uzyskasz:
{ Error: EMFILE: too many open files, open 'C:\mypath\append.txt'
at Error (native)
errno: -4066,
code: 'EMFILE',
syscall: 'open',
path: 'C:\\mypath\\append.txt' }
Co więcej, appendFile zapisze, gdy jest włączony, więc dzienniki nie będą zapisywane według znacznika czasu. Możesz przetestować na przykład, ustawić 1000 zamiast 100000, kolejność będzie losowa, zależy od dostępu do pliku.
Jeśli chcesz dołączyć do pliku, musisz użyć zapisywalnego strumienia w następujący sposób:
var stream = fs.createWriteStream("append.txt", {flags:'a'});
console.log(new Date().toISOString());
[...Array(10000)].forEach( function (item,index) {
stream.write(index + "\n");
});
console.log(new Date().toISOString());
stream.end();
Kończysz to, kiedy chcesz. Nie musisz nawet używać tej stream.end()opcji, domyślną opcją jest AutoClose:true, więc plik zakończy się po zakończeniu procesu i unikniesz otwierania zbyt wielu plików.