Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Verzeichnis-Inspektionswerkzeug | Erstellung von Konsolenanwendungen mit Node.js
Backend-Entwicklung mit Node.js und Express.js

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");
Codebeschreibung
expand arrow
  • Zeile 1: importiert das eingebaute Modul fs. Die Eigenschaft .promises bietet Zugriff auf die auf Promises basierende API, wodurch asynchrone Dateioperationen mit async/await geschrieben 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 null zurü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;
  }
}
Codebeschreibung
expand arrow
  • Zeile 1: Deklariert eine asynchrone Funktion namens getStats, die einen Parameter filePath akzeptiert;
  • 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 Vorgang fs.stat() erfolgreich abgeschlossen wird;
  • Zeile 6: Gibt im Fehlerfall eine Fehlermeldung mit console.error() in der Konsole aus;
  • Zeile 7: Gibt null zurü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,
  };
}
Code-Beschreibung
expand arrow
  • Zeile 1: deklariert eine asynchrone Funktion namens analyzeFile, die einen Parameter filePath akzeptiert;
  • Zeile 2: verwendet await getStats(filePath), um Dateiinformationen für den angegebenen Pfad abzurufen;
  • Zeile 3: prüft, ob stats einen falsy Wert hat. Falls die Statistiken nicht abgerufen werden konnten, gibt die Funktion null zurü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 aus stats.size entnommen 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 analyzeFile auf, um { name, size } zu erhalten;
    • Aktualisiert Summen, größte Datei und die Dateiliste.
  • Falls es ein Verzeichnis ist:
    • Ruft rekursiv analyzeDirectory auf;
    • Fügt die Ergebnisse in die aktuellen Statistiken ein.
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: []
    };
  }
}
Code-Beschreibung
expand arrow
  • Zeile 1: deklariert eine asynchrone Funktion namens analyzeDirectory, die einen Parameter directoryPath akzeptiert;

  • 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 Array items;

  • 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 totalItems fü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 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 fileList hinzu;

  • 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();
Codebeschreibung
expand arrow
  • 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 angegebenen directoryPath auf und speichert das Ergebnis in der Variablen directoryStats mittels await;

  • 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 in directoryStats gespeichert 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();
War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 2. Kapitel 10

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Abschnitt 2. Kapitel 10
some-alt