Node.js - Sistema dei File

Benvenuti, futuri programmatori! Oggi esploriamo il mondo emozionante di Node.js e del suo modulo Sistema dei File. Come il vostro amico insegnante di informatica del quartiere, sono qui per guidarvi in questo viaggio con tanti esempi e spiegazioni. Allora, mettetevi all'erta e iniziamo!

Node.js - File System

Sincrono vs Asincrono

Prima di tuffarci nelle operazioni di file, parliamo di due concetti importanti: operazioni sincrone e asincrone.

Immaginate di essere in una caffetteria. In un mondo sincrono, ordinereste il vostro caffè, aspettereste che fosse pronto e poi passereste alla prossima attività. In un mondo asincrono, ordinereste il caffè e poi fareste altre attività mentre il barista lo prepara.

In Node.js, abbiamo sia metodi sincroni che asincroni per le operazioni di file. Ecco un esempio:

const fs = require('fs');

// Lettura sincrona
const data = fs.readFileSync('hello.txt', 'utf8');
console.log(data);

// Lettura asincrona
fs.readFile('hello.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});

Nella versione sincrona, il nostro programma aspetta che il file venga letto prima di procedere. Nella versione asincrona, esso continua l'esecuzione mentre il file viene letto, e poi esegue una funzione di callback quando ha finito.

Scrivere in un file

Ora, impariamo come scrivere in un file. È come lasciare una nota per il vostro futuro voi stessi!

const fs = require('fs');

// Scrittura sincrona
fs.writeFileSync('note.txt', 'Ciao, Futuro Me!');

// Scrittura asincrona
fs.writeFile('note.txt', 'Ciao, Futuro Me!', (err) => {
if (err) throw err;
console.log('File salvato!');
});

In entrambi i casi, stiamo creando (o sovrascrivendo) un file chiamato 'note.txt' con il contenuto "Ciao, Futuro Me!". La versione asincrona include una funzione di callback che si esegue dopo che il file è stato scritto.

Leggere un file

Leggere un file è come aprire la nota che avete lasciato per voi stessi. Vediamo come farlo:

const fs = require('fs');

// Lettura sincrona
const data = fs.readFileSync('note.txt', 'utf8');
console.log(data);

// Lettura asincrona
fs.readFile('note.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});

Entrambi i metodi stamperanno il contenuto di 'note.txt'. Il parametro 'utf8' specifica la codifica del file.

Aprire un file

A volte, vogliamo avere più controllo su come interagiamo con un file. È qui che entra in gioco il metodo open:

const fs = require('fs');

// Apertura asincrona
fs.open('myfile.txt', 'r', (err, fd) => {
if (err) throw err;
console.log('File aperto con successo!');
// Ricordatevi di chiudere il file quando avete finito
fs.close(fd, (err) => {
if (err) throw err;
});
});

Questo apre 'myfile.txt' in modalità di lettura ('r'). Il fd nella callback è un descrittore di file, che useremo per ulteriori operazioni sul file.

API delle Promises

Per chi preferisce lavorare con le Promises (non preoccupatevi se non sapete cosa siano ancora!), Node.js offre un'API basata sulle Promises per le operazioni di file:

const fs = require('fs').promises;

async function readMyFile() {
try {
const data = await fs.readFile('myfile.txt', 'utf8');
console.log(data);
} catch (error) {
console.error('Errore nella lettura del file:', error);
}
}

readMyFile();

Questo ottenere lo stesso risultato del nostro esempio precedente di readFile asincrono, ma utilizzando la sintassi moderna di JavaScript.

Ottenere informazioni su un file

Curiosi delle statistiche di un file? Node.js ha tutto coperto:

const fs = require('fs');

fs.stat('myfile.txt', (err, stats) => {
if (err) throw err;
console.log(`Dimensione del file: ${stats.size} byte`);
console.log(`È una directory? ${stats.isDirectory()}`);
console.log(`È un file? ${stats.isFile()}`);
});

Questo ci dà informazioni come la dimensione del file, se è una directory o un file, e altro.

Chiudere un file

Ricordatevi sempre di chiudere i file quando avete finito. È come rimettere il cappuccio sul dentifricio!

const fs = require('fs');

fs.open('myfile.txt', 'r', (err, fd) => {
if (err) throw err;
// Eseguite alcune operazioni...
fs.close(fd, (err) => {
if (err) throw err;
console.log('File chiuso con successo');
});
});

Troncare un file

A volte, vuoi mantenere un file ma rimuovere il suo contenuto. È qui che entra in gioco il troncare:

const fs = require('fs');

fs.truncate('myfile.txt', 0, (err) => {
if (err) throw err;
console.log('Contenuto del file cancellato!');
});

Questo riduce il file a 0 byte, efficacemente cancellandone i contenuti.

Eliminare un file

Quando hai finito con un file, puoi eliminarlo:

const fs = require('fs');

fs.unlink('myfile.txt', (err) => {
if (err) throw err;
console.log('File eliminato con successo');
});

Siate cauti con questo: non c'è un pulsante "annulla" nella vita reale!

Creare una directory

Hai bisogno di una nuova cartella? Ecco come farla:

const fs = require('fs');

fs.mkdir('mynewfolder', (err) => {
if (err) throw err;
console.log('Directory creata con successo!');
});

Leggere una directory

Vuoi vedere cosa c'è in una directory? Ecco come:

const fs = require('fs');

fs.readdir('.', (err, files) => {
if (err) throw err;
console.log('Contenuti della directory:');
files.forEach(file => {
console.log(file);
});
});

Questo elenca tutti i file e le sottodirectory nella directory corrente.

Rimuovere una directory

E infine, se vuoi rimuovere una directory:

const fs = require('fs');

fs.rmdir('mynewfolder', (err) => {
if (err) throw err;
console.log('Directory rimossa con successo');
});

Nota che questo funziona solo su directory vuote.

Riferimento dei metodi

Ecco una tabella comoda dei metodi che abbiamo coperto:

Metodo Descrizione
readFile Legge l'intero contenuto di un file
writeFile Scrive dati in un file, sostituendo il file se esiste già
open Apre un file per la lettura o la scrittura
close Chiude un descrittore di file
stat Ottiene informazioni su un file
truncate Tronca un file a una lunghezza specificata
unlink Elimina un file
mkdir Crea una nuova directory
readdir Legge i contenuti di una directory
rmdir Rimuove una directory

Ecco fatto! Ora sei equipaggiato con le basi delle operazioni di sistema dei file in Node.js. Ricorda, la pratica fa la perfezione, quindi non abbiate paura di sperimentare con questi metodi. Buon coding!

Credits: Image by storyset