Node fs : comment utiliser File System de NodeJS?

Lucas Roquilly

Publié le 28 avril 2020

Créer et gérer des fichiers pour y stocker ou lire des informations font partie des tâches les plus communes d’un serveur. Environnement d’exécution JavaScript côté serveur pensé pour faire gagner du temps aux développeurs, Node.js propose une façon intuitive de travailler avec le système de fichiers à travers son module fs pour “File System”.

Dans ce tutoriel, découvrez comment fonctionnent le module Node FS et ses fonctions principales dans ce guide complet.

Node fs : comment fonctionne le gestionnaire de fichiers Node ?

Le module fs est livré nativement avec Node js. Pour l’inclure dans votre projet, utilisez simplement la fonction require :

const fs = require('fs');

Vous avez désormais accès à un certain nombre de fonctions dont les principales sont :

  • Créer des fichiers
  • Lire des fichiers
  • Écrire dans des fichiers
  • Copier des fichiers
  • Renommer des fichiers
  • Supprimer des fichiers

D’autres fonctions sont disponibles : créer, supprimer ou renommer un dossier ; gérer les permissions relatives à un fichier ; créer des liens symboliques ou tronquer un fichier, etc.

Une chose singulière est à noter sur le module node fs : toutes les fonctions sont asynchrones par défaut (elles ne bloquent pas le code et fonctionnent en arrière-plan) mais peuvent aussi fonctionner synchroniquement. Il suffit alors d’ajouter Sync au nom de la fonction. Par exemple : la fonction pour renommer un fichier fs.readFile() devient fs.readFileSync(). Vous trouverez plus d’informations sur les fonctions fs synchrones plus bas dans le guide.

Create file Node Js : la création de fichier

Le module fs Node propose trois fonctions pour créer un nouveau fichier :

  • fs.appendFile()
  • fs.open()
  • fs.writeFile()

La fonction fs.appendFile() permet d’ajouter du contenu à un fichier. Si le fichier n’existe pas, il est créé.

const fs = require('fs');
fs.appendFile('nouveauFichier.txt', 'Mon contenu', function (err) {
   if (err) throw err;
   console.log('Fichier créé !');
});

La fonction fs.open() permet d’ouvrir un fichier avec une certaine autorisation. Si l’argument “w” (pour “writing”) est spécifié en deuxième paramètre, le fichier sera ouvert pour écriture. S’il n’existe pas, un fichier vide est créé.

const fs = require('fs');
fs.open('nouveauFichier.txt', 'w', function (err, file) {
   if (err) throw err;
   console.log('Fichier créé !');
});

La fonction fs.writeFile() permet de remplacer le contenu d’un fichier avec node fs. Si le fichier n’existe pas, un fichier est créé avec le contenu spécifié.

const fs = require('fs');
fs.writeFile('nouveauFichier.txt', 'Mon contenu', function (err) {
   if (err) throw err;
   console.log('Fichier créé !');
});

Node Read File : lire vos fichiers

La fonction fs.readFile() permet de lire un fichier. N’oubliez pas de préciser l’encodage nécessaire à la lecture ! En effet, si vous avez inséré du contenu nécessitant l’encodage utf8 (qui gère tous les caractères spéciaux de tous les alphabets du monde), spécifiez cet encodage en deuxième paramètre de la fonction. Sinon, le contenu de votre fichier ne sera pas interprété comme étant écrit en utf8 et provoquera des erreurs d’interprétation par le module fs.

const fs = require('fs');

 fs.readFile('nouveauFichier.txt', 'utf8', function(err, data) {
   const content = data;
   console.log(content);
 });

Node FS Write : écrire dans vos fichiers

Le fs module Node propose plusieurs fonctions pour écrire dans vos fichiers, dont celles que l’on a déjà vues dans la création de fichier :

  • fs.appendFile()
  • fs.writeFile()
  • fs.write()
  • fs.createWriteStream

La fonction fs.appendFile() permet d’ajouter du contenu à la fin d’un fichier avec node fs.

const fs = require('fs');

fs.appendFile('nouveauFichier.txt', ' - Mon nouveau contenu', function (err) {
   if (err) throw err;
   console.log('Fichier mis à jour !');
});

La fonction fs.writeFile() permet de remplacer le contenu d’un fichier avec un autre contenu.

const fs = require('fs');

fs.writeFile('nouveauFichier.txt', 'Mon nouveau contenu', function (err) {
   if (err) throw err;
   console.log('Fichier mis à jour !');
});

La fonction fs.write() de node fs permet un contrôle plus étendu sur votre édition de fichier. Elle est à utiliser lorsque vous savez précisément à quel octet précis de votre fichier vous souhaitez insérer du contenu.

const fs = require('fs');

fs.open('nouveauFichier.txt', 'w+', (err, fd) => {
   let buf = Buffer.from('Mon nouveau contenu'),
   pos = 0,offset = 0,
   len = buf.length;
   fs.write(fd, buf, offset, len, pos, (err,bytes,buff) => {
      let buf2 = Buffer.alloc(len);
      fs.read(fd,buf2,offset, len, pos,(err,bytes,buff2) => {
         console.log('Fichier mis à jour !');
      });
    });
});

La fonction fs.createWriteStream() permet de créer un flux et de l’écrire dans un fichier. Utiliser un flux permet d’écrire dans un fichier en plusieurs fois à intervalles réguliers, ce qui économise l’usage de RAM car le fichier n’est pas chargé complètement en mémoire. Cette méthode est à préférer pour la gestion de fichiers particulièrement lourds.

const fs = require('fs');

let writeStream = fs.createWriteStream('nouveauFichier.txt');
writeStream.write('Mon contenu de flux', 'utf-8');
writeStream.on('finish', () => {
   console.log('Fichier mis à jour !');
});

writeStream.end();

Node FS pour copier vos fichiers

Selon la version de Node que vous utilisez, deux options s’offrent à vous pour copier un fichier :

  • fs.createReadStream() et fs.createWriteStream() - avant node v8.5.0
  • fs.copyFile() - depuis node v8.5.0

Combiner fs.createReadStream() et fs.createWriteStream() permet de copier un fichier en une seule ligne de code.

const fs = require('fs');

fs.createReadStream('nouveauFichier.txt').pipe(fs.createWriteStream('nouveauFichier_copie.txt'));

JavaScript

Depuis node v.8.5.0, la fonction fs.copyFile() a été introduite et permet de copier un fichier.

const fs = require('fs');

fs.copyFile('nouveauFichier.txt', 'nouveauFichier_copie.txt', (err) => {
 if (err) throw err;
 console.log('Fichier copié !');
});

Rename file Node Js : pour renommer vos fichiers

La fonction fs.rename() permet de renommer un fichier.

const fs = require('fs');

fs.rename('nouveauFichier.txt', 'fichier.txt', function (err) {
 if (err) throw err;
 console.log('Fichier renommé !');
});

Node FS pour supprimer vos fichiers

La fonction fs.unlink() permet de supprimer un fichier.

const fs = require('fs');

fs.unlink('fichier.txt',(err) => {
   if (err) throw err;
   console.log('Fichier supprimé !');
});

ReadFileSync : les fonctions synchrones du module Node fs

Les fonctions du module fs de NodeJS s’exécutent de façon asynchrone par défaut, c’est-à-dire qu’elles ne bloquent pas l’exécution du code avant d’être terminées : elles fonctionnent à l’arrière-plan.

Ces fonctions node fs peuvent également s'exécuter de façon synchrone ou bloquante. L’exécution du reste du code est alors suspendue le temps que la fonction se termine et retourne son résultat.

Pour exécuter une fonction fs synchroniquement, il suffit de rajouter Sync à la fin de la fonction. Par exemple, fs.readFile() devient fs.readFileSync().

Cela peut avoir une énorme incidence sur votre façon de travailler. Par exemple, la fonction fs.rename() s’utilise avec un callback qui signifie la fin de l’exécution de la fonction node fs :

const fs = require('fs')

fs.rename('fichier.txt', 'fichierRenommé.txt', err => {
 if (err) return console.error('Erreur : le fichier n\'a pu être renommé');
 console.log('Fonction rename terminée');
})

À l’inverse, la fonction fs.renameSync() s’utilise plutôt avec un block try/catch :

const fs = require('fs')

try {
   fs.renameSync('fichier.txt', 'fichierRenommé.txt')
} catch (err) {
   console.error('Erreur : le fichier n\'a pu être renommé');
}

Derniers articles

Mardi 15 Juin 2021, Vercel a dévoilé la version 11 du framework Next.js. Cette nouvelle version apporte des optimisations sur le plan des performances mais facilite également la collaboration entre développeurs et entre les différents partis prenants du projet.

Le recrutement du premier développeur pour une entreprise peut être une embauche très longue, coûteuse et potentiellement risquée si l'entreprise n'a pas les compétences en interne.

Bien qu'Express soit le framework NodeJS archi dominant, Fastify propose une alternative moderne tout en restant un framework dit "de bas niveau", permettant aux développeurs de composer leurs applications avec les librairies de leurs choix.

Avoir des tests automatisés permet à une application d'être plus durable et résistante aux évolutions. Entre les tests unitaires, tests fonctionnels ou tests end-to-end, comment prioriser son temps de dev?

L'agent de développeur vous accompagne et vous informe tout au long de votre carrière pour vous aider à atteindre vos objectifs. Découvrez pourquoi faire appel à un agent

En tant que développeur backend, vous serez attendu sur plusieurs problématiques qui ne sont pas abordées lors des tutos ou des formations. Découvrez les points à travailler pour devenir un bon développeur backend.