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

How to count the number of files in a directory using standard?

本文关键字:文件 何使用 标准计      更新时间:2023-10-16

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

但这似乎过于杀伤。是否存在更简单,更快的方式?

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

没有功能可以找出目录中有多少个文件,只能在其上迭代。OS仅具有readdir()ftw()FindFirstFileW()之类的函数,因此标准无法提供更好的方法。

(在正面,您可以决定是否或深入到子目录中)

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

namespace fs = std::experimental::filesystem;

然后您可能可以使用这样的函数。

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