Как подсчитать количество файлов в каталоге с помощью стандартного?

Новый стандарт, ожидаемый в 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(), поэтому стандарт не может предложить лучший способ.

(На стороне плюса, которая позволяет вам решить, следует ли или как глубоко входить в подкаталоги)