Übung: Arbeiten mit Pfaden

Abgeschlossen

Als Entwickler bei Tailwind Traders sind Sie dabei, ein Programm mithilfe des Node.js-Pfad-Moduls und der globalen __dirname-Variablen zu verbessern. Auf diese Weise kann das Programm beliebige JSON-Dateien dynamisch suchen und verarbeiten, unabhängig davon, von wo das Programm ausgeführt wird.

Einschließen des path-Moduls

Schließen Sie oben in der vorhandenen Datei index.js das Pfad-Modul ein.

const path = require("path");

Verwenden des aktuellen Verzeichnisses

Im aktuellen Code der index.js-Datei übergeben Sie den statischen Speicherort des Ordners stores. Der Code soll so geändert werden, dass der __dirname-Wert verwendet wird, anstatt einen statischen Ordnernamen zu übergeben.

  1. Erstellen Sie in der main-Methode eine Variable, um einen Pfad zum Verzeichnis stores mithilfe der Konstanten __dirname zu speichern.

    async function main() {
      const salesDir = path.join(__dirname, "stores");
    
      const salesFiles = await findSalesFiles(salesDir);
      console.log(salesFiles);
    }
    
  2. Führen Sie das Programm über die Befehlszeile aus.

    node index.js
    

    Beachten Sie, dass der Pfad, der jetzt für die Dateien aufgeführt ist, der vollständige Systempfad ist, da die __dirname-Konstante den vollständigen Pfad zum aktuellen Speicherort zurückgibt.

    [
       '/workspaces/node-essentials/nodejs-files/stores/201/sales.json',
       '/workspaces/node-essentials/nodejs-files/stores/202/sales.json',
       '/workspaces/node-essentials/nodejs-files/stores/203/sales.json',
       '/workspaces/node-essentials/nodejs-files/stores/204/sales.json'
    ]
    

Verknüpfen von Pfaden

Anstatt Ordnernamen zu verketten, um einen neuen Pfad für die Suche zu erstellen, ändern Sie den Code so, dass die path.join-Methode verwendet wird. Dadurch kann dieser Code unabhängig vom Betriebssystem verwendet werden.

  1. Ändern Sie die Methode findFiles so, dass path.join verwendet wird.

    // previous code - with string concatentation
    const resultsReturned = await findSalesFiles(`${folderName}/${item.name}`);
    
    // current code - with path.join
    const resultsReturned = await findSalesFiles(path.join(folderName,item.name));
    
  2. Führen Sie das Programm über die Befehlszeile aus.

    node index.js
    

    Die Ausgabe ist identisch mit der des vorherigen Schritts. Das Programm ist nun jedoch stabiler, da path.join verwendet wird, anstatt Zeichenfolge miteinander zu verketten.

Suche nach allen JSON-Dateien

Anstatt nur nach sales.json-Dateien zu suchen, soll dieses Programm nach allen Dateien mit der JSON-Erweiterung suchen. Verwenden Sie dazu die path.extname-Methode, um die Dateierweiterung zu überprüfen.

  1. Führen Sie den folgenden Befehl im Terminal aus, um die Datei stores/201/sales.json in stores/sales/totals.json umzubenennen.

    mv stores/201/sales.json stores/201/totals.json
    
  2. Ändern Sie in der findSalesFiles-Funktion die if-Anweisung so, dass nur die Dateinamenerweiterung überprüft wird.

    if (path.extname(item.name) === ".json") {
      results.push(`${folderName}/${item.name}`);
    }
    
  3. Führen Sie das Programm über die Befehlszeile aus.

    node index.js
    

    Die Ausgabe zeigt nun alle JSON-Dateien, die sich in einem der nach Filial-ID aufgeteilten Verzeichnisse befinden.

    [
       '/home/username/node-essentials/nodejs-files/stores/201/totals.json',
       '/home/username/node-essentials/nodejs-files/stores/202/sales.json',
       '/home/username/node-essentials/nodejs-files/stores/203/sales.json',
       '/home/username/node-essentials/nodejs-files/stores/204/sales.json'
    ]
    

Gut gemacht! Sie haben das path-Modul und die Konstante __dirname verwendet, um das Programm deutlich stabiler zu gestalten. Im nächsten Abschnitt erfahren Sie, wie Sie Verzeichnisse erstellen und Dateien zwischen Speicherorten verschieben.

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;
const path = require("path");

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

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

main();