C++如何遍历filesystem::directory_iterator实现文件夹递归查找

来源:站长查询作者:南京GEO公司头衔:草根站长
导读:本期聚焦于小伙伴创作的《C++如何遍历filesystem::directory_iterator实现文件夹递归查找》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++如何遍历filesystem::directory_iterator实现文件夹递归查找》有用,将其分享出去将是对创作者最好的鼓励。

在C++17及以上标准中,filesystem库提供了便捷的文件系统操作能力,directory_iterator可以遍历指定目录下的所有直接子项,结合递归逻辑就能实现整个文件夹树的递归查找。下面将通过完整的实战示例展示具体实现过程。

C++如何遍历filesystem::directory_iterator实现文件夹递归查找

基础环境准备

使用filesystem库需要包含对应的头文件,并且注意不同编译器的命名空间差异,在C++17中标准命名空间为std::filesystem,部分旧版本编译器可能使用std::experimental::filesystem,本文以标准C++17为例。

#include <iostream>
#include <filesystem>
#include <string>
#include <vector>

// 定义命名空间别名,简化代码书写
namespace fs = std::filesystem;

递归查找核心实现

递归查找的核心逻辑是:先遍历当前目录的所有子项,如果是普通文件则判断是否符合查找条件,如果是目录则递归调用自身继续遍历该子目录。下面是实现递归查找所有指定后缀文件的示例函数。

/**
 * 递归查找目录下所有指定后缀的文件
 * @param dir_path 要查找的目录路径
 * @param target_ext 目标文件后缀,例如".cpp"
 * @param result 用于存储查找结果的容器
 */
void recursive_find_files(const fs::path& dir_path, const std::string& target_ext, std::vector<fs::path>& result) {
    try {
        // 创建directory_iterator遍历当前目录
        for (const auto& entry : fs::directory_iterator(dir_path)) {
            // 判断当前项是目录还是文件
            if (fs::is_directory(entry.status())) {
                // 如果是目录,递归调用自身遍历子目录
                recursive_find_files(entry.path(), target_ext, result);
            } else if (fs::is_regular_file(entry.status())) {
                // 如果是普通文件,判断后缀是否匹配
                std::string file_ext = entry.path().extension().string();
                if (file_ext == target_ext) {
                    result.push_back(entry.path());
                }
            }
        }
    } catch (const fs::filesystem_error& e) {
        // 捕获遍历过程中的异常,例如权限不足、目录不存在等
        std::cerr << "遍历目录发生错误: " << e.what() << std::endl;
    }
}

功能调用示例

下面编写主函数调用上述递归查找函数,展示完整的调用流程,同时输出查找到的文件路径。

int main() {
    // 要查找的根目录,这里可以替换为实际路径,例如"./test_dir"
    fs::path root_dir = "./test_dir";
    // 要查找的目标后缀
    std::string target_ext = ".cpp";
    // 存储结果的容器
    std::vector<fs::path> found_files;

    // 调用递归查找函数
    recursive_find_files(root_dir, target_ext, found_files);

    // 输出查找结果
    std::cout << "查找到的后缀为" << target_ext << "的文件共" << found_files.size() << "个:" << std::endl;
    for (const auto& file_path : found_files) {
        std::cout << file_path.string() << std::endl;
    }

    return 0;
}

注意事项说明

  • 使用directory_iterator时需要确保目录存在且有访问权限,否则会抛出异常,建议用try-catch块包裹遍历逻辑。
  • 递归深度如果过深可能会导致栈溢出,对于层级特别多的目录可以考虑改为迭代实现,不过一般业务场景下递归足够使用。
  • path类的extension()方法返回的后缀包含点号,所以匹配时目标后缀也需要带点号,例如".txt"而不是"txt"。
  • 如果需要查找所有文件而不限制后缀,可以去掉后缀判断的逻辑,直接将所有普通文件路径加入结果容器。

扩展:查找包含指定关键词的文件名

如果需求是查找文件名包含指定关键词的文件,只需要修改判断逻辑即可,示例代码如下。

/**
 * 递归查找文件名包含指定关键词的文件
 * @param dir_path 要查找的目录路径
 * @param keyword 目标关键词
 * @param result 存储结果的容器
 */
void recursive_find_by_keyword(const fs::path& dir_path, const std::string& keyword, std::vector<fs::path>& result) {
    try {
        for (const auto& entry : fs::directory_iterator(dir_path)) {
            if (fs::is_directory(entry.status())) {
                recursive_find_by_keyword(entry.path(), keyword, result);
            } else if (fs::is_regular_file(entry.status())) {
                // 获取文件名(不带路径)
                std::string file_name = entry.path().filename().string();
                // 判断文件名是否包含关键词
                if (file_name.find(keyword) != std::string::npos) {
                    result.push_back(entry.path());
                }
            }
        }
    } catch (const fs::filesystem_error& e) {
        std::cerr << "遍历目录发生错误: " << e.what() << std::endl;
    }
}

C++filesystem_directory_iterator递归查找文件夹遍历修改时间:2026-06-18 06:57:21

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。