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();

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

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

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

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();

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

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