fs.writeFile(path, data, callback) scrive una stringa o un Buffer in un file. Se il file non esiste, Node lo crea; se esiste, il vecchio contenuto viene sostituito. fs.writeFileSync(path, data) fa lo stesso e aspetta che la scrittura sia finita, mentre fs.appendFile aggiunge in fondo al file invece di sostituirlo.
Stampa saved e poi il testo riletto; la callback riceve solo un errore (o null), mai i dati. Passa 42 al posto della stringa e la chiamata lancia un TypeError: i dati devono essere una stringa o un Buffer.
writeFile, writeFileSync e fs/promises
Le tre forme ricevono gli stessi argomenti e cambiano nel modo in cui aspetti il risultato.
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
Usa writeFileSync negli script e nel codice di avvio, e la versione a promise nei server, dove una scrittura sincrona blocca tutte le altre richieste finché il disco non ha finito. La pagina su fs/promises mostra il resto dell'API a promise.
Aggiungere a un file con appendFile
writeFile sostituisce tutto il file. Per aggiungere una riga a un log usa appendFile, che crea il file anche la prima volta.
La prima lettura stampa "second\n", perché il secondo writeFileSync ha sostituito first, e la seconda stampa "second\nthird\nfourth\n" (JSON.stringify rende visibili gli a capo). Aggiungi tu il \n: nessuna delle due funzioni lo fa.
writeFile | appendFile | |
|---|---|---|
| File mancante | Lo crea | Lo crea |
| File esistente | Sostituisce il contenuto | Aggiunge in fondo |
| Flag predefinito | 'w' | 'a' |
| Uso tipico | Salvare un documento intero o JSON | Log, una riga alla volta |
Non sovrascrivere: l'opzione flag
Il terzo argomento può essere un oggetto di opzioni. Il suo flag decide cosa succede a un file esistente. 'wx' significa "scrivi, ma fallisci se il file esiste già", che è il modo sicuro per creare un file una volta sola.
La seconda chiamata fallisce con EEXIST, quindi il file contiene ancora abc123. Cambia il nome del file della seconda chiamata in id2.txt ed entrambe le chiamate stampano created.
I flag che incontrerai più spesso: 'w' (predefinito, sostituisce), 'a' (aggiunge), 'wx' (solo creazione) e 'ax' (aggiunge, ma solo a un file nuovo).
Controllare prima con fs.existsSync e poi scrivere lascia un buco: un altro processo può creare il file tra il controllo e la scrittura. 'wx' fa entrambe le cose in un solo passaggio.
Scrivere JSON su un file
writeFile non accetta oggetti. Trasformali in testo con JSON.stringify; il terzo argomento, 2, indenta l'output così il file è leggibile.
Il file contiene l'oggetto su più righe indentate, e rileggendolo con il parsing si ottiene un oggetto uguale, quindi l'ultima riga stampa 2. Passa l'oggetto senza JSON.stringify e la chiamata lancia un TypeError.
Creare prima la cartella con mkdir
writeFile crea file, non cartelle. Scrivere su reports/2026/june.txt quando reports non esiste fallisce con ENOENT. Crea prima il path con mkdir e { recursive: true }, che crea tutte le cartelle mancanti e non fa niente se esistono già.
La prima scrittura fallisce con ENOENT; dopo mkdir la stessa scrittura riesce e readdir elenca [ 'june.txt' ]. Nel codice vero costruisci questi path con path.join, così funzionano anche su Windows.
Errori comuni
Dare per scontato che il file sia scritto subito dopo la chiamata. fs.writeFile ritorna prima che i dati siano sul disco. Leggi il file o passa al passaggio successivo dentro la callback, oppure fai await della versione a promise.
Perdere dati scrivendo in un ciclo. Chiamare writeFile una volta per elemento sostituisce il file ogni volta, e resta solo l'ultimo elemento. Usa appendFile, oppure costruisci tutta la stringa e scrivila una volta sola.
Scrivere [object Object]. Passare un oggetto a String() o a un template literal scrive [object Object]. Usa JSON.stringify.
Domande frequenti
fs.writeFile sovrascrive il file?
Sì. Con il flag predefinito 'w' svuota il file e scrive i nuovi dati, quindi il vecchio contenuto sparisce. Passa { flag: 'a' } o usa appendFile per aggiungere in fondo.
fs.writeFile crea il file se non esiste?
Sì, crea il file. Però non crea le cartelle mancanti: scrivere su logs/app.log quando logs non esiste fallisce con ENOENT.
Cosa posso passare come dati?
Una stringa, un Buffer o un typed array. Qualsiasi altra cosa, come un oggetto o un numero, lancia un TypeError, quindi converti prima gli oggetti con JSON.stringify e i numeri con String().
Posso chiamare writeFile più volte in contemporanea sullo stesso file?
No. Due chiamate a writeFile in parallelo sullo stesso file possono intrecciarsi e lasciare contenuti mescolati. Aspetta che una finisca prima di avviare la successiva, oppure raccogli i dati e scrivi una volta sola.