Lorsque vous souhaitez écrire dans un fichier journal, c'est-à-dire ajouter des données à la fin d'un fichier, n'utilisez jamaisappendFile . appendFileouvre un descripteur de fichier pour chaque élément de données que vous ajoutez à votre fichier, après un certain temps, vous obtenez une belle EMFILEerreur.
Je peux ajouter que ce appendFilen'est pas plus facile à utiliser qu'un WriteStream.
Exemple avec 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());
Jusqu'à 8000 sur mon ordinateur, vous pouvez ajouter des données au fichier, puis vous obtenez ceci:
{ 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' }
De plus, appendFileécrit quand il est activé, donc vos journaux ne seront pas écrits par horodatage. Vous pouvez tester avec un exemple, définir 1000 au lieu de 100000, l'ordre sera aléatoire, dépend de l'accès au fichier.
Si vous souhaitez ajouter à un fichier, vous devez utiliser un flux inscriptible comme celui-ci:
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();
Vous y mettez fin quand vous voulez. Vous n'êtes même pas obligé d'utiliser stream.end(), l'option par défaut est AutoClose:true, donc votre fichier se terminera à la fin de votre processus et vous éviterez d'ouvrir trop de fichiers.