Інструмент для Перевірки Директорій
Свайпніть щоб показати меню
У цьому розділі пропонується завдання: створити розширений консольний застосунок під назвою 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");
- Рядок 1: імпортує вбудований модуль
fs. Властивість.promisesнадає доступ до API на основі промісів, що дозволяє виконувати асинхронні операції з файлами за допомогоюasync/await; - Рядок 2: імпортує вбудований модуль
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;
}
}
- Рядок 1: оголошує асинхронну функцію з назвою
getStats, яка приймає параметрfilePath; - Рядки 2, 5: створюють блок
try...catch, який використовується для обробки помилок під час асинхронної операції; - Рядок 3: використовує
await fs.stat(filePath)для отримання інформації про вказаний файл, такої як розмір, час створення та інші метадані; - Рядок 4: повертає об'єкт
stats, якщо операціяfs.stat()завершується успішно; - Рядок 6: виводить повідомлення про помилку в консоль за допомогою
console.error(), якщо операція не вдалася; - Рядок 7: повертає
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,
};
}
- Рядок 1: оголошує асинхронну функцію з назвою
analyzeFile, яка приймає параметрfilePath; - Рядок 2: використовує
await getStats(filePath)для отримання статистики файлу за вказаним шляхом; - Рядок 3: перевіряє, чи є
statsхибним значенням. Якщо статистику не вдалося отримати, функція повертаєnull; - Рядки 5-8: створюють і повертають об'єкт, що містить ім'я файлу та розмір файлу. Ім'я файлу отримується за допомогою
path.basename(filePath), а розмір — з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: []
};
}
}
-
Рядок 1: оголошує асинхронну функцію з назвою
analyzeDirectory, яка приймає параметрdirectoryPath; -
Рядки 2-6: ініціалізують змінні для зберігання статистики директорії, включаючи загальну кількість елементів, кількість файлів, загальний розмір, найбільший файл та список проаналізованих файлів;
-
Рядок 8: починає блок
tryдля обробки можливих помилок файлової системи; -
Рядок 9: читає вміст директорії за допомогою
fs.readdir()і зберігає результат у масивіitems; -
Рядок 11: починає цикл
for...ofдля перебору кожного елемента в директорії; -
Рядок 12: створює повний шлях для поточного елемента за допомогою
path.join(); -
Рядок 13: отримує статистику для поточного елемента за допомогою
getStats(); -
Рядок 14: пропускає поточний елемент, якщо його статистику не вдалося отримати;
-
Рядок 16: збільшує
totalItemsдля кожного успішно обробленого файлу або директорії; -
Рядки 18-29: обробка файлів:
-
Рядок 19: викликає
analyzeFile()для отримання імені та розміру файлу; -
Рядок 20: пропускає файл, якщо аналіз не вдався;
- Рядки 22-23: оновлюють загальну кількість файлів та накопичений розмір файлів;
- Рядки 25-27: оновлюють
largestFile, якщо поточний файл більший за попередній;
-
Рядок 29: додає інформацію про файл до
fileList; -
Рядки 30-42: обробка директорій:
-
Рядок 31: рекурсивно викликає
analyzeDirectory()для піддиректорії;- Рядки 33-35: об'єднують статистику піддиректорії з поточними підсумками;
- Рядки 37-39: оновлюють
largestFile, якщо у піддиректорії є більший файл;
-
Рядок 41: об'єднує списки файлів за допомогою
concat(); -
Рядки 45-50: повертають об'єкт із фінальною статистикою директорії;
-
Рядки 52-62: обробляють помилки шляхом виведення повідомлення та повернення об'єкта статистики за замовчуванням.
Крок 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();
-
Рядок 1: оголошує асинхронну функцію з назвою
main; -
Рядок 2: визначає змінну
directoryPath, яка зберігає шлях до директорії, що буде аналізуватися; -
Рядок 3: викликає
analyzeDirectory()із заданимdirectoryPathі зберігає результат у зміннійdirectoryStatsза допомогоюawait; -
Рядки 5-17: виводять розраховану статистику директорії за допомогою
console.log(), включаючи загальну кількість елементів, файлів, загальний розмір та інформацію про найбільший файл; -
Рядки 18-20: ітерують по масиву
fileList, що зберігається уdirectoryStats; -
виводять назву та розмір кожного файлу у директорії;
-
Рядок 23: викликає функцію
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();
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат