C++17中std::filesystem::directory_iterator和std::filesystem::recursive_directory_iterator的使用

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

      执行结果如下图所示:

      GitHubhttps://github.com/fengbingchun/Messy_Test

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值