Verwenden des Dateisystems
Bei Tailwind Traders die Gesamtumsatzzahlen der einzelnen Filialen jeweils in eine Datei geschrieben. Diese Datei wird dann an einen zentralen Speicherort gesendet. Damit diese Dateien verwendet werden können, muss das Unternehmen einen Batchprozess etablieren, der mit dem Dateisystem zusammenarbeiten kann.
Hier erfahren Sie, wie Sie mithilfe von Node.js das Dateisystem lesen können, um nach Dateien und Verzeichnissen zu suchen.
Einbinden des fs-Moduls
Node.js bietet ein integriertes Modul, fs (kurz für Dateisystem), zum Arbeiten mit dem Dateisystem. Da es Teil der Node.js-Runtime ist, müssen Sie es nicht installieren. Sie verweisen darauf genauso wie bei jeder anderen Abhängigkeit.
Das fs-Modul enthält den Namespace promises
, der promise
-Versionen für alle Methoden aufweist. Die Verwendung des promise
-Namespaces ist die bevorzugte Methode zum Arbeiten mit dem fs-Modul, da sie es Ihnen ermöglicht, async
zu verwenden, um die Unordnung von Rückrufen oder das Blockieren von synchronen Methoden zu vermeiden.
const fs = require("fs").promises;
Das fs-Modul ermöglicht verschiedene Vorgänge für Dateien und Verzeichnisse. Sie können aus mehreren Methoden auswählen. Für den Moment konzentrieren wir uns auf die Informationen, die Sie benötigen, um mit Verzeichnissen zu arbeiten.
Auflisten von Inhalten in einem Verzeichnis mit fs.readdir
Eine der Aufgaben, die häufig mit dem fs-Modul erledigt werden, ist das Auflisten oder Aufzählen der Inhalte in einem Verzeichnis. Tailwind Traders hat beispielsweise einen Stammordner namens stores. In diesem Ordner sind Unterordner nach Filialnummer organisiert. Innerhalb der Ordner befinden sich die Dateien mit den Gesamtumsätzen. Die Struktur sieht folgendermaßen aus:
📂 stores
📄 sales.json
📄 totals.txt
📂 201
📂 202
Um durch die Inhalte eines Ordners zu lesen, können Sie die asynchrone readdir
-Methode verwenden. Für die meisten Vorgänge des fs-Moduls sind sowohl synchrone (angehängt mit Sync
) als auch asynchrone Optionen verfügbar. Die Ergebnisse werden in alphanumerischer Reihenfolge zurückgegeben.
const fs = require("fs").promises;
async function main() {
const items = await fs.readdir("stores");
console.log(items);
}
main();
Die alphanumerisch sortierte Liste der Elemente sieht wie folgt aus:
[ '201', '202', '203', '204' ]
Bestimmen des Inhaltstyps mit isDirectory
Wenn Sie die Inhalte eines Verzeichnisses lesen, werden sowohl Ordner als auch Dateien als Zeichenfolgenarray zurückgegeben. Sie können bestimmen, bei welchen Zeichenfolgen es sich um Dateien und bei welchen es sich um Verzeichnisse handelt, indem Sie die withFileTypes
-Option übergeben. Diese Option gibt ein Array aus Dirent
-Objekten anstelle eines Zeichenfolgenarrays zurück. Das Dirent
-Objekt verfügt über isFile
- und isDirectory
-Methoden, die Sie verwenden können, um den Typ des aktuellen Objekts zu bestimmen.
const fs = require("fs").promises;
async function main() {
const items = await fs.readdir("stores", { withFileTypes: true });
for (let item of items) {
const type = item.isDirectory() ? "folder" : "file";
console.log(`${item.name}: ${type}`);
}
}
main();
Die alphanumerisch sortierte Liste der Elemente sieht wie folgt aus:
201: folder
202: folder
203: folder
204: folder
Hinweis zur Rekursion
Oft müssen Sie mit komplexen Verzeichnisstrukturen arbeiten, die mehrere verschachtelte Ordner umfassen, von denen jeder möglicherweise weitere Unterordner und Dateien enthält. In solchen Fällen benötigen Sie eine Möglichkeit, durch diese baumähnliche Struktur zu navigieren, um bestimmte Dateien zu finden.
Um dies zu erreichen, können Sie eine Funktion erstellen, die identifiziert, ob ein Element ein Ordner ist. Wenn dies der Fall ist, sucht die Funktion innerhalb dieses Ordners nach weiteren Dateien. Dieser Prozess wird für jeden gefundenen Ordner wiederholt.
Dies wird mithilfe einer Technik erreicht, die als Rekursion bezeichnet wird, bei der die Funktion sich selbst aufruft, um innerhalb der neu gefundenen Ordner zu suchen. Auf diese Weise kann das Programm durch die gesamte Verzeichnisstruktur „wandern“ und in jeden geschachtelten Ordner gelangen, bis alle Ordner untersucht sind.
const fs = require("fs").promises;
async function findFiles(folderName) {
let results = []
results.push(`${folderName}`);
const items = await fs.readdir(folderName, { withFileTypes: true });
for (const item of items) {
if (item.isDirectory()) {
// RECURSION - calling the function from within itself
const resultsReturned = await findFiles(`${folderName}/${item.name}`);
results = results.concat(resultsReturned);
} else {
results.push(`${folderName}/${item.name}`);
}
}
return results;
}
findFiles("stores").then((results) => console.log(results));
Die Ausgabe sieht wie folgt aus:
[
'stores',
'stores/201',
'stores/201/sales.json',
'stores/202',
'stores/202/sales.json',
'stores/203',
'stores/203/sales.json',
'stores/204',
'stores/204/sales.json'
]
Verwenden einer vordefinierten Entwicklungsumgebung
Dieses Schulungsmodul bietet einen Entwicklungscontainer, entweder in einem Browser oder für Ihren lokalen Computer. Dieser Container bietet alle erforderlichen Umgebungen, damit Sie dieses Trainingsmodul verwenden können, ohne eine IDE oder Node.js installieren zu müssen. Sie müssen nichts über den Container wissen, um dieses Schulungsmodul abzuschließen.