Exercice - Utiliser le système de fichiers
Tailwind Traders compte de nombreux magasins physiques dans le monde entier. Chaque nuit, ces magasins créent un fichier appelé sales.json qui contient le total de toutes leurs ventes de la journée passée. Ces fichiers sont organisés en dossiers nommés par ID de magasin.
Dans cet exercice, vous écrivez un programme Node.js permettant de rechercher les fichiers appelés sales.json dans un dossier.
Ouvrir le projet dans le conteneur de développement
Démarrez le processus pour créez un environnement GitHub Codespace sur la branche
main
du référentiel GitHubMicrosoftDocs/node-essentials
.Dans la page Créer un codespace , passez en revue les paramètres de configuration du codespace, puis sélectionnez Créer un codespace
Attendez que le codespace démarre. Ce processus de démarrage peut prendre quelques minutes.
Ouvrez un nouveau terminal dans le codespace.
Vérifiez que Node.js 7 est installé dans votre environnement :
node --version
Le conteneur de développement utilise une version Node.js LTS telle que
v20.5.1
. La version exacte peut être différente.Les exercices restants de ce projet ont lieu dans le contexte de ce conteneur de développement.
Rechercher les fichiers sales.json
Votre tâche consiste à rechercher tous les fichiers dans le dossier stores .
Développez le dossier stores et chacun des dossiers numérotés qui s’y trouvent.
Inclure le module fs
Dans le sous-dossier
./nodejs-files
, créez un fichier index.js pour l’ouvrir dans l’éditeur.En haut du fichier, ajoutez le code suivant pour inclure le module fs dans le fichier.
const fs = require("fs").promises;
Ensuite, créez la fonction
main
qui est le point d’entrée de votre code. La dernière ligne de code de ce fichier appelle la méthodemain
.const fs = require("fs").promises; async function main() {} main();
Il s’agit de code réutilisable CommonJS courant pour appeler une fonction asynchrone.
Écrire une fonction pour rechercher les fichiers sales.json
Créez une fonction appelée
findSalesFiles
qui prend un paramètrefolderName
.async function findSalesFiles(folderName) { // FIND SALES FILES }
À l’intérieur de la fonction
findSalesFiles
, ajoutez le code suivant pour effectuer ces tâches :- (1) Ajoutez un tableau en haut qui contient les chemins d’accès à tous les fichiers de vente trouvés par le programme.
- (2) Lisez le currentFolder avec la méthode
readdir
. - (3) Ajoutez un bloc pour effectuer une boucle sur chaque élément retourné par la méthode
readdir
à l’aide de la boucle asynchronefor...of
. - (4) Ajoutez une instruction
if
pour déterminer si l’élément est un fichier ou un répertoire. - (5) Si l’élément est un répertoire, rappelez récursivement la fonction
findSalesFiles
en transmettant le chemin d’accès à l’élément. - (6) Si ce n’est pas un répertoire, ajoutez une vérification pour veiller à ce que le nom de l’élément corresponde à sales.json.
async function findSalesFiles(folderName) { // (1) Add an array at the top, to hold the paths to all the sales files that the program finds. let results = []; // (2) Read the currentFolder with the `readdir` method. const items = await fs.readdir(folderName, { withFileTypes: true }); // (3) Add a block to loop over each item returned from the `readdir` method using the asynchronous `for...of` loop. for (const item of items) { // (4) Add an `if` statement to determine if the item is a file or a directory. if (item.isDirectory()) { // (5) If the item is a directory, recursively call the function `findSalesFiles` again, passing in the path to the item. const resultsReturned = await findSalesFiles(`${folderName}/${item.name}`); results = results.concat(resultsReturned); } else { // (6) If it's not a directory, add a check to make sure the item name matches *sales.json*. if (item.name === "sales.json") { results.push(`${folderName}/${item.name}`); } } } return results; }
Appelez cette nouvelle fonction
findSaleFiles
à partir de la méthodemain
. Passez le dossier stores comme emplacement de recherche des fichiers.async function main() { const results = await findSalesFiles("stores"); console.log(results); }
L’application complète ressemble à ceci :
const fs = require("fs").promises; async function findSalesFiles(folderName) { // (1) Add an array at the top, to hold the paths to all the sales files that the program finds. let results = []; // (2) Read the currentFolder with the `readdir` method. const items = await fs.readdir(folderName, { withFileTypes: true }); // (3) Add a block to loop over each item returned from the `readdir` method using the asynchronous `for...of` loop. for (const item of items) { // (4) Add an `if` statement to determine if the item is a file or a directory. if (item.isDirectory()) { // (5) If the item is a directory, recursively call the function `findSalesFiles` again, passing in the path to the item. const resultsReturned = await findSalesFiles(`${folderName}/${item.name}`); results = results.concat(resultsReturned); } else { // (6) If it's not a directory, add a check to make sure the item name matches *sales.json*. if (item.name === "sales.json") { results.push(`${folderName}/${item.name}`); } } } return results; } async function main() { const results = await findSalesFiles("stores"); console.log(results); } main();
Exécuter le programme
Entrez la commande suivante dans le terminal pour exécuter le programme.
node index.js
Le programme doit afficher la sortie suivante.
[ 'stores/201/sales.json', 'stores/202/sales.json', 'stores/203/sales.json', 'stores/204/sales.json', ]
Excellent ! Vous avez réussi à écrire un programme en ligne de commande qui est en mesure de parcourir les répertoires pour rechercher tous les fichiers sales.json qui s’y trouvent.
Toutefois, la façon dont le chemin des sous-dossiers a été construit dans cet exemple est un peu maladroite parce qu’elle demande de concaténer les chaînes ensemble. Vous pouvez aussi rencontrer des problèmes sur d’autres systèmes d’exploitation (tels que Windows) qui utilisent des séparateurs de chemin différents.
Dans la section suivante, vous allez apprendre à construire des chemins qui restent valides sur tous les systèmes d’exploitation en utilisant le module path.
Vous êtes bloqué ?
Si vous êtes bloqué quelque part dans cet exercice, voici le code complet. Supprimez tout le contenu de index.js et remplacez-le par cette solution.
const fs = require("fs").promises;
async function findSalesFiles(folderName) {
// (1) Add an array at the top, to hold the paths to all the sales files that the program finds.
let results = [];
// (2) Read the currentFolder with the `readdir` method.
const items = await fs.readdir(folderName, { withFileTypes: true });
// (3) Add a block to loop over each item returned from the `readdir` method using the asynchronous `for...of` loop.
for (const item of items) {
// (4) Add an `if` statement to determine if the item is a file or a directory.
if (item.isDirectory()) {
// (5) If the item is a directory, recursively call the function `findSalesFiles` again, passing in the path to the item.
const resultsReturned = await findSalesFiles(`${folderName}/${item.name}`);
results = results.concat(resultsReturned);
} else {
// (6) If it's not a directory, add a check to make sure the item name matches *sales.json*.
if (item.name === "sales.json") {
results.push(`${folderName}/${item.name}`);
}
}
}
return results;
}
async function main() {
const results = await findSalesFiles("stores");
console.log(results);
}
main();