C++如何获取C盘根目录所有文件路径?现有代码输出异常如何解决
问题原因
- 路径格式错误:Windows系统下
C:和C:\是完全不同的路径含义,前者指代C盘对应的当前工作目录(也就是你程序运行的目录),后者才是C盘根目录。你调用szSingleDrive[strlen(szSingleDrive) - 1] = 0;把GetLogicalDriveStrings返回的自带末尾反斜杠删掉了,传入遍历的路径变成了C:,自然只会输出当前程序所在目录的文件。 - 指针偏移代码位置错误:
szSingleDrive += strlen(szSingleDrive) + 1;这行代码写在了目录遍历的for循环内部,第一个文件遍历完成后就会直接偏移驱动器指针,导致外层驱动器循环直接终止,无法完成全目录遍历。 - 缺少异常处理:C盘根目录存在大量无权限访问的系统目录,
recursive_directory_iterator默认遇到访问拒绝会直接抛出异常,导致程序提前退出,无法遍历完整路径。
修复方案
修复后的完整代码如下:
#include <windows.h> #include <filesystem> #include <iostream> #include <string> namespace fs = std::filesystem; int main() { DWORD dwSize = MAX_PATH; char szLogicalDrives[MAX_PATH] = { 0 }; DWORD dwResult = GetLogicalDriveStringsA(dwSize, szLogicalDrives); if (dwResult > 0 && dwResult <= MAX_PATH) { char* szSingleDrive = szLogicalDrives; while (*szSingleDrive) { // 保留驱动器末尾的反斜杠,确保是根目录路径 printf("当前遍历驱动器:%s\n", szSingleDrive); // 配置遍历选项,自动跳过无权限目录 auto iter_options = fs::directory_options::skip_permission_denied; try { for (const auto& p : fs::recursive_directory_iterator(szSingleDrive, iter_options)) { if (fs::is_regular_file(p.path())) { std::cout << p.path().string() << std::endl; } } } catch (const fs::filesystem_error& e) { std::cerr << "遍历出错:" << e.what() << std::endl; } // 指针偏移移到外层循环末尾,处理完当前驱动器再切换下一个 szSingleDrive += strlen(szSingleDrive) + 1; } } return 0; }
核心修复点:
- 移除了删除驱动器路径末尾反斜杠的代码,确保传入路径为盘符根目录
- 调整驱动器指针偏移代码的位置到外层循环末尾,保证单个驱动器遍历完成后再切换下一个
- 新增权限跳过配置和异常捕获逻辑,避免程序因访问受限提前终止
内容的提问来源于stack exchange,提问作者Sad1que
相关产品推荐
相关产品推荐

