Exercice - Lire et écrire dans des fichiers

Effectué

Vous avez presque fini de créer un magnifique programme Node.js pour Tailwind Traders. Jusqu’à présent, votre code lit n’importe quel dossier, recherche tous les fichiers .json et crée un fichier totals.txt dans le dossier salesTotals.

Dans cet exercice, vous terminez le projet en lisant le .json files, en ajoutant les totaux du magasin et en écrivant le total général dans le fichier salesTotals/totals.txt.

Créer une méthode pour calculer les totaux des ventes

  1. En haut du fichier index.js, juste en dessous de l’instruction require("path"), créez une fonction qui calcule le total des ventes. Cette méthode doit prendre le tableau de chemins de fichiers dans lequel elle peut itérer.

    async function calculateSalesTotal(salesFiles) {
      let salesTotal = 0;
    
      // READ FILES LOOP
    
      return salesTotal;
    }
    
  2. Au sein de cette fonction, remplacez // READ FILES LOOP par une boucle qui effectue ce qui suit :

    • (1) Itère sur le tableau salesFiles.
    • (2) Lit le fichier.
    • (3) Analyse le contenu en tant que JSON.
    • (4) Incrémente la variable salesTotal avec la valeur total du fichier.
     async function calculateSalesTotal(salesFiles) {
    
       // Final sales total
       let salesTotal = 0;
    
       // (1) Tterates over the `salesFiles` array.
       for (file of salesFiles) {
    
         // (2) Reads the file.
         const fileContents = await fs.readFile(file)
    
         // (3) Parses the content as JSON.
         const data = JSON.parse(fileContents);
    
         // (4) Increments the `salesTotal` variable with the `total` value from the file.
         salesTotal += data.total;
       }
       return salesTotal;
     }
    

Appeler la méthode calculateSalesTotals

  1. Dans la fonction main, modifiez le code pour :

    • (1) Ajouter un appel à la fonction calculateSalesTotals juste au-dessus de l’appel fs.writeFile.
    • (2) Modifier le bloc fs.writeFile pour écrire la valeur de la variable salesTotal dans le fichier totals.txt.
    async function main() {
      const salesDir = path.join(__dirname, "stores");
      const salesTotalsDir = path.join(__dirname, "salesTotals");
    
      try {
        await fs.mkdir(salesTotalsDir);
      } catch {
        console.log(`${salesTotalsDir} already exists.`);
      }
    
      const salesFiles = await findSalesFiles(salesDir);
    
      // (1) Add a call to the `calculateSalesTotals` function just above the `fs.writeFile` call.
      const salesTotal = await calculateSalesTotal(salesFiles);
    
      // (2) Modify the `fs.writeFile` block to write the value of the `salesTotal` variable to the *totals.txt* file.
      await fs.writeFile(
        path.join(salesTotalsDir, "totals.txt"),
        `${salesTotal}\r\n`,
        { flag: "a" }
      );
    }
    

Exécuter le programme

  1. Exécutez le programme à partir du terminal.

    node index.js
    
    185933.76
    
  2. Ouvrez le fichier ./salesTotals/totals.txt pour afficher le total de toutes les ventes à partir des fichiers sales.json et totals.json : 185933.76.

  3. Réexécutez le programme à partir du terminal.

    node index.js
    
    185933.76
    185933.76
    

    Le fichier totals.txt contient maintenant une deuxième ligne. Chaque fois que vous exécutez le programme, les totaux sont à nouveau ajoutés et une nouvelle ligne est écrite dans le fichier.

Beau travail ! Vous avez écrit un outil intelligent, robuste et pratique que Tailwind Traders peut utiliser pour traiter toutes les ventes de ses magasins chaque nuit. Dans la section suivante, nous allons passer en revue ce que vous avez appris ainsi que quelques conseils à garder en tête.

Vous êtes bloqué ?

Si vous êtes bloqué pendant cet exercice, voici le code complet de ce projet.

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

async function calculateSalesTotal(salesFiles) {
  
  // Final sales total
  let salesTotal = 0;
  
  // (1) Tterates over the `salesFiles` array.
  for (file of salesFiles) {
    
    // (2) Reads the file.
    const fileContents = await fs.readFile(file)

    // (3) Parses the content as JSON.
    const data = JSON.parse(fileContents);

    // (4) Increments the `salesTotal` variable with the `total` value from the file.
    salesTotal += data.total;
  }
  return salesTotal;
}

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` function 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(path.join(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 (path.extname(item.name) === ".json")
        results.push(`${folderName}/${item.name}`);
    }
  }

  return results;
}

async function main() {
  const salesDir = path.join(__dirname, "stores");
  const salesTotalsDir = path.join(__dirname, "salesTotals");

  // create the salesTotal directory if it doesn't exist
  try {
    await fs.mkdir(salesTotalsDir);
  } catch {
    console.log(`${salesTotalsDir} already exists.`);
  }

  // find paths to all the sales files
  const salesFiles = await findSalesFiles(salesDir);

  // read through each sales file to calculate the sales total
  const salesTotal = await calculateSalesTotal(salesFiles);

  // write the total to the "totals.json" file
  await fs.writeFile(
    path.join(salesTotalsDir, "totals.txt"),
    `${salesTotal}\r\n`,
    { flag: "a" }
  );
  console.log(`Wrote sales totals to ${salesTotalsDir}`);
}

main();

Félicitations ! Vous avez lu les fichiers, analysé le JSON et écrit le total dans un fichier. Vous avez terminé le projet !

Nettoyer le conteneur de développement

Une fois le projet terminé, vous souhaiterez peut-être nettoyer votre environnement de développement ou le ramener à son état normal.

La suppression de l’environnement GitHub Codespaces vous permet d’optimiser le nombre d’heures gratuites par cœur que vous obtenez pour votre compte.

Important

Pour plus d’informations sur les droits de votre compte GitHub, consultez GitHub Codespaces mensuel inclus stockage et heures principales.

  1. Connectez-vous au tableau de bord GitHub Codespaces (https://github.com/codespaces).

  2. Localisez vos codespaces en cours d’exécution provenant du MicrosoftDocs/node-essentials dépôt GitHub.

    Screenshot of all the running codespaces including their status and templates.

  3. Ouvrez le menu contextuel du codespace et sélectionnez Supprimer.

    Screenshot of the context menu for a single codespace with the delete option highlighted.