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 для визначення, чи це файл, чи папка;
  • Якщо це файл:
    • Викликає analyzeFile для отримання { name, size };
    • Оновлює підсумки, найбільший файл та список файлів.
  • Якщо це директорія:
    • Рекурсивно викликає analyzeDirectory;
    • Об'єднує результати з поточною статистикою.
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: []
    };
  }
}

Крок 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();

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

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();
Все було зрозуміло?

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

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

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

Запитати АІ

expand

Запитати АІ

ChatGPT

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

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 для визначення, чи це файл, чи папка;
  • Якщо це файл:
    • Викликає analyzeFile для отримання { name, size };
    • Оновлює підсумки, найбільший файл та список файлів.
  • Якщо це директорія:
    • Рекурсивно викликає analyzeDirectory;
    • Об'єднує результати з поточною статистикою.
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: []
    };
  }
}

Крок 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();

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

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();
Все було зрозуміло?

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

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

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