在C++项目开发中,统计指定文件夹下所有文件的总大小是一个常见的功能需求,比如磁盘空间占用分析、文件备份前的容量校验等场景都需要用到这个功能。C++17标准新增的filesystem库提供了便捷的目录遍历能力,其中recursive_directory_iterator可以递归遍历文件夹下的所有内容,结合文件属性查询接口就能高效完成文件总大小的统计。

前置知识准备
要使用recursive_directory_iterator,首先需要确保你的编译环境支持C++17及以上标准,常见的GCC 8+、Clang 7+、MSVC 2017及以上版本都支持该特性。使用时需要包含对应的头文件:
#include <filesystem> #include <iostream> #include <cstdint> // 引入filesystem命名空间,简化代码书写 namespace fs = std::filesystem;
核心实现逻辑
统计文件夹总大小的核心思路分为三步:
- 使用
recursive_directory_iterator创建目录迭代器,遍历目标文件夹下的所有条目 - 判断每个条目是否为普通文件,排除目录、符号链接等非文件类型
- 如果是普通文件,调用
file_size方法获取文件大小并累加到总计数中
完整代码示例
下面是实现文件夹总大小统计的完整代码:
#include <filesystem>
#include <iostream>
#include <cstdint>
#include <system_error>
namespace fs = std::filesystem;
/**
* 统计指定文件夹下所有文件的总大小
* @param dir_path 目标文件夹路径
* @return 总大小,单位字节,失败返回0
*/
std::uintmax_t get_folder_total_size(const fs::path& dir_path) {
std::uintmax_t total_size = 0;
// 检查路径是否存在且是目录
if (!fs::exists(dir_path) || !fs::is_directory(dir_path)) {
std::cerr << "路径不存在或不是目录: " << dir_path << std::endl;
return 0;
}
try {
// 创建递归目录迭代器,遍历所有子条目
for (const auto& entry : fs::recursive_directory_iterator(dir_path)) {
// 判断当前条目是否为普通文件
if (fs::is_regular_file(entry.status())) {
// 获取文件大小并累加
total_size += fs::file_size(entry.path());
}
}
} catch (const fs::filesystem_error& e) {
// 处理遍历过程中的权限错误等异常
std::cerr << "遍历目录出错: " << e.what() << std::endl;
return 0;
}
return total_size;
}
int main() {
// 测试路径,可以替换为实际需要统计的文件夹路径
fs::path test_dir = "./test_folder";
std::uintmax_t size = get_folder_total_size(test_dir);
if (size > 0) {
std::cout << "文件夹总大小: " << size << " 字节" << std::endl;
// 转换为MB输出
double size_mb = static_cast<double>(size) / (1024 * 1024);
std::cout << "文件夹总大小: " << size_mb << " MB" << std::endl;
}
return 0;
}
关键接口说明
| 接口名称 | 功能说明 |
|---|---|
| recursive_directory_iterator | 递归遍历目录下的所有条目,包括子目录中的内容,构造时传入目标目录路径即可 |
| is_regular_file | 判断指定路径对应的条目是否为普通文件,排除目录、符号链接、设备文件等类型 |
| file_size | 获取普通文件的大小,单位为字节,传入文件路径作为参数,失败时抛出异常 |
| exists | 判断路径是否存在,避免传入无效路径导致遍历失败 |
常见问题处理
权限不足问题
遍历系统目录或没有读取权限的目录时,会抛出filesystem_error异常,上面的代码已经通过try-catch块捕获了这类异常,你可以根据实际需求调整异常处理逻辑,比如记录日志或者跳过无权限的目录。
符号链接处理
默认情况下recursive_directory_iterator不会跟随符号链接进入指向的目录,如果你需要统计符号链接指向的文件大小,可以在构造迭代器时传入fs::directory_options::follow_directory_symlink参数:
// 跟随符号链接遍历
for (const auto& entry : fs::recursive_directory_iterator(dir_path, fs::directory_options::follow_directory_symlink)) {
// 遍历逻辑
}
大文件大小溢出问题
file_size的返回类型是uintmax_t,通常是64位无符号整数,最大可以表示约16EB的大小,对于绝大多数场景都不会出现溢出问题,累加时使用同类型变量即可保证计算正确。
编译运行说明
如果使用GCC编译,需要添加-lstdc++fs参数(GCC 9及以上版本不需要该参数),或者使用-std=c++17指定C++17标准:
g++ -std=c++17 main.cpp -o file_size_stat ./file_size_stat
如果是MSVC环境,直接在项目属性中设置C++语言标准为C++17即可正常编译运行。
C++recursive_directory文件大小统计文件夹遍历修改时间:2026-06-21 09:45:29