C++目录遍历技术求助:查找.txt文件及加载.so文件并加载同目录文件
嘿,我来帮你搞定这两个C++需求!考虑到你是零基础新手,我会把代码写得尽量直白,还配上详细注释,方便你理解~
问题1:遍历目录及子目录查找所有.txt文件
咱们可以用C++17标准库自带的std::filesystem来实现跨平台的目录遍历,不用自己写复杂的平台相关代码,非常适合新手。下面是完整代码:
#include <iostream> #include <filesystem> // 命名空间别名,写起来更短 namespace fs = std::filesystem; void search_txt_files(const fs::path& dir_path) { try { // 递归遍历当前目录及所有子目录的条目(文件/子目录) for (const auto& entry : fs::recursive_directory_iterator(dir_path)) { // 判断当前条目是普通文件,并且扩展名是.txt if (entry.is_regular_file() && entry.path().extension() == ".txt") { // 输出找到的txt文件路径 std::cout << "找到txt文件:" << entry.path() << std::endl; } } } catch (const fs::filesystem_error& e) { // 处理可能的错误,比如权限不足、目录不存在 std::cerr << "错误:" << e.what() << std::endl; } } int main() { // 替换成你要遍历的根目录路径,比如"/home/yourname/documents"或者"C:\\Users\\yourname\\Documents" fs::path root_dir = "./"; search_txt_files(root_dir); return 0; }
编译&运行说明
编译的时候要指定C++17标准,比如在Linux/macOS下:
g++ -std=c++17 your_file.cpp -o txt_search ./txt_search
Windows下用MSVC的话,直接在VS里开启C++17支持即可。
问题2:遍历目录及子目录加载.so文件,成功后处理同目录其他文件
这个需求针对Linux平台(.so是Linux动态库),咱们需要用到Linux的动态链接库API(dlopen/dlclose),同时还是用std::filesystem来遍历目录。下面是完整代码,每一步都有注释:
#include <iostream> #include <filesystem> #include <dlfcn.h> // Linux动态库操作头文件 namespace fs = std::filesystem; // 尝试加载.so文件,成功则处理同目录其他文件 void load_so_and_process_dir(const fs::path& so_path) { // 打开动态库,RTLD_LAZY表示延迟解析符号,RTLD_LOCAL避免符号污染全局空间 void* handle = dlopen(so_path.c_str(), RTLD_LAZY | RTLD_LOCAL); if (handle == nullptr) { // 加载失败,打印错误信息 std::cerr << "加载" << so_path << "失败:" << dlerror() << std::endl; return; } std::cout << "成功加载动态库:" << so_path << std::endl; // 获取该.so所在的目录路径 fs::path so_dir = so_path.parent_path(); std::cout << "开始处理目录" << so_dir << "下的其他文件:" << std::endl; // 遍历该目录下的所有文件 for (const auto& entry : fs::directory_iterator(so_dir)) { // 跳过当前的.so文件本身 if (entry.path() == so_path) { continue; } // 判断是普通文件(可以根据需求修改,比如只处理特定扩展名) if (entry.is_regular_file()) { std::cout << "处理文件:" << entry.path() << std::endl; // 这里写你要对文件执行的操作,比如读取内容、复制等 // 示例:打印文件名 // std::cout << "文件名:" << entry.path().filename() << std::endl; } } // 记得关闭动态库,避免资源泄漏 dlclose(handle); } void search_and_load_so(const fs::path& root_dir) { try { // 递归遍历所有目录 for (const auto& entry : fs::recursive_directory_iterator(root_dir)) { // 判断是普通文件,且扩展名是.so if (entry.is_regular_file() && entry.path().extension() == ".so") { load_so_and_process_dir(entry.path()); } } } catch (const fs::filesystem_error& e) { std::cerr << "遍历目录出错:" << e.what() << std::endl; } } int main() { // 替换成你要遍历的根目录 fs::path root_dir = "./"; search_and_load_so(root_dir); return 0; }
编译&运行说明
编译的时候需要链接动态链接库dl,命令如下:
g++ -std=c++17 your_file.cpp -o so_loader -ldl ./so_loader
新手注意点
- 确保你的系统上安装了C++17及以上版本的编译器
- 动态库加载失败可能是因为.so文件本身有问题(比如依赖缺失),可以用
ldd your_lib.so查看依赖情况 - 处理同目录文件的部分,你可以根据自己的需求修改代码(比如读取文件内容、复制到其他目录等)
内容的提问来源于stack exchange,提问作者Pramod Raghavendra Jayathirth
相关产品推荐
相关产品推荐

