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

如何用C++编写程序获取同目录下文件夹的名称与大小

C++实现:列出可执行文件所在目录的所有文件夹及其大小

嘿,刚好帮你搞定这个需求!下面是一个完整的C实现,用了C17的filesystem库(现在主流编译器都支持,不用愁兼容性),能准确列出可执行文件所在目录下的所有子文件夹,还会递归计算每个文件夹的总大小(包括里面的子文件夹和文件)。

核心思路

  • 先定位到可执行文件所在的目录(不是当前工作目录,这点很关键)
  • 遍历该目录下的所有条目,筛选出文件夹
  • 递归计算每个文件夹的总大小,处理可能的权限异常
  • 把大小转换成更易读的单位(KB/MB/GB)输出

完整代码

#include <iostream>
#include <filesystem>
#include <string>
#include <stdexcept>

namespace fs = std::filesystem;

// 递归计算文件夹总大小(单位:字节)
uintmax_t calculate_folder_size(const fs::path& folder_path) {
    uintmax_t total_size = 0;
    try {
        for (const auto& entry : fs::recursive_directory_iterator(folder_path)) {
            if (entry.is_regular_file()) {
                total_size += entry.file_size();
            }
        }
    } catch (const fs::filesystem_error& e) {
        std::cerr << "警告:无法访问文件夹 " << folder_path << ":" << e.what() << std::endl;
    }
    return total_size;
}

// 将字节数转换为易读的字符串(KB/MB/GB)
std::string format_size(uintmax_t bytes) {
    const double kb = 1024.0;
    const double mb = kb * 1024.0;
    const double gb = mb * 1024.0;

    if (bytes >= gb) {
        return std::to_string(bytes / gb) + " GB";
    } else if (bytes >= mb) {
        return std::to_string(bytes / mb) + " MB";
    } else if (bytes >= kb) {
        return std::to_string(bytes / kb) + " KB";
    } else {
        return std::to_string(bytes) + " Bytes";
    }
}

int main(int argc, char* argv[]) {
    // 获取可执行文件所在的目录
    fs::path exe_path = fs::absolute(fs::path(argv[0])).parent_path();
    std::cout << "正在扫描目录:" << exe_path << "\n\n";

    std::cout << "文件夹名称\t\t总大小\n";
    std::cout << "-----------------------------------------\n";

    try {
        for (const auto& entry : fs::directory_iterator(exe_path)) {
            if (entry.is_directory() && !entry.is_symlink()) { // 跳过符号链接(可选)
                std::string folder_name = entry.path().filename().string();
                uintmax_t size = calculate_folder_size(entry.path());
                std::cout << folder_name << "\t\t" << format_size(size) << "\n";
            }
        }
    } catch (const fs::filesystem_error& e) {
        std::cerr << "错误:无法访问目录 " << exe_path << ":" << e.what() << std::endl;
        return 1;
    }

    return 0;
}

关键细节说明

  • 定位可执行目录:用fs::absolute(fs::path(argv[0])).parent_path(),确保不管你从哪个路径运行程序,都能找到它本身所在的目录,而不是当前打开命令行的路径。
  • 递归计算大小:recursive_directory_iterator会自动遍历所有子文件夹,我们只需要累加普通文件的大小就行。
  • 异常处理:捕获filesystem_error,避免因为权限不足或者文件夹被删除导致程序崩溃,同时给出友好提示。
  • 大小格式化:把枯燥的字节数转换成KB/MB/GB,看起来更直观。

编译与使用

  • Windows(MSVC编译器):打开命令提示符,进入代码所在目录,执行:
    cl /std:c++17 folder_size.cpp
    
  • Linux/macOS(GCC/Clang):在终端执行:
    g++ -std=c++17 folder_size.cpp -o folder_size
    
  • 使用:把编译好的可执行文件(folder_size.exe或folder_size)放到你想扫描的文件夹里,双击运行或者在命令行执行,就能看到结果了。

自定义扩展

要是你有额外需求,比如:

  • 跳过隐藏文件夹:在判断目录的地方加!fs::is_hidden(entry)
  • 只显示大于某个大小的文件夹:在输出前加if (size > 1024*1024)(比如只显示大于1MB的)
  • 输出更精确的小数:修改format_size里的std::to_string为printf风格的格式化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:49:23