Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Hakemiston Tarkastustyökalu | Konsolisovellusten Rakentaminen Node.js:llä
Practice
Projects
Quizzes & Challenges
Visat
Challenges
/
Backend-kehitys Node.js:llä ja Express.js:llä

bookHakemiston Tarkastustyökalu

Tässä luvussa esitellään haaste: kehittyneen konsolisovelluksen DirInspect Pro luominen. Tämä sovellus mahdollistaa minkä tahansa hakemiston perusteellisen analysoinnin ja tarjoaa hyödyllistä tilastotietoa sen tiedostoista ja alihakemistoista.

Haaste

Kuvittele tilanne, jossa sinun täytyy navigoida kansioiden labyrintissä, joka sisältää tärkeitä tiedostoja ja dataa. DirInspect Pro on apunasi tällä matkalla, tarjoten kattavaa tietoa hakemiston rakenteesta ja sisällöstä.

Lopputuloksena syntyvä sovellus

Valmistaudu hyödyntämään DirInspect Pro:n ominaisuuksia. Sovellus tarjoaa keskeistä tietoa, kuten

  • Kohteiden kokonaismäärä;
  • Kaikkien kohteiden yhteenlaskettu koko;
  • Suurimman tiedoston nimi ja koko;
  • Yksittäisten tiedostojen nimet ja koot yksityiskohtaisesti.

Kaksi polkua valittavana

Edessäsi on kaksi polkua.

  • Ensimmäinen on tarttua haasteeseen suoraan, kehittäen taitojasi ilman ohjausta;
  • Toinen on seurata hyödyllistä opasta, joka takaa onnistumisen.

Valitsitpa kumman tahansa, edessäsi on palkitseva matka, jonka lopputuloksena syntyy kiehtova ja toimiva konsolisovellus.

Pääsuunnitelma

  • Vaihe 1: Tarvittavien moduulien tuonti;
  • Vaihe 2: getStats-funktion määrittely;
  • Vaihe 3: analyzeFile-funktion määrittely;
  • Vaihe 4: analyzeDirectory-funktion määrittely;
  • Vaihe 5: main-funktion määrittely ja kutsuminen;
  • Yhteenveto;
  • Sovelluksen koko lähdekoodi.

Vaihe 1: Tarvittavien moduulien tuonti

Tämän seikkailun aloittamiseen tarvitset oikeat työkalut. Aloita tuomalla kaksi keskeistä moduulia: fs.promises tiedostojärjestelmän asynkroniseen hallintaan ja path tiedostopolkujen käsittelyyn tehokkaasti.

const fs = require("fs").promises;
const path = require("path");

Vaihe 2: Määrittele getStats-funktio

Asynkroninen funktio getStats ottaa tiedoston tai kansion polun argumenttina ja yrittää hakea sen tilastotiedot käyttäen fs.stat-metodia.

  • Onnistuneessa tapauksessa se palauttaa tilastotiedot;
  • Jos virhe ilmenee, se kirjaa virheilmoituksen ja palauttaa null.
async function getStats(filePath) {
  try {
    const stats = await fs.stat(filePath);
    return stats;
  } catch (err) {
    console.error("Error getting stats:", err.message);
    return null;
  }
}

Vaihe 3: Määrittele analyzeFile-funktio

Funktio analyzeFile käyttää getStats-funktiota saadakseen tiedoston tilastotiedot. Jos tilastotiedot ovat saatavilla (ei null), se palauttaa olion, joka sisältää tiedoston nimen (haettu path.basename-metodilla) ja sen koon.

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

  return {
    name: path.basename(filePath),
    size: stats.size,
  };
}

Vaihe 4: Määrittele analyzeDirectory-funktio

Funktio analyzeDirectory skannaa kansion ja kerää kattavat tilastot sen sisällöstä. Toimintaperiaate: se lukee kaikki kansion kohteet käyttäen fs.readdir. Jokaiselle kohteelle:

  • Rakentaa täyden polun path.join-metodilla;
  • Käyttää getStats-funktiota tunnistaakseen, onko kyseessä tiedosto vai kansio;
  • Jos kyseessä on tiedosto:
    • Kutsuu analyzeFile-funktiota saadakseen { name, size };
    • Päivittää kokonaismäärät, suurimman tiedoston ja tiedostolistan.
  • Jos kyseessä on kansio:
    • Kutsuu rekursiivisesti analyzeDirectory-funktiota;
    • Yhdistää tulokset nykyisiin tilastoihin.
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: []
    };
  }
}

Vaihe 5: Määrittele main-funktio ja kutsu se

main-funktio toimii skriptin aloituspisteenä. Se määrittää analysoitavan hakemistopolun (tässä tapauksessa ./docs), kutsuu analyzeDirectory-funktiota saadakseen hakemiston ja sen sisällön tilastotiedot, ja tulostaa kerätyt tiedot. Funktio tulostaa

  • Kohteiden kokonaismäärän;
  • Tiedostojen kokonaismäärän;
  • Kokonaiskoon;
  • Suurimman tiedoston tiedot;
  • Hakemiston tiedostoluettelon.
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();

Sovelluksen koko koodi

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();
Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 10

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

bookHakemiston Tarkastustyökalu

Pyyhkäise näyttääksesi valikon

Tässä luvussa esitellään haaste: kehittyneen konsolisovelluksen DirInspect Pro luominen. Tämä sovellus mahdollistaa minkä tahansa hakemiston perusteellisen analysoinnin ja tarjoaa hyödyllistä tilastotietoa sen tiedostoista ja alihakemistoista.

Haaste

Kuvittele tilanne, jossa sinun täytyy navigoida kansioiden labyrintissä, joka sisältää tärkeitä tiedostoja ja dataa. DirInspect Pro on apunasi tällä matkalla, tarjoten kattavaa tietoa hakemiston rakenteesta ja sisällöstä.

Lopputuloksena syntyvä sovellus

Valmistaudu hyödyntämään DirInspect Pro:n ominaisuuksia. Sovellus tarjoaa keskeistä tietoa, kuten

  • Kohteiden kokonaismäärä;
  • Kaikkien kohteiden yhteenlaskettu koko;
  • Suurimman tiedoston nimi ja koko;
  • Yksittäisten tiedostojen nimet ja koot yksityiskohtaisesti.

Kaksi polkua valittavana

Edessäsi on kaksi polkua.

  • Ensimmäinen on tarttua haasteeseen suoraan, kehittäen taitojasi ilman ohjausta;
  • Toinen on seurata hyödyllistä opasta, joka takaa onnistumisen.

Valitsitpa kumman tahansa, edessäsi on palkitseva matka, jonka lopputuloksena syntyy kiehtova ja toimiva konsolisovellus.

Pääsuunnitelma

  • Vaihe 1: Tarvittavien moduulien tuonti;
  • Vaihe 2: getStats-funktion määrittely;
  • Vaihe 3: analyzeFile-funktion määrittely;
  • Vaihe 4: analyzeDirectory-funktion määrittely;
  • Vaihe 5: main-funktion määrittely ja kutsuminen;
  • Yhteenveto;
  • Sovelluksen koko lähdekoodi.

Vaihe 1: Tarvittavien moduulien tuonti

Tämän seikkailun aloittamiseen tarvitset oikeat työkalut. Aloita tuomalla kaksi keskeistä moduulia: fs.promises tiedostojärjestelmän asynkroniseen hallintaan ja path tiedostopolkujen käsittelyyn tehokkaasti.

const fs = require("fs").promises;
const path = require("path");

Vaihe 2: Määrittele getStats-funktio

Asynkroninen funktio getStats ottaa tiedoston tai kansion polun argumenttina ja yrittää hakea sen tilastotiedot käyttäen fs.stat-metodia.

  • Onnistuneessa tapauksessa se palauttaa tilastotiedot;
  • Jos virhe ilmenee, se kirjaa virheilmoituksen ja palauttaa null.
async function getStats(filePath) {
  try {
    const stats = await fs.stat(filePath);
    return stats;
  } catch (err) {
    console.error("Error getting stats:", err.message);
    return null;
  }
}

Vaihe 3: Määrittele analyzeFile-funktio

Funktio analyzeFile käyttää getStats-funktiota saadakseen tiedoston tilastotiedot. Jos tilastotiedot ovat saatavilla (ei null), se palauttaa olion, joka sisältää tiedoston nimen (haettu path.basename-metodilla) ja sen koon.

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

  return {
    name: path.basename(filePath),
    size: stats.size,
  };
}

Vaihe 4: Määrittele analyzeDirectory-funktio

Funktio analyzeDirectory skannaa kansion ja kerää kattavat tilastot sen sisällöstä. Toimintaperiaate: se lukee kaikki kansion kohteet käyttäen fs.readdir. Jokaiselle kohteelle:

  • Rakentaa täyden polun path.join-metodilla;
  • Käyttää getStats-funktiota tunnistaakseen, onko kyseessä tiedosto vai kansio;
  • Jos kyseessä on tiedosto:
    • Kutsuu analyzeFile-funktiota saadakseen { name, size };
    • Päivittää kokonaismäärät, suurimman tiedoston ja tiedostolistan.
  • Jos kyseessä on kansio:
    • Kutsuu rekursiivisesti analyzeDirectory-funktiota;
    • Yhdistää tulokset nykyisiin tilastoihin.
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: []
    };
  }
}

Vaihe 5: Määrittele main-funktio ja kutsu se

main-funktio toimii skriptin aloituspisteenä. Se määrittää analysoitavan hakemistopolun (tässä tapauksessa ./docs), kutsuu analyzeDirectory-funktiota saadakseen hakemiston ja sen sisällön tilastotiedot, ja tulostaa kerätyt tiedot. Funktio tulostaa

  • Kohteiden kokonaismäärän;
  • Tiedostojen kokonaismäärän;
  • Kokonaiskoon;
  • Suurimman tiedoston tiedot;
  • Hakemiston tiedostoluettelon.
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();

Sovelluksen koko koodi

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();
Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 10
some-alt