Übung: Verwenden des Dateisystems

Abgeschlossen

Tailwind Traders verfügt über viele physische Standorte auf der ganzen Welt. Jede Nacht wird in diesen Filialen eine Datei namens sales.json erstellt, die die Gesamtumsätze des vergangenen Tags enthält. Diese Dateien werden in nach Filial-ID benannten Ordnern sortiert.

In dieser Übung schreiben Sie ein Node.js-Programm, das Ordner nach sales.json-Dateien durchsucht.

Öffnen des Projekts im Entwicklungscontainer

  1. Starten Sie den Prozess, um einen neuen GitHub Codespace im Branch main des GitHub-Repositorys MicrosoftDocs/node-essentials zu erstellen.

  2. Überprüfen Sie auf der Seite Codespace erstellen die Codespace-Konfigurationseinstellungen, und wählen Sie dann Neuen Codespace erstellen aus.

    Screenshot of the confirmation screen before creating a new codespace.

  3. Warten Sie den Start des Codespaces ab. Dieser Startvorgang kann einige Minuten dauern.

  4. Öffnen Sie ein neues Terminal im Codespace.

    Tipp

    Sie können das Hauptmenü verwenden, um zur Menüoption Terminal zu navigieren und dann die Option Neues Terminal auszuwählen.

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

  5. Überprüfen Sie, dass Node.js in Ihrer Umgebung installiert ist:

    node --version
    

    Der Entwicklungscontainer verwendet eine Node.js LTS-Version wie z. B. v20.5.1. Die genaue Version kann unterschiedlich sein.

  6. Die restlichen Übungen in diesem Projekt finden im Kontext dieses Entwicklungscontainers statt.

Suchen nach den sales.json-Dateien

Ihre Aufgabe besteht darin, alle Dateien im Ordner stores zu finden.

Erweitern Sie den Ordner stores und die darin befindlichen nummerierten Ordner.

Screenshot that shows the project folder structure.

Einbinden des fs-Moduls

  1. Erstellen Sie im ./nodejs-files-Unterordner eine index.js-Datei, um sie im Editor zu öffnen.

  2. Fügen Sie oben in der Datei den folgenden Code hinzu, um das Modul fs in die Datei einzuschließen.

    const fs = require("fs").promises;
    
  3. Erstellen Sie als Nächstes die main-Funktion, die der Einstiegspunkt für den Code ist. Die letzte Codezeile in dieser Datei ruft die main-Methode auf.

    const fs = require("fs").promises;
    
    async function main() {}
    
    main();
    

    Dies ist typischer CommonJS-Textbausteinecode, um eine asynchrone Funktion aufzurufen.

Schreiben einer Funktion zum Suchen der sales.json-Dateien

  1. Erstellen Sie die neue Funktion findSalesFiles, die den Parameter folderName besitzt.

    async function findSalesFiles(folderName) {
      // FIND SALES FILES
    }
    
  2. Fügen Sie innerhalb der findSalesFiles-Funktion den folgenden Code hinzu, um diese Aufgaben auszuführen:

    • (1) Fügen Sie oben ein Array hinzu, das die Pfade zu allen Umsatzdateien aufnehmen soll, die das Programm ermittelt.
    • (2) Lesen Sie currentFolder mit der readdir-Methode.
    • (3) Fügen Sie mithilfe der asynchronen for...of-Schleife einen Block hinzu, um die einzelnen Elemente, die von der readdir-Methode zurückgegeben werden, in einer Schleife zu durchlaufen.
    • (4) Fügen Sie eine if-Anweisung hinzu, um zu bestimmen, ob es sich beim Element um eine Datei oder um ein Verzeichnis handelt.
    • (5) Wenn es sich bei dem Element um ein Verzeichnis handelt, rufen Sie die findSalesFiles-Funktion rekursiv erneut auf und übergeben jeweils den Pfad zum Element.
    • (6) Wenn es sich nicht um ein Verzeichnis handelt, fügen Sie eine Überprüfung hinzu, um sich zu vergewissern, dass der Elementname mit sales.json übereinstimmt.
    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. Rufen Sie diese neue findSaleFiles-Funktion über die Methode main auf. Übergeben Sie den Ordnernamen stores als Speicherort für die Dateisuche.

     async function main() {
       const results = await findSalesFiles("stores");
       console.log(results);
     }
    
  4. Die vollständige Anwendung sieht wie folgt aus:

    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();
    

Ausführen des Programms

  1. Geben Sie den folgenden Befehl am Terminal ein, um das Programm auszuführen.

    node index.js
    
  2. Das Programm sollte die folgende Ausgabe anzeigen:

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

Hervorragend! Sie haben erfolgreich ein Befehlszeilenprogramm geschrieben, das jedes beliebige Verzeichnis durchsuchen und so alle darin befindlichen sales.json-Dateien finden kann.

Der Pfad zu den Unterordnern wurde in diesem Beispiel jedoch auf komplizierte Weise erstellt, da dafür Zeichenfolgen miteinander verkettet werden müssen. Außerdem können Probleme bei anderen Betriebssystemen (wie Windows) auftreten, wo andere Pfadtrennzeichen verwendet werden.

Im nächsten Abschnitt erfahren Sie, wie Sie mit dem path-Modul Pfade erstellen, die betriebssystemunabhängig funktionieren.

Wissen Sie nicht weiter?

Wenn Sie während dieser Übung Probleme hatten, finden Sie hier den vervollständigten Code. Ersetzen Sie alle Inhalte der index.js-Datei durch diese Lösung.

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();