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;
}
但这似乎有点矫枉过正了。是否存在更简单,更快捷的方式?
答案 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;
}