C++读取系统某路径下某后缀的文件全路径

本文介绍了一个C++功能函数,该函数可以从指定路径下的文件夹中读取特定格式的文件,并将其完整路径保存到字符串向量中。通过示例代码展示了如何使用此函数来获取指定文件夹内所有.mat文件的路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从文件夹路径path下读取后缀格式为format的文件,保存其全路径到fileFullpath中

功能函数

void saveFilesFullpathFromFolderInFormat(string path,vector<string>& fileFullpath,string format){
    _finddata_t fileInfo;
    string s;
    const char* filePath = s.assign(path).append("\\*").append(format).c_str();  //将string转化为const char*类型
    intptr_t fileHandle = _findfirst(filePath, &fileInfo); //读取第一个文件信息 文件句柄类型为long会出现不兼容[Win10平台用long声明文件句柄会crash]
    string f;
    if (fileHandle == -1){
        cout << "error\n";
    }
    else{
        f = path + string("\\") + string(fileInfo.name);
        fileFullpath.push_back(f);
    }
    while (_findnext(fileHandle, &fileInfo)==0){
        f = path+string("\\")+string(fileInfo.name);
        fileFullpath.push_back(f);
    }
    _findclose(fileHandle);
}

测试代码

#include<io.h>
#include<string>
#include<vector>
using namespace std;

int main(){
    string s1 = "C:\\Users\\chaoy\\Desktop\\mitdb";
    string s2 = ".mat";
    vector<string> files;
    saveFilesFullpathFromFolderInFormat(s1,files,s2);
    int s = files.size();
    for (int i = 0; i < s; i++){
        cout << i+1 <<"  "<<files[i] << "\n";
    }
    return 0;
}

文件路径

这里写图片描述

输出结果

这里写图片描述

<think>好的,用户问的是如何在C++获取指定路径下的后缀文件。这个问题看起来是关于文件系统操作的,我需要回忆一下C++标准库中相关的部分。 首先,我记得C++17引入了文件系统库,位于<filesystem>头文件中,命名空间是std::filesystem。这个库应该能帮助遍历目录和检查文件属性。用户可能需要使用directory_iterator或recursive_directory_iterator来遍历目录中的文件。 接下来,用户需要筛选特定后缀文件。每个文件都有一个路径,可以通过path类的extension()方法获取后缀名。然后,将后缀名转换为小写或大写进行比较,避免大小写不一致的问题,比如用户要找.txt,但文件可能是.TXT。 步骤大概如下:遍历目录中的每个条目,检查是否是常规文件,然后提取后缀名进行比较。需要注意的是,有些条目可能是目录或者符号链接,应该过滤掉。使用is_regular_file()函数来确认是否是文件。 还有,路径的处理。用户提供的路径可能需要转换为绝对路径或者处理相对路径的问题。在代码中,可能需要用path类来构造路径,并确保程序有权限访问该目录。 可能的错误处理:目录不存在或者无法访问时,需要捕获异常或者检查错误。比如使用try-catch块来处理filesystem_error异常,或者在使用前检查目录是否存在。 另外,跨平台的问题。filesystem库在Windows和Linux下的行为可能有所不同,比如路径分隔符,但path类应该能处理这些差异,用户代码中应使用正斜杠或反斜杠,但path会自动处理。 总结步骤: 1. 包含必要的头文件:<filesystem>和<iostream>,可能还需要<string>和<vector>。 2. 使用namespace fs = std::filesystem;简化代码。 3. 获取目标目录路径和所需后缀。 4. 遍历目录中的每个条目。 5. 对每个条目检查是否是文件,并获取后缀。 6. 比较后缀是否符合,符合则保存路径。 7. 处理可能的异常,如目录不存在。 然后,用户可能需要一个具体的例子。比如,如何将路径后缀作为参数传入函数,返回符合条件的文件列表。示例代码的结构大致是:一个函数,接受路径后缀,返回vector<fs::path>,里面是匹配的文件。 需要注意的是,extension()返回的后缀包含点号,比如".txt",所以在比较时,用户提供的后缀应该包含点号,或者在代码中处理这种情况。 测试时,可能需要处理不同情况,比如后缀的大小写,或者没有权限访问目录的情况,这时候需要异常处理。 最后,编译时需要支持C++17标准,比如使用g++时加上-std=c++17选项,并链接相应的库,比如-lstdc++fs(旧版本的GCC可能需要,但新版本可能不需要)。 所以,整理一下思路,给出一个代码示例,并解释各个部分的作用,提醒用户注意编译选项和异常处理,以及可能的大小写问题。</think>在C++获取指定路径下的特定后缀文件,可以通过以下步骤实现(需要C++17及以上标准): ```cpp #include <iostream> #include <filesystem> #include <vector> #include <string> namespace fs = std::filesystem; // 获取指定路径特定后缀文件列表 std::vector<fs::path> get_files_by_extension(const fs::path& dir_path, const std::string& extension) { std::vector<fs::path> result; if (!fs::exists(dir_path)) { std::cerr << "路径不存在: " << dir_path << std::endl; return result; } try { // 遍历目录条目 for (const auto& entry : fs::directory_iterator(dir_path)) { // 过滤常规文件 if (entry.is_regular_file()) { // 获取文件后缀并转换为小写 std::string file_ext = entry.path().extension().string(); std::transform(file_ext.begin(), file_ext.end(), file_ext.begin(), ::tolower); // 比较后缀(输入扩展名需要包含点号,如".txt") if (file_ext == extension) { result.push_back(entry.path()); } } } } catch (const fs::filesystem_error& e) { std::cerr << "文件系统错误: " << e.what() << std::endl; } return result; } /* 使用示例 int main() { auto files = get_files_by_extension("D:/documents", ".pdf"); std::cout << "找到 " << files.size() << " 个文件:" << std::endl; for (const auto& file : files) { std::cout << file.filename() << std::endl; } return 0; } */ ``` 关键步骤说明: 1. **头文件包含**: - `<filesystem>`:提供文件系统操作功能 - `<vector>`:用于存储结果列表 - `<algorithm>`:用于转换字符串大小写 2. **路径验证**: ```cpp if (!fs::exists(dir_path)) { ... } ``` 验证输入路径是否存在 3. **目录遍历**: ```cpp for (const auto& entry : fs::directory_iterator(dir_path)) { ... } ``` 使用`directory_iterator`遍历目录内容 4. **文件类型过滤**: ```cpp if (entry.is_regular_file()) { ... } ``` 排除目录、符号链接等非普通文件 5. **后缀处理**: ```cpp entry.path().extension().string() ``` - `extension()`方法返回包含点号的后缀(如".txt") - 转换为小写实现大小写不敏感匹配 **注意事项**: 1. 编译时需要添加C++17支持: ```bash g++ -std=c++17 -o program program.cpp ``` 2. 扩展名比较需要包含点号,如查找文本文件应传入".txt" 3. 异常处理: - 捕获`filesystem_error`处理权限问题 - 提前检查路径有效性 4. 性能优化: - 对于大型目录,可改用递归遍历`recursive_directory_iterator` - 多线程场景需要加锁保护 **扩展功能建议**: 1. 添加白名单机制支持多个扩展名 2. 实现异步遍历回调机制 3. 添加文件属性过滤(大小、修改时间等) 4. 支持通配符匹配(需转换正则表达式) 示例代码可以直接复制使用,根据实际需求调整过滤条件和异常处理逻辑。如果遇到权限问题,程序会通过异常捕获机制输出错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值