c++ 读取文件夹下的所有文件名(实现未知文件名也可以批量读取文件)

本文介绍了如何在C++中使用WIN32_FIND_DATA数据结构和FindFirstFile()、FindNextFile()函数批量读取文件夹下的所有文件名,即使文件名未知。通过`*.*`通配符,可以获取指定目录下的所有文件,从而实现批量读取和操作文件。

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

批量读取文件,是一个经常用到的方法,但是不知道文件名怎么批量读取呢?


首先,需要知道的就是一个数据结构!

名为:WIN32_FIND_DATA    必须包含的头文件名称为:#include <windows.h>


百度上的定义

      它意为关于文件的全部属性信息。总计有以下以下9种:文件的标题名、文件的属性(只读、存档,隐藏等)、文件的创建时间、文件的最后访问时间、文件的最后修改时间、文件大小的高位双

<think>我们面对的问题:使用C++读取指定文件夹下的文件名列表,要求同时支持Windows和Linux系统。 由于Windows和Linux的文件系统接口不同,我们需要使用条件编译(#ifdef)来区分不同平台的处理方式。 参考已有的引用: [^1]提到Linux下获取可执行文件名的方法,其中提到了读取`/proc/self/exe`符号链接,但这里我们关注的是读取目录下的文件名。 [^2]提供了Linux下读取目录的方法,使用`dirent`结构体和相关函数(opendir, readdir, closedir)。 对于Windows,我们可以使用Win32 API的`FindFirstFile`和`FindNextFile`函数。 因此,我们可以这样设计: 1. 在Windows平台,使用`FindFirstFile`和`FindNextFile`遍历目录。 2. 在Linux平台,使用`opendir`、`readdir`和`closedir`。 注意:我们需要忽略当前目录(`.`)和上级目录(`..`)。 下面是一个跨平台的实现示例:</think>下面我将详细介绍如何使用 C++ 跨平台读取目录中的文件名列表(支持 Windows 和 Linux 系统): ### 跨平台读取目录文件名实现方法 #### 1. **使用标准库(C++17 及以上)** C++17 引入了 `<filesystem>` 库,提供跨平台的文件系统操作: ```cpp #include <iostream> #include <filesystem> #include <vector> namespace fs = std::filesystem; std::vector<std::string> getFilenames(const std::string& path) { std::vector<std::string> filenames; for (const auto& entry : fs::directory_iterator(path)) { if (entry.is_regular_file()) { filenames.push_back(entry.path().filename().string()); } } return filenames; } ``` **优点**:代码简洁,跨平台,标准库支持 **缺点**:需要 C++17 或更高版本 #### 2. **平台特定实现(兼容旧标准)** 若需支持 C++11 或更早版本,可使用条件编译: ```cpp #include <iostream> #include <vector> #include <string> #ifdef _WIN32 #include <windows.h> #else #include <dirent.h> #endif std::vector<std::string> getFilenames(const std::string& path) { std::vector<std::string> filenames; #ifdef _WIN32 // Windows 实现 WIN32_FIND_DATAA findData; HANDLE hFind = FindFirstFileA((path + "\\*").c_str(), &findData); if (hFind != INVALID_HANDLE_VALUE) { do { if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { filenames.push_back(findData.cFileName); } } while (FindNextFileA(hFind, &findData)); FindClose(hFind); } #else // Linux/Unix 实现 (参考引用[2]) DIR *dir = opendir(path.c_str()); if (dir) { struct dirent *ent; while ((ent = readdir(dir)) != nullptr) { if (ent->d_type == DT_REG) { // 只添加普通文件 filenames.push_back(ent->d_name); } } closedir(dir); } #endif return filenames; } ``` #### 3. **使用示例** ```cpp int main() { std::string directory = "/path/to/directory"; // 替换为实际路径 auto files = getFilenames(directory); std::cout << "找到 " << files.size() << " 个文件:\n"; for (const auto& file : files) { std::cout << "- " << file << "\n"; } return 0; } ``` ### 关键注意事项 1. **路径格式**: - Windows 使用反斜杠 `\`(如 `C:\\Folder`) - Linux 使用正斜杠 `/`(如 `/home/user`) - 建议使用 `std::filesystem::path` 自动处理路径差异 2. **文件类型过滤**: - 使用 `d_type == DT_REG`(Linux)或 `FILE_ATTRIBUTE_DIRECTORY`(Windows)排除目录 - 如需包含子目录,需实现递归遍历 3. **错误处理**: - 检查目录是否存在:`fs::exists(path)`(C++17) - 处理权限问题:捕获异常或检查 API 返回值 4. **排序输出**: ```cpp std::sort(files.begin(), files.end()); // 按文件名排序 ``` ### 性能比较 | 方法 | 跨平台性 | 标准支持 | 实现复杂度 | |-------------------|----------|----------|------------| | C++17 <filesystem>| ★★★★★ | C++17+ | ★☆☆☆☆ | | 平台 API | ★★★☆☆ | 无要求 | ★★★★☆ | > **建议**:优先使用 C++17 的 `<filesystem>`,如需兼容旧系统可使用平台 API 实现[^1][^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MISAYAONE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值