如何用递归查找系统所有目录并定位C盘最大文件夹(含sys)
基于C++实现系统目录递归遍历与最大文件夹查找
一、递归查找系统所有目录
基于你提供的代码框架,我们可以扩展出递归遍历所有目录的功能。核心逻辑是遍历目标路径下的所有条目,遇到目录时先输出路径,再递归进入该目录继续遍历:
#include <iostream> #include <string> #include <filesystem> using namespace std; using namespace std::tr2::sys; // 递归遍历并输出所有目录 void listAllDirectories(const string& rootFolder) { path folderPath(rootFolder); if (!exists(folderPath) || !is_directory(folderPath)) { cerr << "路径无效或不是目录: " << rootFolder << endl; return; } try { // 输出当前目录 cout << "目录: " << folderPath << endl; directory_iterator end_itr; for (directory_iterator dirIte(rootFolder); dirIte != end_itr; ++dirIte) { path entryPath = complete(dirIte->path(), folderPath); if (is_directory(dirIte->status())) { // 递归遍历子目录 listAllDirectories(entryPath.string()); } } } catch (const exception& e) { cerr << "访问目录失败: " << rootFolder << " 错误信息: " << e.what() << endl; } } int main() { // 从C:\开始遍历所有目录 listAllDirectories("C:\\"); return 0; }
关键点说明
- 每次进入目录时先输出当前路径,确保所有层级的目录都被记录
- 增加了路径有效性检查,避免传入非目录路径导致错误
- 保留异常捕获,处理系统目录权限限制等访问失败的情况
二、查找C:\下最大的文件夹
要实现这个功能,我们需要计算每个文件夹的总大小,并实时记录当前找到的最大文件夹信息。可以基于你的getFoldersize函数改造,同时用pair保存文件夹的路径和大小:
#include <iostream> #include <string> #include <filesystem> #include <utility> using namespace std; using namespace std::tr2::sys; // 计算单个文件夹的总大小(包含所有子文件和子目录) unsigned long long calculateFolderSize(const string& folderPath) { unsigned long long totalSize = 0; path dirPath(folderPath); if (!exists(dirPath) || !is_directory(dirPath)) { return 0; } try { directory_iterator end_itr; for (directory_iterator dirIte(folderPath); dirIte != end_itr; ++dirIte) { path entryPath = complete(dirIte->path(), dirPath); if (!is_directory(dirIte->status())) { // 累加文件大小 totalSize += file_size(entryPath); } else { // 递归计算子目录大小 totalSize += calculateFolderSize(entryPath.string()); } } } catch (const exception& e) { cerr << "无法访问条目: " << folderPath << " 错误信息: " << e.what() << endl; } return totalSize; } // 递归查找最大文件夹 void findLargestFolder(const string& rootFolder, pair<string, unsigned long long>& largest) { path dirPath(rootFolder); if (!exists(dirPath) || !is_directory(dirPath)) { return; } try { // 计算当前文件夹的大小 unsigned long long currentSize = calculateFolderSize(rootFolder); // 更新最大文件夹记录 if (currentSize > largest.second) { largest.first = rootFolder; largest.second = currentSize; } // 递归遍历子目录 directory_iterator end_itr; for (directory_iterator dirIte(rootFolder); dirIte != end_itr; ++dirIte) { path entryPath = complete(dirIte->path(), dirPath); if (is_directory(dirIte->status())) { findLargestFolder(entryPath.string(), largest); } } } catch (const exception& e) { cerr << "访问目录失败: " << rootFolder << " 错误信息: " << e.what() << endl; } } int main() { // 初始化最大文件夹记录:路径为空,大小为0 pair<string, unsigned long long> largestFolder = {"", 0}; // 从C:\开始查找 findLargestFolder("C:\\", largestFolder); // 输出结果 cout << "最大的文件夹是: " << largestFolder.first << endl; cout << "总大小: " << largestFolder.second << " 字节 (" << static_cast<double>(largestFolder.second) / (1024 * 1024 * 1024) << " GB)" << endl; return 0; }
关键点说明
- 单独封装计算文件夹大小的函数:
calculateFolderSize负责递归计算单个文件夹的总大小,避免重复代码 - 用pair记录最大文件夹:第一个元素存路径,第二个元素存大小,遍历过程中实时更新最大值
- 处理系统目录权限问题:保留异常捕获,遇到无法访问的目录时输出错误信息并继续遍历其他目录
- 大小单位转换:输出时将字节转换为GB,更直观展示结果
注意事项
- 遍历C盘会耗时较长,尤其是包含大量文件的系统目录,建议在测试时先选择小目录验证功能
- 部分系统目录(如
C:\Windows\System32的部分子目录)可能因权限限制无法访问,程序会输出错误信息但不会终止 - 你的代码使用的
std::tr2::sys是C17之前的filesystem实验性实现,如果使用C17及以上版本,建议切换到标准的std::filesystem,只需修改命名空间为std::filesystem即可
内容的提问来源于stack exchange,提问作者CyberMavka
相关产品推荐
相关产品推荐

