Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Hulpmiddel voor Directory-Inspectie | Consoletoepassingen Bouwen met Node.js
Backendontwikkeling met Node.js en Express.js

Hulpmiddel voor Directory-Inspectie

Veeg om het menu te tonen

Dit hoofdstuk presenteert een uitdaging: het creëren van een geavanceerde console-app genaamd DirInspect Pro. Deze app stelt je in staat om elke directory grondig te analyseren en waardevolle statistieken te verkrijgen over de bestanden en submappen.

Uitdaging

Stel je een scenario voor waarin je door een doolhof van mappen moet navigeren die essentiële bestanden en data bevatten. DirInspect Pro is je bondgenoot tijdens deze reis en biedt uitgebreide inzichten in de structuur en inhoud van de directory.

De resulterende app

Maak je klaar om de mogelijkheden van DirInspect Pro te benutten. De app voorziet je van essentiële informatie, zoals

  • Het totale aantal items;
  • De totale grootte van alle items;
  • De naam en grootte van het grootste bestand;
  • De gedetailleerde lijst van individuele bestandsnamen en groottes.

Twee paden om te kiezen

Er liggen twee paden voor je.

  • Het eerste is om deze uitdaging direct aan te gaan en je vaardigheden zonder begeleiding te ontwikkelen;
  • Het tweede is om een behulpzame gids te volgen die je succes garandeert.

Welk pad je ook kiest, je staat een waardevolle reis te wachten die eindigt met het maken van een boeiende en functionele console-app.

Masterplan

  • Stap 1: Vereiste modules importeren;
  • Stap 2: Definieer de functie getStats;
  • Stap 3: Definieer de functie analyzeFile;
  • Stap 4: Definieer de functie analyzeDirectory;
  • Stap 5: Definieer en roep de functie main aan;
  • Conclusie;
  • Volledige app-code.

Stap 1: Vereiste modules importeren

Voor deze taak heb je de juiste tools nodig. Begin met het importeren van twee belangrijke modules: fs.promises voor het asynchroon beheren van het bestandssysteem en path voor het effectief omgaan met bestands- en map-paden.

const fs = require("fs").promises;
const path = require("path");
Codebeschrijving
expand arrow
  • Regel 1: importeert de ingebouwde fs-module. De .promises-eigenschap biedt toegang tot de op promises gebaseerde API, waardoor asynchrone bestandsbewerkingen met async/await kunnen worden geschreven;
  • Regel 2: importeert de ingebouwde path-module. Deze module biedt hulpmiddelen voor het werken met bestands- en map-paden, waaronder padmanipulatie en normalisatie.

Stap 2: Definieer de getStats-functie

De asynchrone functie getStats neemt een bestand- of map-pad als argument en probeert de statistieken ervan op te halen met fs.stat.

  • Bij succes retourneert het de statistieken;
  • Bij een fout wordt een foutmelding gelogd en wordt null geretourneerd.
async function getStats(filePath) {
  try {
    const stats = await fs.stat(filePath);
    return stats;
  } catch (err) {
    console.error("Error getting stats:", err.message);
    return null;
  }
}
Codebeschrijving
expand arrow
  • Regel 1: declareert een asynchrone functie genaamd getStats die een filePath-parameter accepteert;
  • Regels 2, 5: maakt een try...catch-blok aan voor foutafhandeling tijdens de asynchrone operatie;
  • Regel 3: gebruikt await fs.stat(filePath) om informatie op te halen over het opgegeven bestand, zoals de grootte, aanmaaktijd en andere metadata;
  • Regel 4: retourneert het stats-object als de fs.stat()-operatie succesvol is afgerond;
  • Regel 6: logt een foutmelding naar de console met console.error() als de operatie mislukt;
  • Regel 7: retourneert null om aan te geven dat de bestandsstatistieken niet konden worden opgehaald.

Stap 3: Definieer de analyzeFile-functie

De functie analyzeFile gebruikt de getStats-functie om statistieken voor een bestand op te halen. Als de statistieken beschikbaar zijn (niet null), retourneert deze een object met de bestandsnaam (verkregen via path.basename) en de grootte ervan.

async function analyzeFile(filePath) {
  const stats = await getStats(filePath);
  if (!stats) return null;

  return {
    name: path.basename(filePath),
    size: stats.size,
  };
}
Codebeschrijving
expand arrow
  • Regel 1: declareert een asynchrone functie genaamd analyzeFile die een parameter filePath accepteert;
  • Regel 2: gebruikt await getStats(filePath) om bestandsstatistieken op te halen voor het opgegeven pad;
  • Regel 3: controleert of stats onwaar is. Als de statistieken niet konden worden opgehaald, retourneert de functie null;
  • Regels 5-8: maakt en retourneert een object met de bestandsnaam en bestandsgrootte. De bestandsnaam wordt geëxtraheerd met path.basename(filePath), terwijl de grootte wordt opgehaald uit stats.size.

Stap 4: Definieer de functie analyzeDirectory

De functie analyzeDirectory scant een map en verzamelt volledige statistieken over de inhoud ervan. Werking: leest alle items in de map met fs.readdir. Voor elk item:

  • Bouwt het volledige pad met path.join;
  • Gebruikt getStats om te detecteren of het een bestand of een map is;
  • Als het een bestand is:
    • Roept analyzeFile aan om { name, size } te verkrijgen;
    • Werkt totalen, grootste bestand en de bestandslijst bij.
  • Als het een map is:
    • Roept recursief analyzeDirectory aan;
    • Voegt resultaten samen met de huidige statistieken.
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: []
    };
  }
}
Codebeschrijving
expand arrow
  • Regel 1: declareert een asynchrone functie genaamd analyzeDirectory die een parameter directoryPath accepteert;

  • Regels 2-6: initialiseren variabelen die worden gebruikt om mapstatistieken op te slaan, waaronder totaal aantal items, totaal aantal bestanden, totale grootte, het grootste bestand en een lijst van geanalyseerde bestanden;

  • Regel 8: start een try-blok om mogelijke fouten in het bestandssysteem af te handelen;

  • Regel 9: leest de inhoud van de map met fs.readdir() en slaat het resultaat op in de array items;

  • Regel 11: start een for...of-lus om door elk item in de map te itereren;

  • Regel 12: maakt het volledige pad voor het huidige item met path.join();

  • Regel 13: haalt statistieken op voor het huidige item met getStats();

  • Regel 14: slaat het huidige item over als de statistieken niet konden worden opgehaald;

  • Regel 16: verhoogt totalItems voor elk succesvol verwerkt bestand of map;

  • Regels 18-29: verwerken van bestanden:

  • Regel 19: roept analyzeFile() aan om de bestandsnaam en grootte op te halen;

  • Regel 20: slaat het bestand over als de analyse mislukt;

    • Regels 22-23: werkt het totale aantal bestanden en de opgetelde bestandsgrootte bij;
    • Regels 25-27: werkt largestFile bij als het huidige bestand groter is dan het eerder geregistreerde bestand;
  • Regel 29: voegt de bestandsinformatie toe aan fileList;

  • Regels 30-42: verwerken van mappen:

  • Regel 31: roept recursief analyzeDirectory() aan voor de submap;

    • Regels 33-35: voegt de submapstatistieken samen met de huidige totalen;
    • Regels 37-39: werkt largestFile bij als de submap een groter bestand bevat;
  • Regel 41: voegt bestandslijsten samen met concat();

  • Regels 45-50: retourneert een object met de uiteindelijke mapstatistieken;

  • Regels 52-62: handelt fouten af door een bericht te loggen en een standaardstatistiekobject te retourneren.

Stap 5: Definieer de main-functie en roep deze aan

De main-functie is het startpunt van het script. Deze specificeert het pad van de te analyseren map (in dit geval ./docs), roept de functie analyzeDirectory aan om de statistieken van de map en de inhoud ervan te verkrijgen, en geeft vervolgens de verzamelde informatie weer. De functie drukt het volgende af:

  • Het totaal aantal items;
  • Het totaal aantal bestanden;
  • De totale grootte;
  • De details van het grootste bestand;
  • De lijst van bestanden in de map.
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();
Codebeschrijving
expand arrow
  • Regel 1: declareert een asynchrone functie genaamd main;

  • Regel 2: definieert de variabele directoryPath, die het pad opslaat naar de map die geanalyseerd zal worden;

  • Regel 3: roept analyzeDirectory() aan met het opgegeven directoryPath en slaat het resultaat op in de variabele directoryStats met behulp van await;

  • Regels 5-17: tonen de berekende mapstatistieken met behulp van console.log(), waaronder het totaal aantal items, totaal aantal bestanden, totale grootte en informatie over het grootste bestand;

  • Regels 18-20: doorloopt de array fileList die is opgeslagen in directoryStats;

  • logt de naam en grootte van elk bestand in de map;

  • Regel 23: roept de functie main() aan om het analyseproces te starten.

Volledige 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();
Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 2. Hoofdstuk 10

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Sectie 2. Hoofdstuk 10
some-alt