J'essaie d' ajouter une chaîne à un fichier journal. Cependant writeFile effacera le contenu à chaque fois avant d'écrire la chaîne.
fs.writeFile('log.txt', 'Hello Node', function (err) {
if (err) throw err;
console.log('It\'s saved!');
}); // => message.txt erased, contains only 'Hello Node'
Une idée de comment le faire facilement?
process.exit()
juste aprèsfs.appendFile
, vous pouvez quitter avant d'envoyer la sortie. (L'utilisationreturn
est très bien.)appendFileSync
. nodejs.org/api/… Mais vous risquez de perdre l'un des grands avantages de Node, qui est les opérations asynchrones. Assurez-vous de détecter les erreurs. Peut-être que sur certains systèmes d'exploitation, l'accès peut être refusé si vous demandez le descripteur de fichier en même temps. Je n'en suis pas sûr.Lorsque vous souhaitez écrire dans un fichier journal, c'est-à-dire ajouter des données à la fin d'un fichier, n'utilisez jamais
appendFile
.appendFile
ouvre un descripteur de fichier pour chaque élément de données que vous ajoutez à votre fichier, après un certain temps, vous obtenez une belleEMFILE
erreur.Je peux ajouter que ce
appendFile
n'est pas plus facile à utiliser qu'unWriteStream
.Exemple avec
appendFile
:Jusqu'à 8000 sur mon ordinateur, vous pouvez ajouter des données au fichier, puis vous obtenez ceci:
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:
Vous y mettez fin quand vous voulez. Vous n'êtes même pas obligé d'utiliser
stream.end()
, l'option par défaut estAutoClose:true
, donc votre fichier se terminera à la fin de votre processus et vous éviterez d'ouvrir trop de fichiers.la source
stream.end()
avant lestream.write()
, donc nous ne devrions pas utiliserstream.end()
, également comme vous l'avez mentionné, c'estAutoClose:True
une option par défaut, alors pourquoi prendre la peine d'écrire une ligne qui n'est pas utilisation.due to asynchronous nature of Javascript
... Quoi? Array.forEach est une opération synchrone. JS est synchrone. Il se trouve que cela fournit des moyens de gérer les opérations asynchrones, comme Promises et async / wait.fs.appendFile
entraînerait trop de fichiers ouverts parce que vous l'exécutez de manière asynchrone (vous créez simplement un descripteur de fichier 10000 de manière asynchrone), je penseappendFileSync
qu'il n'y aurait pas de problème similaire, pas plusfs.appendFile
avec un intervalle approprié (1 s est probablement plus que suffisant) ou faire la queue.Votre code utilisant createWriteStream crée un descripteur de fichier pour chaque écriture. log.end est meilleur car il demande au nœud de se fermer immédiatement après l'écriture.
la source
var fs = require('graceful-fs')
, ce qui a permis de résoudre certains problèmes connus. Voir la documentation pour plus d'informations.fs.createWriteStream
, utilisezflags
. Si vous utilisezfs.writeFile
alors c'est le casflag
. Veuillez consulter Node JS Docs - File System pour plus d'informations.En outre
appendFile
, vous pouvez également passer un indicateurwriteFile
pour ajouter des données à un fichier existant.En passant le drapeau 'a', les données seront ajoutées à la fin du fichier.
la source
fs.createWriteStream
, utilisezflags
. Si vous utilisezfs.writeFile
alors c'est le casflag
. Veuillez consulter Node JS Docs - File System pour plus d'informations.Vous devez l'ouvrir, puis y écrire.
Voici quelques liens qui vous aideront à expliquer les paramètres
ouvrir
écrire
fermer
EDIT : Cette réponse n'est plus valide, examinez la nouvelle méthode fs.appendFile pour l'ajout.
la source
Node.js 0.8 a
fs.appendFile
:Documentation
la source
la source
Si vous voulez un moyen simple et sans stress d'écrire les journaux ligne par ligne dans un fichier, alors je recommande fs-extra :
Testé avec Node v8.9.4.
la source
Mon approche est assez particulière. J'utilise essentiellement la
WriteStream
solution mais sans réellement «fermer» le fd en utilisantstream.end()
. Au lieu de cela, j'utilisecork
/uncork
. Cela a l'avantage de la faible utilisation de la RAM (si cela importe pour tout le monde) et je pense qu'il est plus sûr d'utiliser pour la journalisation / l'enregistrement (mon cas d'utilisation d'origine).Voici un exemple assez simple. Remarquez que je viens d'ajouter une pseudo
for
boucle pour la vitrine - dans le code de production, j'attends des messages websocket.uncork
va vider les données dans le fichier dans la prochaine coche.Dans mon scénario, il existe des pics allant jusqu'à ~ 200 écritures par seconde dans différentes tailles. Pendant la nuit, cependant, seules quelques écritures par minute sont nécessaires. Le code fonctionne de manière extrêmement fiable même pendant les périodes de pointe.
la source
Je propose cette suggestion uniquement parce que le contrôle des drapeaux ouverts est parfois utile, par exemple, vous pouvez d'abord le tronquer un fichier existant, puis y ajouter une série d'écritures - dans ce cas, utilisez le drapeau «w» lors de l'ouverture du fichier et ne le fermez pas avant d'avoir terminé toutes les écritures. Bien sûr, appendFile peut être ce que vous recherchez :-)
la source
Utilisation du package jfile :
la source
Utiliser
fs.appendFile
oufsPromises.appendFile
sont les options les plus rapides et les plus robustes lorsque vous devez ajouter quelque chose à un fichier.Contrairement à certaines des réponses suggérées, si le chemin du fichier est fourni à la
appendFile
fonction, il se ferme en fait par lui-même . Ce n'est que lorsque vous passez un descripteur de fichier que vous obtenez quelque chose commefs.open()
vous devez prendre soin de le fermer.Je l'ai essayé avec plus de 50 000 lignes dans un fichier.
Exemples :
Réf: https://github.com/nodejs/node/issues/7560
Exemple d'exécution: https://github.com/apickjs/apickFS/blob/master/writeLines.js
la source
Voici un script complet. Remplissez vos noms de fichiers et exécutez-le et cela devrait fonctionner! Voici un didacticiel vidéo sur la logique derrière le script.
la source
un moyen plus simple de le faire est
la source
appendFileSync
solution?la source
En plus de la réponse de denysonique , le type parfois asynchrone de
appendFile
et d'autres méthodes asynchrones dans NodeJS sont utilisés où la promesse revient au lieu de passer le rappel. Pour ce faire, vous devez envelopper la fonction avecpromisify
HOF ou importer des fonctions asynchrones à partir de l'espace de noms des promesses:J'espère que ça va aider 😉
la source