Utiliser le système de fichiers
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.