如何用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
相关产品推荐
相关产品推荐

