
В задачах автоматизации часто требуется определить точное количество файлов в каталоге. На стороне 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); // только файлы
Рекомендации:
- Для больших директорий используйте асинхронные методы, чтобы не блокировать цикл событий.
- При работе с путями всегда применяйте
path.joinдля совместимости с разными ОС. - Обрабатывайте ошибки через
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.
- Читаем содержимое текущей директории с помощью
fs.readdirSync. - Для каждого элемента определяем, является ли он файлом или папкой через
fs.statSync. - Если найден файл – увеличиваем счётчик.
- Если найдена папка – вызываем функцию повторно для этой директории.
Пример функции:
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-системах скрытые файлы начинаются с точки (например, .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. При очень больших директориях синхронные методы могут сильно замедлить выполнение программы или вызвать переполнение стека при рекурсии. В таких случаях лучше использовать асинхронные методы и обрабатывать файлы частями.
