活动介绍
file-type

C++ 在VS2013下遍历目录并打印文件名及后缀

1星 | 下载需积分: 5 | 561KB | 更新于2025-04-28 | 17 浏览量 | 10 下载量 举报 收藏
download 立即下载
在C++中,遍历目录和文件是一项基础但非常实用的操作。尤其是在使用Visual Studio这样的集成开发环境(IDE)时,开发者可以利用标准库中提供的功能或者平台特定的API来实现文件系统遍历。本知识点将详细介绍如何在VS 2013环境下,通过C++语言遍历一个特定目录下的所有文件,并获取这些文件的名称以及它们的后缀名。 首先,要遍历目录,我们可以使用C++标准库中的`<filesystem>`头文件中的类和函数(如果编译器支持C++17及以上版本),或者使用平台特定的API如`<windows.h>`中的函数(例如`FindFirstFile`, `FindNextFile`, 和 `FindClose`)。 在VS 2013环境下,我们可能需要使用`<filesystem>`的实验版本或者使用Win32 API。因为VS 2013默认不支持C++17标准。如果我们要使用`<filesystem>`,可能需要引入Boost库中的文件系统模块。而使用Win32 API则不需要额外库,但代码相对较为复杂。 遍历目录的基本步骤可以分为: 1. 打开指定的目录。 2. 检索目录中的文件信息。 3. 遍历目录中的每个文件。 4. 读取并打印文件名和文件后缀。 下面将逐步展开这些步骤: ### 打开指定的目录 使用`<filesystem>`库或者Win32 API的`CreateFile`函数以`FILE_LIST_DIRECTORY`访问权限打开目录。当使用Win32 API时,需要将目录路径转换为宽字符串类型(`wchar_t*`)。 ### 检索目录中的文件信息 如果使用`<filesystem>`,可以调用`directory_iterator`或`recursive_directory_iterator`来遍历目录。对于Win32 API,则需要使用`FindFirstFile`函数开始检索,然后使用`FindNextFile`来遍历。 ### 遍历目录中的每个文件 通过迭代或循环的方式,调用检索函数,直到所有文件都被处理。在每次迭代中,检查是否已到达目录末尾,如果是,则使用`FindClose`函数关闭句柄,并结束遍历。 ### 读取并打印文件名和文件后缀 对于每个遍历到的文件,可以使用文件信息结构体(如`WIN32_FIND_DATA`或`std::filesystem::directory_entry`)来获取文件名。提取后缀名需要对文件名进行字符串操作,例如使用`std::string`的`find_last_of`或`std::filesystem::path`的`extension`方法。 ### 示例代码(使用Win32 API) ```cpp #include <windows.h> #include <iostream> #include <string> #include <vector> std::vector<std::string> ListFloder(const std::string& folderPath) { WIN32_FIND_DATA ffd; HANDLE hFind = INVALID_HANDLE_VALUE; std::vector<std::string> files; // 将C风格字符串转换为宽字符串 std::wstring wFolder(folderPath.begin(), folderPath.end()); wFolder += L"\\*"; // 添加通配符以匹配所有文件 hFind = FindFirstFile(wFolder.c_str(), &ffd); if (INVALID_HANDLE_VALUE == hFind) return files; // 如果没有找到,返回空vector do { if (!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { // 检查是否为文件 std::wstring_convert<std::codecvt_utf8<wchar_t>> converter; std::string fileName = converter.to_bytes(ffd.cFileName); files.push_back(fileName); } } while (FindNextFile(hFind, &ffd) != 0); FindClose(hFind); return files; } int main() { std::string path = "C:\\example\\folder"; // 替换为你的目录路径 std::vector<std::string> fileList = ListFloder(path); for (const std::string& fileName : fileList) { size_t dotPos = fileName.rfind('.'); std::string extension = dotPos != std::string::npos ? fileName.substr(dotPos) : ""; std::cout << fileName << " extension: " << extension << std::endl; } return 0; } ``` 在上述代码中,`ListFloder`函数负责遍历指定的文件夹,并返回一个包含文件名的vector。然后在`main`函数中,我们遍历返回的vector,对每个文件名使用`find_last_of`方法来找到最后一个点(`.`)的位置,并据此截取出文件的后缀名。 这段代码是一个基础的示例,它没有处理可能发生的错误,例如路径不存在或访问被拒绝等情况。在实际应用中,应当对这些情况进行适当的处理。此外,根据实际需求,文件遍历可能还需要过滤特定类型的文件,或者进行递归遍历等操作。

相关推荐