You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用递归查找系统所有目录并定位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;
}

关键点说明

  1. 单独封装计算文件夹大小的函数:calculateFolderSize负责递归计算单个文件夹的总大小,避免重复代码
  2. 用pair记录最大文件夹:第一个元素存路径,第二个元素存大小,遍历过程中实时更新最大值
  3. 处理系统目录权限问题:保留异常捕获,遇到无法访问的目录时输出错误信息并继续遍历其他目录
  4. 大小单位转换:输出时将字节转换为GB,更直观展示结果

注意事项

  • 遍历C盘会耗时较长,尤其是包含大量文件的系统目录,建议在测试时先选择小目录验证功能
  • 部分系统目录(如C:\Windows\System32的部分子目录)可能因权限限制无法访问,程序会输出错误信息但不会终止
  • 你的代码使用的std::tr2::sys是C17之前的filesystem实验性实现,如果使用C17及以上版本,建议切换到标准的std::filesystem,只需修改命名空间为std::filesystem即可

内容的提问来源于stack exchange,提问作者CyberMavka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 01:10:33