如何使用C++递归遍历指定文件夹下的所有层级子文件夹
C++ 广度优先遍历目录树实现方案
你需要的是广度优先(BFS)的目录遍历逻辑,优先遍历完同一层级的所有文件夹后,再深入下一级子文件夹,C++17及以上版本可以直接用标准库的std::filesystem实现,无需引入第三方依赖。
实现思路
- 用队列存储待遍历的文件夹路径,先把根目录路径加入队列
- 循环取出队列头部的路径,遍历该路径下的所有条目
- 筛选出其中的子文件夹,先执行你需要的「打开/处理」逻辑,再将这些子文件夹路径加入队列末尾
- 直到队列为空时,所有层级的文件夹就全部遍历完成了
完整示例代码
#include <iostream> #include <queue> #include <filesystem> // C++17及以上适用,编译时需要对应配置C++17标准 namespace fs = std::filesystem; int main() { // 替换为你要遍历的根文件夹路径 const fs::path root_path = "/path/to/your/target/folder"; if (!fs::exists(root_path) || !fs::is_directory(root_path)) { std::cerr << "输入路径不存在或不是合法文件夹" << std::endl; return 1; } // BFS用的队列,存储待遍历的文件夹路径 std::queue<fs::path> dir_queue; dir_queue.push(root_path); while (!dir_queue.empty()) { // 取出当前层级的一个文件夹 fs::path current_dir = dir_queue.front(); dir_queue.pop(); // 这里写你对当前文件夹的处理逻辑,比如打印路径、打开文件夹等 std::cout << "处理文件夹:" << current_dir << std::endl; // 遍历当前文件夹下的所有条目,筛选子文件夹加入队列 for (const auto& entry : fs::directory_iterator(current_dir)) { if (entry.is_directory()) { dir_queue.push(entry.path()); } } } return 0; }
注意事项
- 编译依赖:GCC/Clang编译时需要添加编译参数
-std=c++17,部分旧版本编译器还需要额外链接-lstdc++fs;Visual Studio需要在项目属性中把C标准设置为C17及以上 - 权限问题:如果遍历系统保护区或者无访问权限的文件夹,
fs::directory_iterator会抛出异常,你可以根据需要添加try-catch块捕获异常,跳过无权限的目录 - 如果你用的是C++17以下的旧标准,可以用操作系统原生API实现:Windows下用
FindFirstFileW/FindNextFileW,Linux下用opendir/readdir,逻辑和上面的BFS逻辑完全一致,只需要替换路径读取的接口即可
内容的提问来源于stack exchange,提问作者user16992972
相关产品推荐
相关产品推荐

