Introduction : pourquoi travailler avec le système de fichiers est important dans Node.js
Dans le développement web moderne, il est rare de pouvoir se passer d'interactions avec le système de fichiers. Qu'il s'agisse de télécharger des avatars d'utilisateurs, de générer des journaux, de traiter des rapports CSV ou de lire des fichiers de configuration, Node.js fournit un puissant module intégré fs (File System) pour ces tâches.
Contrairement au JavaScript de navigateur, où l'accès aux fichiers est strictement limité pour des raisons de sécurité, Node.js donne un contrôle total sur le système de fichiers du serveur. Dans cet article, nous allons détailler les opérations clés avec des exemples pratiques qui vous aideront à travailler en toute confiance avec les fichiers et les dossiers.
Ce que vous allez apprendre :
- Comment lire et écrire des fichiers (de manière synchrone et asynchrone)
- Comment travailler avec les flux (Streams) pour les gros fichiers
- Comment créer, renommer et supprimer des dossiers
- Comment gérer correctement les erreurs et les chemins
1. Les bases : lecture et écriture de fichiers
Le module fs propose trois approches principales pour travailler avec les fichiers : synchrone, asynchrone (avec callbacks) et basée sur les promesses. Il est recommandé d'utiliser l'approche asynchrone basée sur les promesses (fs.promises) — elle ne bloque pas la boucle d'événements (Event Loop) et est plus facile à lire.
1.1 Lecture d'un fichier
La façon la plus simple de lire un fichier entièrement est d'utiliser readFile.
const fs = require('fs').promises;
async function readConfig() { try { const data = await fs.readFile('./config.json', 'utf-8'); const config = JSON.parse(data); console.log('Port :', config.port); } catch (err) { console.error('Erreur de lecture :', err.message); }}
readConfig();Important : Spécifiez l'encodage ('utf-8'), sinon un objet Buffer sera retourné.
1.2 Écriture dans un fichier
Pour écrire, utilisez writeFile (remplace le fichier) ou appendFile (ajoute à la fin).
const fs = require('fs').promises;
async function saveLog(message) { const logLine = `[${new Date().toISOString()}] ${message}`; try { await fs.appendFile('./app.log', logLine); console.log('Journal sauvegardé'); } catch (err) { console.error('Erreur d\'écriture :', err); }}
saveLog('Serveur démarré');2. Travailler avec les gros fichiers : Streams (flux)
Imaginez que vous deviez lire un fichier de 2 Go. La méthode readFile le chargerait entièrement en mémoire vive, ce qui pourrait entraîner une fuite de mémoire. Pour de tels cas, il existe les flux (fs.createReadStream et fs.createWriteStream).
Un flux traite les données par parties (morceaux), sans stocker tout le fichier en mémoire.
Exemple : copie d'un gros fichier
const fs = require('fs');const path = require('path');
const source = path.join(__dirname, 'bigfile.zip');const destination = path.join(__dirname, 'copy.zip');
const readStream = fs.createReadStream(source);const writeStream = fs.createWriteStream(destination);
readStream.on('data', (chunk) => { console.log(`Lu ${chunk.length} octets`); writeStream.write(chunk);});
readStream.on('end', () => { writeStream.end(); console.log('Copie terminée');});
readStream.on('error', (err) => { console.error('Erreur de lecture :', err);});Conseil : Pour la copie, il est plus pratique d'utiliser la méthode intégrée pipeline du module stream — elle gère automatiquement les erreurs et ferme les flux.
3. Gestion des répertoires
Travailler avec les dossiers est une partie tout aussi importante. Node.js permet de créer, lire et supprimer des répertoires.
3.1 Création et vérification d'un dossier
const fs = require('fs').promises;
async function ensureDir(dirPath) { try { await fs.mkdir(dirPath, { recursive: true }