fs.writeFile(path, data, callback) écrit une chaîne ou un Buffer dans un fichier. Si le fichier n'existe pas, Node le crée ; s'il existe, l'ancien contenu est remplacé. fs.writeFileSync(path, data) fait la même chose et attend la fin de l'écriture, et fs.appendFile ajoute à la fin du fichier au lieu de le remplacer.
Le programme affiche saved, puis le texte relu ; le callback ne reçoit qu'une erreur (ou null), jamais les données. Passez 42 à la place de la chaîne et l'appel lève une TypeError : les données doivent être une chaîne ou un Buffer.
writeFile, writeFileSync et fs/promises
Les trois formes prennent les mêmes arguments et diffèrent par la façon d'attendre le résultat.
const fs = require('fs');
const fsp = require('fs/promises');
fs.writeFileSync('a.txt', 'one'); // blocks, throws on error
fs.writeFile('b.txt', 'two', (err) => {}); // callback with err
await fsp.writeFile('c.txt', 'three'); // promise, use in async code
Utilisez writeFileSync dans les scripts et le code de démarrage, et la version à promesses dans les serveurs, où une écriture synchrone bloque toutes les autres requêtes jusqu'à ce que le disque ait fini. La page sur fs/promises montre le reste de l'API à promesses.
Ajouter à un fichier avec appendFile
writeFile remplace tout le fichier. Pour ajouter une ligne à un log, utilisez appendFile, qui crée aussi le fichier la première fois.
La première lecture affiche "second\n", car le second writeFileSync a remplacé first, et la seconde affiche "second\nthird\nfourth\n" (JSON.stringify rend les sauts de ligne visibles). Ajoutez le \n vous-même : aucune des deux fonctions ne le fait.
writeFile | appendFile | |
|---|---|---|
| Fichier absent | Le crée | Le crée |
| Fichier existant | Remplace le contenu | Ajoute à la fin |
| Flag par défaut | 'w' | 'a' |
| Usage courant | Enregistrer un document entier ou du JSON | Les logs, une ligne à la fois |
Ne pas écraser : l'option flag
Le troisième argument peut être un objet d'options. Son flag décide de ce qui arrive à un fichier existant. 'wx' signifie « écrire, mais échouer si le fichier existe déjà », la façon sûre de ne créer un fichier qu'une seule fois.
Le second appel échoue avec EEXIST, donc le fichier contient toujours abc123. Remplacez le nom de fichier du second appel par id2.txt et les deux appels affichent created.
Les flags que vous croiserez le plus : 'w' (par défaut, remplacer), 'a' (ajouter), 'wx' (créer uniquement) et 'ax' (ajouter, mais seulement à un nouveau fichier).
Vérifier d'abord avec fs.existsSync puis écrire laisse un trou : un autre processus peut créer le fichier entre la vérification et l'écriture. 'wx' fait les deux en une seule étape.
Écrire du JSON dans un fichier
writeFile n'accepte pas les objets. Transformez-les en texte avec JSON.stringify ; le troisième argument, 2, indente la sortie pour que le fichier soit lisible.
Le fichier contient l'objet sur plusieurs lignes indentées, et le parser à nouveau donne un objet identique, donc la dernière ligne affiche 2. Passez l'objet sans JSON.stringify et l'appel lève une TypeError.
Créer d'abord le dossier avec mkdir
writeFile crée des fichiers, pas des dossiers. Écrire dans reports/2026/june.txt quand reports n'existe pas échoue avec ENOENT. Créez d'abord le chemin avec mkdir et { recursive: true }, qui crée tous les dossiers manquants et ne fait rien s'ils existent déjà.
La première écriture échoue avec ENOENT ; après mkdir, la même écriture réussit et readdir liste [ 'june.txt' ]. Dans du vrai code, construisez ces chemins avec path.join pour qu'ils marchent aussi sous Windows.
Erreurs fréquentes
Supposer que le fichier est écrit juste après l'appel. fs.writeFile rend la main avant que les données soient sur le disque. Lisez le fichier ou passez à l'étape suivante dans le callback, ou attendez la version à promesses avec await.
Perdre des données en écrivant dans une boucle. Appeler writeFile une fois par élément remplace le fichier à chaque fois, et seul le dernier élément reste. Utilisez appendFile, ou construisez toute la chaîne et écrivez-la une seule fois.
Écrire [object Object]. Passer un objet dans String() ou dans un template literal écrit [object Object]. Utilisez JSON.stringify.
Questions fréquentes
fs.writeFile écrase-t-il le fichier ?
Oui. Avec le flag par défaut 'w', il vide le fichier et écrit les nouvelles données, donc l'ancien contenu disparaît. Passez { flag: 'a' } ou utilisez appendFile pour ajouter à la fin à la place.
fs.writeFile crée-t-il le fichier s'il n'existe pas ?
Oui, il crée le fichier. En revanche, il ne crée pas les dossiers manquants : écrire dans logs/app.log quand logs n'existe pas échoue avec ENOENT.
Que peut-on passer comme données ?
Une chaîne, un Buffer ou un typed array. Tout le reste, comme un objet ou un nombre, lève une TypeError, donc convertissez d'abord les objets avec JSON.stringify et les nombres avec String().
Peut-on appeler writeFile plusieurs fois en même temps sur le même fichier ?
Non. Deux appels à writeFile en parallèle sur un même fichier peuvent s'entremêler et laisser un contenu mélangé. Attendez la fin de l'un avant de lancer le suivant, ou rassemblez les données et écrivez une seule fois.