Utiliser le système de fichiers

Effectué

Chacun des magasins Tailwind Traders écrit son total de ventes dans un fichier qu’il envoie ensuite dans un emplacement central. Pour exploiter ces fichiers, l’entreprise doit créer un processus de traitement par lots utilisable avec le système de fichiers.

Ici, vous apprenez à utiliser Node.js pour lire le système de fichiers et découvrir les fichiers et les répertoires.

Inclure le module fs

Node.js fournit un module intégré, fs (qui signifie file system), permettant d’utiliser le système de fichiers. Étant donné qu’il fait partie du runtime Node.js, vous n’avez pas besoin de l’installer ; vous le référencez comme vous le feriez pour toute autre dépendance.

Le module fs a un espace de noms promises qui a des versions promise de toutes les méthodes. L’utilisation de l’espace de noms promise est le meilleur moyen d’utiliser le module fs, car cela vous permet d’utiliser async et d’éviter les rappels ou le blocage des méthodes synchrones.

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

Vous pouvez utiliser le module fs pour effectuer diverses opérations sur les fichiers et les répertoires. Il offre plusieurs méthodes de sélection. Pour le moment, nous allons nous concentrer sur ce que vous devez savoir pour utiliser des répertoires.

Lister le contenu d’un répertoire avec fs.readdir

L’une des tâches que vous faites souvent avec le module fs est de lister ou d’énumérer le contenu d’un répertoire. Par exemple, Tailwind Traders a un dossier racine nommé stores. Les sous-dossiers de ce dossier sont organisés par numéro de magasin. Dans ces dossiers se trouvent les fichiers des totaux de ventes. La structure ressemble à ceci :

📂 stores
    📄 sales.json
    📄 totals.txt
    📂 201
    📂 202

Pour lire le contenu du dossier, vous pouvez utiliser la méthode asynchrone readdir. La plupart des opérations sur le module fs ont des options synchrones et asynchrones (ayant le suffixe Sync). Les résultats sont retournés dans l’ordre alphanumérique.

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

async function main() {
    const items = await fs.readdir("stores");
    console.log(items);
}
main();

La liste d’éléments triés dans l’ordre alphanumérique ressemble à ceci :

[ '201', '202', '203', '204' ]

Déterminer le type de contenu avec isDirectory

Quand vous lisez le contenu d’un répertoire, vous récupérez à la fois les dossiers et les fichiers sous forme d’un tableau de chaînes. Vous pouvez identifier le chaînes des fichiers et celles des répertoires en passant l’option withFileTypes. Cette option retourne un tableau d’objets Dirent au lieu d’un tableau de chaînes. L’objet Dirent a des méthodes isFile et isDirectory que vous pouvez utiliser pour déterminer le type d’objet que vous traitez.

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

async function main() {
    const items = await fs.readdir("stores", { withFileTypes: true });
    for (let item of items) {
        const type = item.isDirectory() ? "folder" : "file";
        console.log(`${item.name}: ${type}`);
    }
}
main();

La liste d’éléments triés dans l’ordre alphanumérique ressemble à ceci :

201: folder
202: folder
203: folder
204: folder

Remarque sur la récursivité

Souvent, vous devrez travailler avec des structures de répertoires complexes qui incluent plusieurs dossiers imbriqués, chacun contenant potentiellement d’autres dossiers et fichiers. Dans ce cas, vous avez besoin d’un moyen de parcourir cette structure de type arborescence pour rechercher des fichiers spécifiques.

Pour ce faire, vous pouvez créer une fonction qui identifie si un élément est un dossier. Si c’est le cas, la fonction recherche ensuite dans ce dossier d’autres fichiers. Ce processus est répété pour chaque dossier trouvé.

Cette opération s’effectue en adoptant une technique appelée récursivité, où la fonction s’appelle elle-même pour effectuer une recherche dans les dossiers nouvellement trouvés. Cela permet au programme de « parcourir » l’arborescence de répertoires entière, en accédant à chaque dossier imbriqué jusqu’à ce que tous les dossiers aient été explorés.

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

async function findFiles(folderName) {

    let results = []

    results.push(`${folderName}`);

    const items = await fs.readdir(folderName, { withFileTypes: true });

    for (const item of items) {
        if (item.isDirectory()) {

            // RECURSION - calling the function from within itself
            const resultsReturned = await findFiles(`${folderName}/${item.name}`);
            results = results.concat(resultsReturned);
        } else {
            results.push(`${folderName}/${item.name}`);
        }
    }

    return results;
}

findFiles("stores").then((results) => console.log(results));

Le résultat se présente ainsi :

[
  'stores',
  'stores/201',
  'stores/201/sales.json',
  'stores/202',
  'stores/202/sales.json',
  'stores/203',
  'stores/203/sales.json',
  'stores/204',
  'stores/204/sales.json'
]

Utiliser un environnement de développement prédéfini

Ce module de formation offre un conteneur de développement, soit dans un navigateur, soit pour votre ordinateur local. Ce conteneur fournit tout l’environnement nécessaire pour que vous puissiez utiliser ce module de formation sans avoir à installer un IDE ou Node.js. Vous n’avez pas besoin de savoir quoi que ce soit sur le conteneur pour effectuer ce module de formation.

Vérifiez vos connaissances

1.

Parmi les opérations suivantes, laquelle pouvez-vous réaliser avec le module fs ?