在C++17及以上标准中,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