You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 23:06:04