Как подсчитать количество файлов в каталоге с помощью стандартного?
Новый стандарт, ожидаемый в 2017 году, добавляет std::filesystem
. Используя его, как я могу подсчитать количество файлов (включая подкаталоги) в каталоге?
Я знаю, что мы можем сделать:
std::size_t number_of_files_in_directory(std::filesystem::path path)
{
std::size_t number_of_files = 0u;
for (auto const & file : std::filesystem::directory_iterator(path))
{
++number_of_files;
}
return number_of_files;
}
Но это кажется излишним. Существует ли более простой и быстрый способ?
Ответы
Ответ 1
Я не думаю, что есть способ легко получить количество файлов в каталоге, но вы можете упростить свой код, используя std::distance
вместо рукописного цикла:
std::size_t number_of_files_in_directory(std::filesystem::path path)
{
using std::filesystem::directory_iterator;
return std::distance(directory_iterator(path), directory_iterator{});
}
Вы можете получить количество только фактических файлов или применить любой другой фильтр, используя count_if
вместо:
std::size_t number_of_files_in_directory(std::filesystem::path path)
{
using std::filesystem::directory_iterator;
using fp = bool (*)( const std::filesystem::path&);
return std::count_if(directory_iterator(path), directory_iterator{}, (fp)std::filesystem::is_regular_file);
}
Ответ 2
std::size_t number_of_files_in_directory(std::filesystem::path path)
{
return (std::size_t)std::distance(std::filesystem::directory_iterator{path}, std::filesystem::directory_iterator{});
}
Нет никакой функции, чтобы узнать, сколько файлов находится в каталоге, только функции для итерации по ней. ОС имеет только функции readdir()
, ftw()
, FindFirstFileW()
, поэтому стандарт не может предложить лучший способ.
(На стороне плюса, которая позволяет вам решить, следует ли или как глубоко входить в подкаталоги)