Verzeichnis-Inspektionswerkzeug
Swipe um das Menü anzuzeigen
In diesem Kapitel erwartet Sie eine Herausforderung: die Entwicklung einer fortgeschrittenen Konsolenanwendung namens DirInspect Pro. Mit dieser App können Sie jedes Verzeichnis umfassend analysieren und aufschlussreiche Statistiken über dessen Dateien und Unterverzeichnisse erhalten.
Herausforderung
Stellen Sie sich vor, Sie müssen ein Labyrinth aus Ordnern mit wichtigen Dateien und Daten durchqueren. DirInspect Pro ist Ihr Begleiter auf dieser Reise und liefert Ihnen umfassende Einblicke in die Struktur und den Inhalt des Verzeichnisses.
Die resultierende Anwendung
Nutzen Sie die Möglichkeiten von DirInspect Pro. Die App stellt Ihnen wichtige Informationen zur Verfügung, wie zum Beispiel
- Die Gesamtanzahl der Elemente;
- Die Gesamtspeichergröße aller Elemente;
- Name und Größe der größten Datei;
- Eine detaillierte Liste der einzelnen Dateinamen und -größen.
Zwei Wege zur Auswahl
Es stehen zwei Wege offen.
- Der erste besteht darin, diese Herausforderung eigenständig anzugehen und die eigenen Fähigkeiten ohne Anleitung zu schärfen;
- Der zweite führt über eine hilfreiche Anleitung, die den Erfolg garantiert.
Welchen Weg du auch wählst, es erwartet dich eine lohnende Reise, die in der Entwicklung einer ansprechenden und funktionalen Konsolenanwendung gipfelt.
Masterplan
- Schritt 1: Erforderliche Module importieren;
- Schritt 2: Funktion getStats definieren;
- Schritt 3: Funktion analyzeFile definieren;
- Schritt 4: Funktion analyzeDirectory definieren;
- Schritt 5: Funktion main definieren und aufrufen;
- Fazit;
- Vollständiger App-Code.
Schritt 1: Erforderliche Module importieren
Für dieses Vorhaben werden die passenden Werkzeuge benötigt. Beginne mit dem Import von zwei wichtigen Modulen: fs.promises zur asynchronen Verwaltung des Dateisystems und path zur effektiven Handhabung von Dateipfaden.
const fs = require("fs").promises;
const path = require("path");
- Zeile 1: importiert das eingebaute Modul
fs. Die Eigenschaft.promisesbietet Zugriff auf die auf Promises basierende API, wodurch asynchrone Dateioperationen mitasync/awaitgeschrieben werden können; - Zeile 2: importiert das eingebaute Modul
path. Dieses Modul stellt Hilfsfunktionen für die Arbeit mit Datei- und Verzeichnispfaden bereit, einschließlich Pfadmanipulation und -normalisierung.
Schritt 2: Definition der Funktion getStats
Die asynchrone Funktion getStats nimmt einen Datei- oder Verzeichnispfad als Argument und versucht, dessen Statistiken mit fs.stat abzurufen.
- Bei Erfolg gibt sie die Statistiken zurück;
- Im Fehlerfall wird eine Fehlermeldung protokolliert und
nullzurückgegeben.
async function getStats(filePath) {
try {
const stats = await fs.stat(filePath);
return stats;
} catch (err) {
console.error("Error getting stats:", err.message);
return null;
}
}
- Zeile 1: Deklariert eine asynchrone Funktion namens
getStats, die einen ParameterfilePathakzeptiert; - Zeilen 2, 5: Erstellt einen
try...catch-Block zur Fehlerbehandlung während des asynchronen Vorgangs; - Zeile 3: Verwendet
await fs.stat(filePath), um Informationen über die angegebene Datei wie Größe, Erstellungszeit und weitere Metadaten abzurufen; - Zeile 4: Gibt das
stats-Objekt zurück, wenn der Vorgangfs.stat()erfolgreich abgeschlossen wird; - Zeile 6: Gibt im Fehlerfall eine Fehlermeldung mit
console.error()in der Konsole aus; - Zeile 7: Gibt
nullzurück, um anzuzeigen, dass die Dateistatistiken nicht abgerufen werden konnten.
Schritt 3: Definition der Funktion analyzeFile
Die Funktion analyzeFile verwendet die Funktion getStats, um Statistiken für eine Datei zu erhalten. Wenn Statistiken verfügbar sind (nicht null), gibt sie ein Objekt mit dem Namen der Datei (ermittelt mit path.basename) und deren Größe zurück.
async function analyzeFile(filePath) {
const stats = await getStats(filePath);
if (!stats) return null;
return {
name: path.basename(filePath),
size: stats.size,
};
}
- Zeile 1: deklariert eine asynchrone Funktion namens
analyzeFile, die einen ParameterfilePathakzeptiert; - Zeile 2: verwendet
await getStats(filePath), um Dateiinformationen für den angegebenen Pfad abzurufen; - Zeile 3: prüft, ob
statseinen falsy Wert hat. Falls die Statistiken nicht abgerufen werden konnten, gibt die Funktionnullzurück; - Zeilen 5-8: erstellen und geben ein Objekt zurück, das den Dateinamen und die Dateigröße enthält. Der Dateiname wird mit
path.basename(filePath)extrahiert, während die Größe ausstats.sizeentnommen wird.
Schritt 4: Funktion analyzeDirectory definieren
Die Funktion analyzeDirectory durchsucht ein Verzeichnis und sammelt vollständige Statistiken über dessen Inhalt.
Funktionsweise: Sie liest alle Elemente im Verzeichnis mit fs.readdir. Für jedes Element:
- Erstellt den vollständigen Pfad mit
path.join; - Verwendet
getStats, um zu erkennen, ob es sich um eine Datei oder einen Ordner handelt; - Falls es eine Datei ist:
- Ruft
analyzeFileauf, um{ name, size }zu erhalten; - Aktualisiert Summen, größte Datei und die Dateiliste.
- Ruft
- Falls es ein Verzeichnis ist:
- Ruft rekursiv
analyzeDirectoryauf; - Fügt die Ergebnisse in die aktuellen Statistiken ein.
- Ruft rekursiv
async function analyzeDirectory(directoryPath) {
let totalItems = 0;
let totalFiles = 0;
let totalSize = 0;
let largestFile = { name: "", size: 0 };
let fileList = [];
try {
const items = await fs.readdir(directoryPath);
for (const item of items) {
const itemPath = path.join(directoryPath, item);
const stats = await getStats(itemPath);
if (!stats) continue;
totalItems++;
if (stats.isFile()) {
const fileInfo = await analyzeFile(itemPath);
if (!fileInfo) continue;
totalFiles++;
totalSize += fileInfo.size;
if (fileInfo.size > largestFile.size) {
largestFile = fileInfo;
}
fileList.push(fileInfo);
} else if (stats.isDirectory()) {
const subDirectoryStats = await analyzeDirectory(itemPath);
totalItems += subDirectoryStats.totalItems;
totalFiles += subDirectoryStats.totalFiles;
totalSize += subDirectoryStats.totalSize;
if (subDirectoryStats.largestFile.size > largestFile.size) {
largestFile = subDirectoryStats.largestFile;
}
fileList = fileList.concat(subDirectoryStats.fileList);
}
}
return {
totalItems,
totalFiles,
totalSize,
largestFile,
fileList
};
} catch (err) {
console.error("Error analyzing directory contents:", err.message);
return {
totalItems: 0,
totalFiles: 0,
totalSize: 0,
largestFile: { name: "", size: 0 },
fileList: []
};
}
}
-
Zeile 1: deklariert eine asynchrone Funktion namens
analyzeDirectory, die einen ParameterdirectoryPathakzeptiert; -
Zeilen 2-6: initialisieren Variablen zur Speicherung der Verzeichnisstatistiken, einschließlich Gesamtanzahl der Elemente, Gesamtdateien, Gesamtgröße, größte Datei und einer Liste analysierter Dateien;
-
Zeile 8: startet einen
try-Block zur Behandlung möglicher Dateisystemfehler; -
Zeile 9: liest den Inhalt des Verzeichnisses mit
fs.readdir()und speichert das Ergebnis im Arrayitems; -
Zeile 11: startet eine
for...of-Schleife, um jedes Element im Verzeichnis zu durchlaufen; -
Zeile 12: erstellt den vollständigen Pfad für das aktuelle Element mit
path.join(); -
Zeile 13: ruft Statistiken für das aktuelle Element mit
getStats()ab; -
Zeile 14: überspringt das aktuelle Element, falls dessen Statistiken nicht abgerufen werden konnten;
-
Zeile 16: erhöht
totalItemsfür jede erfolgreich verarbeitete Datei oder jedes Verzeichnis; -
Zeilen 18-29: behandeln die Verarbeitung von Dateien:
- Zeile 19: ruft
analyzeFile()auf, um Dateiname und -größe zu erhalten;
- Zeile 19: ruft
-
Zeile 20: überspringt die Datei, falls die Analyse fehlschlägt;
- Zeilen 22-23: aktualisieren die Gesamtanzahl der Dateien und die aufsummierte Dateigröße;
- Zeilen 25-27: aktualisieren
largestFile, falls die aktuelle Datei größer ist als die bisher größte;
-
Zeile 29: fügt die Dateiinformationen zur
fileListhinzu; -
Zeilen 30-42: behandeln die Verarbeitung von Verzeichnissen:
-
Zeile 31: ruft rekursiv
analyzeDirectory()für das Unterverzeichnis auf;- Zeilen 33-35: fügen die Statistiken des Unterverzeichnisses zu den aktuellen Summen hinzu;
- Zeilen 37-39: aktualisieren
largestFile, falls das Unterverzeichnis eine größere Datei enthält;
-
Zeile 41: fügt Dateilisten mit
concat()zusammen; -
Zeilen 45-50: geben ein Objekt mit den endgültigen Verzeichnisstatistiken zurück;
-
Zeilen 52-62: behandeln Fehler durch Protokollierung einer Meldung und Rückgabe eines Standard-Statistikobjekts.
Schritt 5: Hauptfunktion definieren und aufrufen
Die main-Funktion ist der Einstiegspunkt des Skripts. Sie gibt den zu analysierenden Verzeichnispfad an (in diesem Fall ./docs), ruft die Funktion analyzeDirectory auf, um die Statistiken des Verzeichnisses und seiner Inhalte zu erhalten, und gibt anschließend die gesammelten Informationen aus.
Die Funktion gibt aus:
- Die Gesamtanzahl der Elemente;
- Die Gesamtanzahl der Dateien;
- Die Gesamtgröße;
- Die Details zur größten Datei;
- Die Liste der Dateien im Verzeichnis.
async function main() {
const directoryPath = "./docs";
const directoryStats = await analyzeDirectory(directoryPath);
console.log("Directory Analysis:");
console.log("Total items:", directoryStats.totalItems);
console.log("Total files:", directoryStats.totalFiles);
console.log("Total size (bytes):", directoryStats.totalSize);
console.log(
"Largest file:",
directoryStats.largestFile.name,
"Size:",
directoryStats.largestFile.size,
"bytes"
);
console.log("\nFile List:");
for (const file of directoryStats.fileList) {
console.log(file.name, "Size:", file.size, "bytes");
}
}
main();
-
Zeile 1: deklariert eine asynchrone Funktion namens
main; -
Zeile 2: definiert die Variable
directoryPath, die den Pfad zum zu analysierenden Verzeichnis speichert; -
Zeile 3: ruft
analyzeDirectory()mit dem angegebenendirectoryPathauf und speichert das Ergebnis in der VariablendirectoryStatsmittelsawait; -
Zeilen 5-17: geben die berechneten Verzeichnisstatistiken mit
console.log()aus, einschließlich der Gesamtanzahl der Elemente, der Gesamtanzahl der Dateien, der Gesamtgröße und Informationen zur größten Datei; -
Zeilen 18-20: iterieren durch das Array
fileList, das indirectoryStatsgespeichert ist; -
gibt den Namen und die Größe jeder Datei im Verzeichnis aus;
-
Zeile 23: ruft die Funktion
main()auf, um den Analyseprozess zu starten.
Vollständiger App-Code
const fs = require("fs").promises;
const path = require("path");
async function getStats(filePath) {
try {
const stats = await fs.stat(filePath);
return stats;
} catch (err) {
console.error("Error getting stats:", err.message);
return null;
}
}
async function analyzeFile(filePath) {
const stats = await getStats(filePath);
if (!stats) return null;
return {
name: path.basename(filePath),
size: stats.size
};
}
async function analyzeDirectory(directoryPath) {
let totalItems = 0;
let totalFiles = 0;
let totalSize = 0;
let largestFile = { name: "", size: 0 };
let fileList = [];
try {
const items = await fs.readdir(directoryPath);
for (const item of items) {
const itemPath = path.join(directoryPath, item);
const stats = await getStats(itemPath);
if (!stats) continue;
totalItems++;
if (stats.isFile()) {
const fileInfo = await analyzeFile(itemPath);
if (!fileInfo) continue;
totalFiles++;
totalSize += fileInfo.size;
if (fileInfo.size > largestFile.size) {
largestFile = fileInfo;
}
fileList.push(fileInfo);
} else if (stats.isDirectory()) {
const subDirectoryStats = await analyzeDirectory(itemPath);
totalItems += subDirectoryStats.totalItems;
totalFiles += subDirectoryStats.totalFiles;
totalSize += subDirectoryStats.totalSize;
if (subDirectoryStats.largestFile.size > largestFile.size) {
largestFile = subDirectoryStats.largestFile;
}
fileList = fileList.concat(subDirectoryStats.fileList);
}
}
return {
totalItems,
totalFiles,
totalSize,
largestFile,
fileList
};
} catch (err) {
console.error("Error analyzing directory contents:", err.message);
return {
totalItems: 0,
totalFiles: 0,
totalSize: 0,
largestFile: { name: "", size: 0 },
fileList: []
};
}
}
async function main() {
const directoryPath = "./docs";
const directoryStats = await analyzeDirectory(directoryPath);
console.log("Directory Analysis:");
console.log("Total items:", directoryStats.totalItems);
console.log("Total files:", directoryStats.totalFiles);
console.log("Total size (bytes):", directoryStats.totalSize);
console.log(
"Largest file:",
directoryStats.largestFile.name,
"Size:",
directoryStats.largestFile.size,
"bytes"
);
console.log("\nFile List:");
for (const file of directoryStats.fileList) {
console.log(file.name, "Size:", file.size, "bytes");
}
}
main();
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen