Как посчитать количество файлов в папке JavaScript

Как посчитать количество файлов в папке javascript

Как посчитать количество файлов в папке javascript

В задачах автоматизации часто требуется определить точное количество файлов в каталоге. На стороне JavaScript это возможно при работе с Node.js, где есть доступ к файловой системе через модуль fs. Такой подход позволяет быстро получить список элементов директории и подсчитать их количество без сторонних инструментов.

Основной метод – использование fs.readdir или его синхронного аналога. Эти функции возвращают массив имён всех объектов в папке, включая файлы и подкаталоги. Чтобы вычислить количество файлов, необходимо дополнительно проверять тип каждого элемента через fs.stat или fs.lstat, исключая директории и символические ссылки.

Если важна производительность при работе с большими каталогами, лучше использовать асинхронный вариант fs.promises.readdir в сочетании с фильтрацией по свойству isFile(). Такой способ снижает блокировки событийного цикла и позволяет обрабатывать данные параллельно.

Использование модуля fs для чтения содержимого папки

В Node.js модуль fs предоставляет методы для работы с файловой системой. Чтобы получить список файлов в каталоге, чаще всего применяют функцию fs.readdir или её синхронный аналог fs.readdirSync.

Пример асинхронного вызова:

const fs = require('fs');
fs.readdir('./папка', (err, files) => {
if (err) throw err;
console.log(files); // массив имён файлов и подпапок
});

Важные моменты при использовании:

  • files возвращает не только файлы, но и папки. Для фильтрации можно применять fs.stat или fs.lstat.
  • Синхронный вариант (fs.readdirSync) блокирует поток, поэтому его используют реже, в основном в скриптах без высокой нагрузки.
  • Путь можно указывать относительный или абсолютный, но при использовании относительных путей ориентиром будет текущий рабочий каталог (process.cwd()).

Фильтрация только файлов:

const fs = require('fs');
const path = require('path');
const dirPath = './папка';
const files = fs.readdirSync(dirPath).filter(file => {
return fs.statSync(path.join(dirPath, file)).isFile();
});
console.log(files); // только файлы

Рекомендации:

  1. Для больших директорий используйте асинхронные методы, чтобы не блокировать цикл событий.
  2. При работе с путями всегда применяйте path.join для совместимости с разными ОС.
  3. Обрабатывайте ошибки через try/catch или колбэки, чтобы избежать падения приложения.

Фильтрация только файлов без учёта подпапок

Фильтрация только файлов без учёта подпапок

Пример:

const fs = require("fs");
const path = require("path");
const dirPath = "./example";
const files = fs.readdirSync(dirPath).filter(item => {
const fullPath = path.join(dirPath, item);
return fs.statSync(fullPath).isFile();
});
console.log(files.length);

Ключевые шаги:

Действие Описание
Чтение содержимого папки fs.readdirSync(dirPath) возвращает список элементов
Определение пути path.join(dirPath, item) формирует полный путь
Проверка типа fs.statSync(fullPath).isFile() возвращает true, если это файл
Фильтрация В итоговый массив попадают только файлы

Таким образом, подсчёт производится без учёта подпапок и их содержимого.

Подсчёт файлов с определённым расширением

Подсчёт файлов с определённым расширением

Для отбора нужных файлов применяют модуль fs и функцию path.extname(), которая возвращает расширение имени.

const fs = require('fs');
const path = require('path');
const dir = './logs';
const ext = '.log';
fs.readdir(dir, (err, files) => {
if (err) throw err;
const count = files.filter(f => path.extname(f) === ext).length;
console.log(`Найдено ${count} файлов с расширением ${ext}`);
});

Для нескольких форматов удобно задать массив:

const exts = ['.js', '.json'];
const count = files.filter(f => exts.includes(path.extname(f))).length;

При большом количестве элементов предпочтительнее использовать fs.readdirSync() в скриптах без асинхронной логики.

Рекурсивный обход вложенных директорий

Для подсчёта файлов во всех уровнях вложенности необходимо рекурсивно обходить директории. В Node.js это реализуется с помощью модулей fs и path.

  1. Читаем содержимое текущей директории с помощью fs.readdirSync.
  2. Для каждого элемента определяем, является ли он файлом или папкой через fs.statSync.
  3. Если найден файл – увеличиваем счётчик.
  4. Если найдена папка – вызываем функцию повторно для этой директории.

Пример функции:


const fs = require("fs");
const path = require("path");
function countFiles(dir) {
let count = 0;
const items = fs.readdirSync(dir);
for (const item of items) {
const fullPath = path.join(dir, item);
const stats = fs.statSync(fullPath);
if (stats.isFile()) {
count++;
} else if (stats.isDirectory()) {
count += countFiles(fullPath);
}
}
return count;
}
console.log(countFiles("./test"));

Практические рекомендации:

  • Используйте fs.promises для асинхронной версии, если файлов очень много.
  • Добавляйте обработку ошибок try/catch, чтобы избежать сбоев при ограниченных правах доступа.
  • Фильтруйте ненужные элементы (например, скрытые системные папки), если они не нужны в подсчёте.

Обработка ошибок при отсутствии доступа к папке

Обработка ошибок при отсутствии доступа к папке

В JavaScript при работе с файловой системой через модуль fs отсутствие доступа к папке вызывает исключение ENOENT или EACCES. Для корректной обработки используйте конструкцию try...catch при синхронных методах, таких как fs.readdirSync:

try { const files = fs.readdirSync('/путь/к/папке'); } catch (err) { if (err.code === 'EACCES') { console.error('Нет прав на доступ к папке'); } else { throw err; }}

Для асинхронных методов fs.readdir передавайте колбэк с проверкой ошибки:

fs.readdir('/путь/к/папке', (err, files) => { if (err) { if (err.code === 'EACCES') console.error('Доступ запрещён'); else throw err; } else { console.log(files.length); } });

Важно различать тип ошибки: ENOENT сигнализирует об отсутствии папки, EACCES – о недостатке прав. Для автоматической обработки можно проверять существование папки через fs.access с флагом fs.constants.R_OK перед чтением:

fs.access('/путь/к/папке', fs.constants.R_OK, (err) => { if (err) console.error('Папка недоступна для чтения'); else fs.readdir('/путь/к/папке', (err, files) => { if (!err) console.log(files.length); }); });

Такая последовательность предотвращает аварийное завершение скрипта и позволяет логировать проблемы с доступом без потери информации о других папках.

Подсчёт скрытых файлов в Unix-системах

Подсчёт скрытых файлов в Unix-системах

В Unix-системах скрытые файлы начинаются с точки (например, .config). Для их подсчёта стандартные методы, которые просто перебирают содержимое каталога, недостаточны, так как они игнорируют файлы с точкой в начале имени.

В Node.js можно использовать модуль fs с фильтром по имени файла. Пример: fs.readdirSync('/путь/к/папке').filter(f => f.startsWith('.')).length. Этот подход учитывает только файлы верхнего уровня, игнорируя подпапки.

Если требуется учёт рекурсивно, можно использовать функцию обхода директорий с fs.readdirSync и проверкой fs.statSync(path).isFile() для каждого элемента. Фильтр startsWith('.') позволяет исключить обычные файлы.

Для командной строки Unix: ls -d .?* | wc -l считает скрытые элементы текущей папки. Команда find . -type f -name ".*" | wc -l подсчитывает только скрытые файлы рекурсивно, игнорируя каталоги.

Важно учитывать, что . и .. – это системные ссылки на текущий и родительский каталог. Их нужно исключать при подсчёте, иначе результат будет завышен.

При работе с большим количеством файлов эффективнее использовать асинхронные методы fs.readdir и fs.stat для предотвращения блокировки потока Node.js.

Для отображения числа файлов в папке используйте метод console.log(). После чтения содержимого с помощью fs.readdir или fs.promises.readdir получите массив имен файлов. Длина этого массива и будет итоговым количеством.

Пример с асинхронной функцией:

const fs = require('fs').promises;
async function countFiles(directory) {
try {
const files = await fs.readdir(directory);
console.log(Количество файлов: ${files.length});
} catch (error) {
console.error('Ошибка при чтении папки:', error);
}
}
countFiles('./папка');

Для синхронного варианта можно использовать fs.readdirSync и сразу вывести длину массива:

const fs = require('fs');
try {
const files = fs.readdirSync('./папка');
console.log('Количество файлов:', files.length);
} catch (error) {
console.error('Ошибка при чтении папки:', error);
}

Пример фильтрации для файлов с расширением .js:

const jsFiles = files.filter(file => file.endsWith('.js'));
console.log('Количество JS-файлов:', jsFiles.length);

Такой подход позволяет точно контролировать, какие объекты учитываются в итоговом числе, и предотвращает включение подкаталогов или скрытых файлов.

Вопрос-ответ:

Как посчитать количество файлов в папке с помощью Node.js?

В Node.js можно использовать модуль fs. Например, функция fs.readdirSync() возвращает массив имен всех файлов и папок в указанной директории. Чтобы получить количество только файлов, нужно дополнительно проверить каждый элемент с помощью fs.statSync() и метода isFile().

Можно ли посчитать файлы в папке асинхронно?

Да, для этого используют fs.promises.readdir или fs.readdir с колбэком. Получив список элементов, для каждого объекта вызывают fs.promises.stat или fs.stat и проверяют, является ли он файлом. Асинхронный способ удобен при работе с большими директориями, чтобы не блокировать поток выполнения.

Как посчитать файлы с определённым расширением, например, только .txt?

Сначала нужно получить список всех элементов папки через fs.readdir или fs.promises.readdir. После этого фильтруют элементы по расширению, используя метод endsWith('.txt'), и проверяют, что это именно файл с помощью fs.stat или fs.promises.stat. В итоге длина полученного массива и будет количеством файлов с нужным расширением.

Можно ли посчитать файлы в подпапках?

Да, но стандартные методы fs.readdir или fs.readdirSync возвращают только элементы текущей директории. Для подсчёта в подпапках нужно рекурсивно проходить по всем папкам, проверять, является ли элемент директорией, и вызывать ту же функцию для неё. В конце складывают количество файлов из всех уровней.

Есть ли ограничения на количество файлов, которое можно посчитать через JavaScript?

Прямых ограничений нет, но на практике лимиты зависят от ресурсов компьютера и используемой версии Node.js. При очень больших директориях синхронные методы могут сильно замедлить выполнение программы или вызвать переполнение стека при рекурсии. В таких случаях лучше использовать асинхронные методы и обрабатывать файлы частями.

Ссылка на основную публикацию