Exercice - Utiliser le système de fichiers

Effectué

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

  1. Démarrez le processus pour créez un environnement GitHub Codespace sur la branche main du référentiel GitHub MicrosoftDocs/node-essentials.

  2. Dans la page Créer un codespace , passez en revue les paramètres de configuration du codespace, puis sélectionnez Créer un codespace

    Screenshot of the confirmation screen before creating a new codespace.

  3. Attendez que le codespace démarre. Ce processus de démarrage peut prendre quelques minutes.

  4. Ouvrez un nouveau terminal dans le codespace.

    Conseil

    Vous pouvez utiliser le menu principal pour accéder à l’option de menu Terminal, puis sélectionner l’option Nouveau terminal.

    Screenshot of the codespaces menu option to open a new terminal.

  5. 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.

  6. 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.

Screenshot that shows the project folder structure.

Inclure le module fs

  1. Dans le sous-dossier ./nodejs-files, créez un fichier index.js pour l’ouvrir dans l’éditeur.

  2. En haut du fichier, ajoutez le code suivant pour inclure le module fs dans le fichier.

    const fs = require("fs").promises;
    
  3. 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éthode main.

    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

  1. Créez une fonction appelée findSalesFiles qui prend un paramètre folderName.

    async function findSalesFiles(folderName) {
      // FIND SALES FILES
    }
    
  2. À 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 asynchrone for...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;
    }
    
  3. Appelez cette nouvelle fonction findSaleFiles à partir de la méthode main. Passez le dossier stores comme emplacement de recherche des fichiers.

     async function main() {
       const results = await findSalesFiles("stores");
       console.log(results);
     }
    
  4. 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

  1. Entrez la commande suivante dans le terminal pour exécuter le programme.

    node index.js
    
  2. 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();