Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Інструмент для Перевірки Директорій | Створення Консольних Застосунків з Node.js
Розробка бекенду з Node.js та Express.js

bookІнструмент для Перевірки Директорій

У цьому розділі вам пропонується завдання: створити розширений консольний застосунок під назвою DirInspect Pro. Цей застосунок дозволить детально аналізувати будь-який каталог і отримувати корисну статистику щодо його файлів та підкаталогів.

🏆 Виклик чекає

Уявіть ситуацію, коли потрібно орієнтуватися у лабіринті папок із важливими файлами та даними. DirInspect Pro стане вашим помічником у цій подорожі, надаючи повну інформацію про структуру та вміст каталогу.

🚀 Результуючий застосунок

Підготуйтеся використовувати можливості DirInspect Pro. Застосунок надасть вам важливу інформацію, таку як:

  • Загальна кількість елементів;
  • Сукупний розмір усіх елементів;
  • Назва та розмір найбільшого файлу;
  • Детальний список імен та розмірів окремих файлів.

Два шляхи на вибір

Перед вами два шляхи.

  • Перший — вирішити це завдання самостійно, вдосконалюючи свої навички без підказок;
  • Другий — скористатися корисним гайдом, який гарантує успіх.

Який би шлях ви не обрали, на вас чекає захоплююча подорож, результатом якої стане створення функціонального та цікавого консольного застосунку.

Майстер-план

  • 👉 Крок 1: Імпорт необхідних модулів;
  • 👉 Крок 2: Визначення функції getStats;
  • 👉 Крок 3: Визначення функції analyzeFile;
  • 👉 Крок 4: Визначення функції analyzeDirectory;
  • 👉 Крок 5: Визначення та виклик функції main;
  • 🎉 Висновок;
  • 🏁 Повний код застосунку.

Крок 1: Імпорт необхідних модулів

Для початку роботи вам знадобляться відповідні інструменти. Почніть з імпорту двох основних модулів: fs.promises для асинхронного керування файловою системою та path для ефективної роботи з шляхами до файлів.

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

Крок 2: Визначення функції getStats

Асинхронна функція getStats приймає шлях до файлу або директорії як аргумент і намагається отримати її статистику за допомогою fs.stat.

  • У разі успіху повертає статистику;
  • У разі помилки виводить повідомлення про помилку та повертає 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;
  }
}

Крок 3: Визначення функції analyzeFile

Функція analyzeFile використовує функцію getStats для отримання статистики файлу. Якщо статистика доступна (не null), повертає об'єкт, що містить ім'я файлу (отримане за допомогою path.basename) та його розмір.

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

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

Крок 4: Визначення функції analyzeDirectory

Функція analyzeDirectory приймає шлях до директорії як аргумент і всебічно аналізує її вміст.

  • Спочатку вона зчитує елементи в директорії за допомогою fs.readdir, а потім ітерує кожен елемент;
  • Для кожного елемента створює повний шлях за допомогою path.join і отримує його статистику через функцію getStats;
  • Якщо stats вказує, що елемент є файлом, оновлює статистику, пов'язану з файлами;
  • Якщо елемент є піддиректорією, рекурсивно викликає функцію analyzeDirectory для аналізу її вмісту і потім агрегує статистику.
async function analyzeDirectory(directoryPath) {
  try {
    const items = await fs.readdir(directoryPath);
    let totalItems = 0;
    let totalFiles = 0;
    let totalSize = 0;
    let largestFile = { name: "", size: 0 };
    let fileList = [];

    for (const item of items) {
      const itemPath = path.join(directoryPath, item);
      const stats = await getStats(itemPath);
      if (!stats) continue;

      totalItems++;

      if (stats.isFile()) {
        totalFiles++;
        totalSize += stats.size;

        if (stats.size > largestFile.size) {
          largestFile = { name: item, size: stats.size };
        }

        fileList.push({ name: item, size: stats.size });
      } 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: [],
    };
  }
}

Крок 5: Визначення функції main та її виклик

Функція main є точкою входу скрипта. Вона задає шлях до директорії для аналізу (у цьому випадку, ./docs), викликає функцію analyzeDirectory для отримання статистики директорії та її вмісту, а потім виводить зібрану інформацію. Функція виводить

  • загальну кількість елементів;
  • загальну кількість файлів;
  • загальний розмір;
  • деталі про найбільший файл;
  • список файлів у директорії.
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();

🎉 Висновок: Опрацьовані навички

З DirInspect Pro ви опанували мистецтво аналізу директорій на професійному рівні. Ця консольна програма демонструє вашу здатність отримувати статистику файлів, безпомилково обробляти помилки та виявляти важливу інформацію про файли й піддиректорії у вказаній директорії.

👨‍💻 Повний код застосунку

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) {
  try {
    const items = await fs.readdir(directoryPath);

    let totalItems = 0;
    let totalFiles = 0;
    let totalSize = 0;
    let largestFile = { name: "", size: 0 };
    let fileList = [];

    for (const item of items) {
      const itemPath = path.join(directoryPath, item);
      const stats = await getStats(itemPath);
      if (!stats) continue;

      totalItems++;

      if (stats.isFile()) {
        totalFiles++;
        totalSize += stats.size;

        if (stats.size > largestFile.size) {
          largestFile = { name: item, size: stats.size };
        }

        fileList.push({ name: item, size: stats.size });
      } 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();

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 2. Розділ 10

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Suggested prompts:

Can you explain how the recursive analysis in analyzeDirectory works?

What happens if the specified directory does not exist?

How can I modify the app to analyze a different directory?

Awesome!

Completion rate improved to 2.56

bookІнструмент для Перевірки Директорій

Свайпніть щоб показати меню

У цьому розділі вам пропонується завдання: створити розширений консольний застосунок під назвою DirInspect Pro. Цей застосунок дозволить детально аналізувати будь-який каталог і отримувати корисну статистику щодо його файлів та підкаталогів.

🏆 Виклик чекає

Уявіть ситуацію, коли потрібно орієнтуватися у лабіринті папок із важливими файлами та даними. DirInspect Pro стане вашим помічником у цій подорожі, надаючи повну інформацію про структуру та вміст каталогу.

🚀 Результуючий застосунок

Підготуйтеся використовувати можливості DirInspect Pro. Застосунок надасть вам важливу інформацію, таку як:

  • Загальна кількість елементів;
  • Сукупний розмір усіх елементів;
  • Назва та розмір найбільшого файлу;
  • Детальний список імен та розмірів окремих файлів.

Два шляхи на вибір

Перед вами два шляхи.

  • Перший — вирішити це завдання самостійно, вдосконалюючи свої навички без підказок;
  • Другий — скористатися корисним гайдом, який гарантує успіх.

Який би шлях ви не обрали, на вас чекає захоплююча подорож, результатом якої стане створення функціонального та цікавого консольного застосунку.

Майстер-план

  • 👉 Крок 1: Імпорт необхідних модулів;
  • 👉 Крок 2: Визначення функції getStats;
  • 👉 Крок 3: Визначення функції analyzeFile;
  • 👉 Крок 4: Визначення функції analyzeDirectory;
  • 👉 Крок 5: Визначення та виклик функції main;
  • 🎉 Висновок;
  • 🏁 Повний код застосунку.

Крок 1: Імпорт необхідних модулів

Для початку роботи вам знадобляться відповідні інструменти. Почніть з імпорту двох основних модулів: fs.promises для асинхронного керування файловою системою та path для ефективної роботи з шляхами до файлів.

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

Крок 2: Визначення функції getStats

Асинхронна функція getStats приймає шлях до файлу або директорії як аргумент і намагається отримати її статистику за допомогою fs.stat.

  • У разі успіху повертає статистику;
  • У разі помилки виводить повідомлення про помилку та повертає 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;
  }
}

Крок 3: Визначення функції analyzeFile

Функція analyzeFile використовує функцію getStats для отримання статистики файлу. Якщо статистика доступна (не null), повертає об'єкт, що містить ім'я файлу (отримане за допомогою path.basename) та його розмір.

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

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

Крок 4: Визначення функції analyzeDirectory

Функція analyzeDirectory приймає шлях до директорії як аргумент і всебічно аналізує її вміст.

  • Спочатку вона зчитує елементи в директорії за допомогою fs.readdir, а потім ітерує кожен елемент;
  • Для кожного елемента створює повний шлях за допомогою path.join і отримує його статистику через функцію getStats;
  • Якщо stats вказує, що елемент є файлом, оновлює статистику, пов'язану з файлами;
  • Якщо елемент є піддиректорією, рекурсивно викликає функцію analyzeDirectory для аналізу її вмісту і потім агрегує статистику.
async function analyzeDirectory(directoryPath) {
  try {
    const items = await fs.readdir(directoryPath);
    let totalItems = 0;
    let totalFiles = 0;
    let totalSize = 0;
    let largestFile = { name: "", size: 0 };
    let fileList = [];

    for (const item of items) {
      const itemPath = path.join(directoryPath, item);
      const stats = await getStats(itemPath);
      if (!stats) continue;

      totalItems++;

      if (stats.isFile()) {
        totalFiles++;
        totalSize += stats.size;

        if (stats.size > largestFile.size) {
          largestFile = { name: item, size: stats.size };
        }

        fileList.push({ name: item, size: stats.size });
      } 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: [],
    };
  }
}

Крок 5: Визначення функції main та її виклик

Функція main є точкою входу скрипта. Вона задає шлях до директорії для аналізу (у цьому випадку, ./docs), викликає функцію analyzeDirectory для отримання статистики директорії та її вмісту, а потім виводить зібрану інформацію. Функція виводить

  • загальну кількість елементів;
  • загальну кількість файлів;
  • загальний розмір;
  • деталі про найбільший файл;
  • список файлів у директорії.
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();

🎉 Висновок: Опрацьовані навички

З DirInspect Pro ви опанували мистецтво аналізу директорій на професійному рівні. Ця консольна програма демонструє вашу здатність отримувати статистику файлів, безпомилково обробляти помилки та виявляти важливу інформацію про файли й піддиректорії у вказаній директорії.

👨‍💻 Повний код застосунку

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) {
  try {
    const items = await fs.readdir(directoryPath);

    let totalItems = 0;
    let totalFiles = 0;
    let totalSize = 0;
    let largestFile = { name: "", size: 0 };
    let fileList = [];

    for (const item of items) {
      const itemPath = path.join(directoryPath, item);
      const stats = await getStats(itemPath);
      if (!stats) continue;

      totalItems++;

      if (stats.isFile()) {
        totalFiles++;
        totalSize += stats.size;

        if (stats.size > largestFile.size) {
          largestFile = { name: item, size: stats.size };
        }

        fileList.push({ name: item, size: stats.size });
      } 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();

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 2. Розділ 10
some-alt