Übung: Verwenden des Dateisystems
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
Starten Sie den Prozess, um einen neuen GitHub Codespace im Branch
main
des GitHub-RepositorysMicrosoftDocs/node-essentials
zu erstellen.Überprüfen Sie auf der Seite Codespace erstellen die Codespace-Konfigurationseinstellungen, und wählen Sie dann Neuen Codespace erstellen aus.
Warten Sie den Start des Codespaces ab. Dieser Startvorgang kann einige Minuten dauern.
Öffnen Sie ein neues Terminal im Codespace.
Ü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.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.
Einbinden des fs-Moduls
Erstellen Sie im
./nodejs-files
-Unterordner eine index.js-Datei, um sie im Editor zu öffnen.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;
Erstellen Sie als Nächstes die
main
-Funktion, die der Einstiegspunkt für den Code ist. Die letzte Codezeile in dieser Datei ruft diemain
-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
Erstellen Sie die neue Funktion
findSalesFiles
, die den ParameterfolderName
besitzt.async function findSalesFiles(folderName) { // FIND SALES FILES }
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 derreaddir
-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; }
Rufen Sie diese neue
findSaleFiles
-Funktion über die Methodemain
auf. Übergeben Sie den Ordnernamen stores als Speicherort für die Dateisuche.async function main() { const results = await findSalesFiles("stores"); console.log(results); }
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
Geben Sie den folgenden Befehl am Terminal ein, um das Programm auszuführen.
node index.js
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();