Blog ENI : Toute la veille numérique !
Jusqu'à ce soir ! : -25€ dès 75€ sur les livres en ligne, vidéos... code FUSEE25. J'en profite !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Node.js
  3. Manipulation de fichiers
Extrait - Node.js Exploitez la puissance de JavaScript côté serveur
Extraits du livre
Node.js Exploitez la puissance de JavaScript côté serveur
1 avis
Revenir à la page d'achat du livre

Manipulation de fichiers

Introduction

Node contient tout le nécessaire pour manipuler des fichiers de façon multiplate-forme. C’est donc dans ce chapitre dédié à cela que seront traitées d’abord la manipulation de chemins pour accéder à vos fichiers, puis la suite logique, c’est-à-dire la manipulation de dossiers. Ensuite viendra le détail du traitement des fichiers eux-mêmes, avec de nombreuses possibilités intéressantes (métadonnées, surveillance). Pour conclure, vous apprendrez aussi à manipuler des liens symboliques.

La plupart des fonctions présentées dans ce chapitre interagissent avec le système de fichiers et sont donc asynchrones.

Il faut savoir qu’elles existent aussi en versions synchrones pouvant être utiles dans certains cas très particuliers, mais elles devraient être évitées autant que possible : c’est pour cela que nous avons fait le choix de ne pas les présenter ici.

Manipulation de chemin

Tout est dans le module standard path.

À noter que toutes les fonctions ci-après ne touchent pas le système de fichiers mais travaillent exclusivement sur les chaînes.


var pathLib = require('path');
 

Contrairement à la pratique habituelle, qui veut que l’on nomme la variable symbolisant le module comme celui-ci, on utilise pathLib à la place de path car ce dernier est trop commun et risque d’entrer en conflit avec les variables locales.

Les fonctions dirname(path), basename(path, [ext]) et extname(path) permettent de récupérer respectivement la partie dossier, base (nom du fichier sans l’extension) et extension du chemin.


     Dossier (dir)     Extension (ext) 
  images/trait1.PNG     images/trait2.PNG 
/usr/local/include/node/node.h  
                        images/trait3.PNG 
                         Base  
var path = '/usr/local/include/node/node.h';  
  
var dir = pathLib.dirname(path);  
// images/fleche.PNG /usr/local/include/node  
  
var base = pathLib.basename(path);  
// images/fleche.PNG node.h  
  
var ext = pathLib.extname(path);  
// images/fleche.PNG .h
 

Comme on peut le voir, par défaut, la base comprend l’extension. Si elle n’est pas souhaitée...

Manipulation de dossiers

Les fonctions suivantes se trouvent dans le module standard fs. Pensez donc à l’inclure :


var fs = require('fs');
 

La lecture du contenu d’un répertoire se fait grâce à la fonction readdir, prenant comme paramètres le chemin du répertoire et une callback. Cette dernière affiche la liste des fichiers trouvés, ou une erreur en cas d’échec de la lecture du dossier.


fs.readdir('./mondossier', function (error, files) {  
    if (error) {  
        console.error('échec de lecture du répertoire', error);  
    } else {  
        console.log('fichiers trouvés :', files);  
    }  
});
 

La création d’un seul répertoire est réalisée par la fonction mkdir, bien connue sous un système Unix. Elle demande deux paramètres, comme la fonction précédente : le chemin du dossier à créer, et une callback pour afficher le résultat.


fs.mkdir('./logs', function (error) {  
    if (error) {  
        console.error('échec de création du répertoire', error);  
    }   else {  ...

Manipulation de fichiers

Le module fs expose toutes les fonctions nécessaires pour manipuler des fichiers.

Le paquet graceful-fs (http://npmjs.org/package/graceful-fs) propose la même API que le module fs, mais améliore la portabilité et est plus robuste aux erreurs.

1. Métadonnées

La fonction exists permet de tester simplement l’existence d’un fichier (en réalité, toute entrée dans un système de fichiers : fichier, dossier, etc.). On lui passe le chemin vers le fichier à vérifier et une callback :


fs.exists('/tmp/', function (doesExist) {  
    if (doesExist) {  
        console.log('le fichier existe');  
    } else {  
        console.log('le fichier n\'existe pas');  
    }  
});
 

Pour des raisons historiques, contrairement à la convention dans Node, cette fonction ne passe pas d’erreur en premier argument à la fonction de rappel.

Nous présentons cette fonction car elle peut avoir son utilité, mais il faut savoir que dans la majorité des cas il vaut mieux l’éviter.

En effet, l’utiliser pour vérifier l’existence d’un fichier avant d’effectuer une opération est un anti-pattern car cette pratique est sensible aux situations de compétitions, comme l’illustre le code suivant :


// Condition initiale : création du fichier  
fs.writeFile('foo', '', function (error) {  
    if (error) {  
        console.error(error);  
    }  
  
    // Compétiteur 1 : on enregistre ce fichier pour suppression.  
    process.nextTick(function () {  
        // Supprime le fichier foo.  
        fs.unlink('foo');  
    });  
  
    // Test de l'existence du fichier.  
    fs.exists('foo', function (doesExists) {  
        if (!doesExists) {  
            console.log('le fichier n\'existe...

Manipulation de liens symboliques

Certains systèmes d’exploitation comme Unix, Mac OS X ou Windows (à partir de Vista) supportent un type de fichier spécial appelé lien symbolique.

Un lien symbolique est une référence vers un autre fichier ou dossier. La plupart des opérations, comme la lecture ou l’écriture, s’appliquent automatiquement à la destination du lien en lieu et place du lien lui-même.

Parfois, cependant, le développeur souhaite bel et bien manipuler le lien et non le fichier référencé. C’est pourquoi Node propose plusieurs opérations alternative ne suivant pas automatiquement les liens.

Ces fonctions ont la même signature que leur original mais leur nom est préfixé par la lettre l.

Voici quelques-unes d’entre elles :

  • lchmod(path, mode, callback)

  • lchown(path, uid, gid, callback)

  • lstat(path, callback)

La fonction symlink(src, dst, callback) permet de créer un lien symbolique, en prenant en paramètres le fichier source src, la destination dst et la callback.


fs.symlink('/home/florian/public_html', '/var/www/florian', 
function (error) {  
    if (error) {  
        console.error('échec de création du lien', error);  
    } else {  
        console.log('lien...