J'ai essayé de trouver un moyen d'écrire dans un fichier lors de l'utilisation de Node.js, mais sans succès. Comment puis je faire ça?
1646
Il y a beaucoup de détails dans l' API du système de fichiers . La manière la plus courante est:
const fs = require('fs');
fs.writeFile("/tmp/test", "Hey there!", function(err) {
if(err) {
return console.log(err);
}
console.log("The file was saved!");
});
// Or
fs.writeFileSync('/tmp/test-sync', 'Hey there!');
{ [Error: EACCES, open '/home/test.txt'] errno: 3, code: 'EACCES', path: '/home/test.txt' }
Comment puis-je modifier ce script pour qu'il fonctionne en dehors de/tmp
?/home/...
. Généralement, ce répertoire est 755 root: wheel (ou autre). Si le nœud veut écrire un fichier en tant que jane, il sera plus facile d'y écrire/home/jane/test.txt
. Changer/home
pour quelque chose de plus permissif que 755 est une énorme erreur./home
répertoire, j'ai suggéré de le modifier. Je sais que cela pourrait générer un problème de sécurité. Mais bon, si l'utilisateur veut y sauvegarder, c'est la solution. PS: je suis d'accord avec ce que vous avez dit (:Actuellement, il existe trois façons d'écrire un fichier:
fs.write(fd, buffer, offset, length, position, callback
)Vous devez attendre le rappel pour vous assurer que le tampon est écrit sur le disque. Ce n'est pas mis en mémoire tampon.
fs.writeFile(filename, data, [encoding], callback)
Toutes les données doivent être stockées en même temps; vous ne pouvez pas effectuer d'écritures séquentielles.
fs.createWriteStream(path, [options]
)Crée un
WriteStream
, ce qui est pratique car vous n'avez pas besoin d'attendre un rappel. Mais encore une fois, ce n'est pas mis en mémoire tampon.A
WriteStream
, comme son nom l'indique, est un flux. Un flux par définition est «un tampon» contenant des données qui se déplacent dans une direction (source ► destination). Mais un flux inscriptible n'est pas nécessairement «tamponné». Un flux est «tamponné» lorsque vous écrivez desn
heures, et à un moment donnén+1
, le flux envoie le tampon au noyau (car il est plein et doit être vidé).En d'autres termes: «Un tampon» est l'objet. Qu'il soit «tamponné» ou non est une propriété de cet objet.
Si vous regardez le code, l'
WriteStream
hérite d'unStream
objet accessible en écriture . Si vous faites attention, vous verrez comment ils vident le contenu; ils n'ont pas de système de mise en mémoire tampon.Si vous écrivez une chaîne, elle est convertie en tampon, puis envoyée à la couche native et écrite sur le disque. Lors de l'écriture de chaînes, ils ne remplissent aucun tampon. Donc, si vous le faites:
Tu fais:
Cela fait trois appels à la couche d'E / S. Bien que vous utilisiez des «tampons», les données ne sont pas tamponnées. Un flux en mémoire tampon ferait:
fs.write(new Buffer ("abc"))
un appel à la couche d'E / S.À partir de maintenant, dans Node.js v0.12 (version stable annoncée le 02/06/2015) prend désormais en charge deux fonctions:
cork()
etuncork()
. Il semble que ces fonctions vous permettront enfin de tamponner / vider les appels d'écriture.Par exemple, en Java, certaines classes fournissent des flux mis en mémoire tampon (
BufferedOutputStream
,BufferedWriter
...). Si vous écrivez trois octets, ces octets seront stockés dans le tampon (mémoire) au lieu d'effectuer un appel d'E / S uniquement pour trois octets. Lorsque le tampon est plein, le contenu est vidé et enregistré sur le disque. Cela améliore les performances.Je ne découvre rien, je me souviens juste comment un accès au disque doit être fait.
la source
cork()
etuncork()
pour ceux d'entre nous qui veulent essayer le noeud pré-version 0.11?npm
implémentation de l'écriture tamponnée?Vous pouvez bien sûr le rendre un peu plus avancé. Non bloquant, écrivant des morceaux et des morceaux, n'écrivant pas le fichier entier à la fois:
la source
Écriture synchrone
Écriture asynchrone
Où
Lire le système vaut fichier fs (offical) docs .
la source
la source
fs.write()
), cet exemple ne fonctionne que si tout est suffisamment court pour être écrit en un seul appel d'écriture.J'ai aimé Index of ./articles/file-system .
Ça a marché pour moi.
Voir aussi Comment écrire des fichiers dans node.js? .
Contenu de helloworld.txt:
Mise à jour:
Comme dans le nœud Linux, écrivez dans le répertoire actuel, il semble que dans certains autres non, alors j'ajoute ce commentaire juste au cas où: l'
utiliser
ROOT_APP_PATH = fs.realpathSync('.'); console.log(ROOT_APP_PATH);
pour obtenir où le fichier est écrit.la source
Les réponses fournies sont datées et une nouvelle façon de procéder est:
voir les documents ici pour plus d'informations
la source
(node:23759) ExperimentalWarning: The fs.promises API is experimental
v10.15.0
Je sais que la question posée sur "écrire" mais dans un sens plus général "ajouter" pourrait être utile dans certains cas car il est facile à utiliser en boucle pour ajouter du texte à un fichier (que le fichier existe ou non). Utilisez un "\ n" si vous souhaitez ajouter des lignes, par exemple:
la source
const
plutôt quevar
, c'estconst fs = require('fs');
-à- dire pour éviter les effets secondaires indésirables, en particulier si vous travaillez avec une base de code un peu plus grande.OK, c'est assez simple car Node a une fonctionnalité intégrée pour cela, cela s'appelle
fs
qui signifie File System et, fondamentalement, NodeJS File System module ...Vous devez donc d'abord l'exiger dans votre fichier server.js comme ceci:
fs
a peu de méthodes pour écrire dans un fichier, mais ma façon préférée est d'utiliserappendFile
, cela ajoutera le contenu au fichier et si le fichier n'existe pas, en créera un, le code pourrait être comme ci-dessous:la source
Par exemple: lire un fichier et écrire dans un autre fichier:
la source
writeFile
?Vous pouvez écrire dans un fichier en utilisant le module fs (système de fichiers).
Voici un exemple de la façon dont vous pouvez le faire:
Vous voudrez peut-être également vous débarrasser de cette structure de code de rappel à l'intérieur en utilisant Promises et
async
/await
instructions . Cela rendra la structure du code asynchrone beaucoup plus plate. Pour ce faire, il existe une fonction util.promisify (originale) pratique qui peut être utilisée. Cela nous permet de passer des rappels aux promesses. Jetez un œil à l'exemple avec lesfs
fonctions ci-dessous:la source
Ici, nous utilisons w + pour lire / écrire les deux actions et si le chemin du fichier n'est pas trouvé, il sera créé automatiquement.
Le contenu signifie ce que vous devez écrire dans le fichier et sa longueur, «content.length».
la source
Voici l'exemple de la façon de lire le fichier csv du local et d'écrire le fichier csv au local.
la source
Après avoir lu ce long article. Vous devez comprendre comment cela fonctionne. Alors, voici un exemple de
createWriteStream()
.la source
createWriteStream
a déjà été mentionné dans plusieurs années de réponse avant celui-ci.Vous pouvez utiliser la bibliothèque
easy-file-manager
installer d'abord à partir de npm
npm install easy-file-manager
Échantillon pour télécharger et supprimer des fichiers
la source
This modules is created to save and remove files.
. Pas une réponse.Vous pouvez écrire dans un fichier par l'exemple de code suivant:
la source
writeFile
avait déjà été donnée plusieurs fois, plusieurs années auparavant. Qu'est-ce que cette réponse ajoute?