C++17引入了std::filesystem库(文件系统库, filesystem library)。这里整理下std::filesystem::directory_iterator和std::filesystem::recursive_directory_iterator的使用。
1.std::filesystem::directory_iterator,迭代目录的std::filesystem::directory_entry元素(但不妨问子目录)。迭代顺序未指定,但每个目录项仅被访问一次。特殊路径名.和..将被跳过。value_type为std::filesystem::directory_entry。
以下为测试代码:
int test_filesystem_directory_iterator()
{
namespace fs = std::filesystem;
#ifdef _MSC_VER
const std::string path{ "../../../src/cJSON" };
#else
const std::string path{ "../../src/cJSON" };
#endif
std::cout << "directory_iterator result:" << std::endl;
for (auto const& dir_entry : fs::directory_iterator(path))
std::cout << dir_entry.path() << std::endl;
return 0;
}
执行结果如下图所示:
2.std::filesystem::recursive_directory_iterator,迭代目录的std::filesystem::directory_entry元素,并递归地迭代所有子目录。迭代顺序未指定,但每个目录项仅被访问一次。特殊路径名.和..将被跳过。value_type为std::filesystem::directory_entry。
默认情况下,不遵循符号链接(symlinks are not followed),但可以通过在构造时指定目录项follow_directory_symlink来启用此功能。
其成员函数depth:返回从起始目录到当前迭代目录的目录深度。起始目录的深度为0,其子目录的深度为1,依次类推。
测试代码如下:
int test_filesystem_recursive_directory_iterator()
{
namespace fs = std::filesystem;
#ifdef _MSC_VER
const std::string path{ "../../../src/cJSON" };
#else
const std::string path{ "../../src/cJSON" };
#endif
std::vector<fs::path> files, directories;
for (auto const& dir_entry : fs::recursive_directory_iterator(path)) {
if (dir_entry.is_directory())
directories.emplace_back(dir_entry.path());
else if (dir_entry.is_regular_file())
files.emplace_back(dir_entry.path());
else
std::cout << "other:" << dir_entry.path() << std::endl;
}
std::cout << "recursive_directory_iterator result:" << std::endl;
std::cout << "directories:" << std::endl;
for (const auto& dir : directories)
std::cout << "\t" << dir << std::endl;
std::cout << "\n\nregular files:" << std::endl;
for (const auto& file : files)
std::cout << "\t" << file << std::endl;
// depth
std::cout << "\n\ndepth:" << std::endl;
for (auto it = fs::recursive_directory_iterator(path); it != fs::recursive_directory_iterator(); ++it)
std::cout << *it << ": " << it.depth() << std::endl;
return 0;
}
执行结果如下图所示: