如何使用标准计算目录中的文件数?

时间:2016-12-23 16:33:16

标签: c++ c++17

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;
}

但这似乎有点矫枉过正了。是否存在更简单,更快捷的方式?

3 个答案:

答案 0 :(得分:18)

我认为不存在容易获取目录中文件数量的方法,但您可以使用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);
}

答案 1 :(得分:9)

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()等功能,因此标准无法提供更好的方法。

(在正面,允许您决定是否,或有多深入,递归到子目录)

答案 2 :(得分:0)

如果使用的是Visual Studio 17,则需要使用以下命名空间。

namespace fs = std::experimental::filesystem;

那么您可能可以使用像这样的函数。

int Count() {
int count=0;
for (auto& p : fs::directory_iterator(beatmapDir)) {
    count++;

}
    return count;
}