C++如何获取文件夹大小 _ 递归遍历与file_size函数【实战】
C++如何获取文件夹大小:递归遍历与file_size函数实战 用 std::filesystem::file_size 需要先确认文件类型 直接对目录调用 std::filesystem::file_size 会抛出 std::filesystem::filesystem_error,错误信息通常
C++如何获取文件夹大小:递归遍历与file_size函数实战

用 std::filesystem::file_size 需要先确认文件类型
直接对目录调用 std::filesystem::file_size 会抛出 std::filesystem::filesystem_error,错误信息通常是 “No such file or directory” 或 “Invalid argument”,不是因为路径错,而是该函数只接受普通文件(regular file)。必须先用 is_regular_file() 判断,再用 is_directory() 分流处理。
常见误写:
auto size = file_size(path); // path 是文件夹?崩溃
正确做法是:遍历前先检查类型,跳过符号链接(除非你明确要追踪)、套接字、设备文件等非数据实体。
递归遍历目录必须手动控制栈或使用 recursive_directory_iterator
C++17 的 std::filesystem::recursive_directory_iterator 是最简方案,但它默认会进入符号链接指向的目标目录——这可能导致重复计数甚至无限循环。生产环境建议禁用符号链接跟随:
立即学习“C++免费学习笔记(深入)”;
- 构造时传入
std::filesystem::directory_options::skip_permission_denied避免因权限失败中断 - 显式检查
iter->is_symlink()并跳过,而不是依赖follow_symlinks = false(后者在部分标准库实现中行为不一致) - 注意:Windows 下 NTFS 符号链接和 junction point 表现不同,
is_symlink()对 junction 不返回 true,需额外判断is_directory()+status().type() == file_type::junction
累加过程中要注意 uintmax_t 溢出与 I/O 错误静默丢弃
std::filesystem::file_size 返回 uintmax_t,单个超大文件(如 >16TB)在某些平台可能溢出,但更常见的是权限不足或路径失效导致异常。不能假设每次 file_size() 都成功:
- 把
file_size()调用包在try/catch中,捕获std::filesystem::filesystem_error - 对失败项记录警告(比如输出到
std::cerr),但不要中断整个遍历 - 避免用
std::accumulate一类无异常处理的泛型算法,手写循环更可控
示例关键片段:
uintmax_t total = 0;
for (auto iter = fs::recursive_directory_iterator(root, opts); iter != fs::recursive_directory_iterator(); ++iter) {
if (iter->is_symlink()) continue;
if (fs::is_regular_file(iter->status())) {
try {
total += fs::file_size(iter->path());
} catch (const fs::filesystem_error&) {
std::cerr << "Skip unreadable file: " << iter->path().string() << "";
}
}
}
Windows 下长路径和特殊目录需要额外处理
Windows 默认路径长度限制为 260 字符,\? 前缀可绕过,但 std::filesystem 在 MSVC 19.28+ 才默认启用长路径支持。若遇到 filesystem_error 提示 “The system cannot find the path specified”,优先检查:
- 程序 manifest 是否声明
longPathAware=true - 注册表项
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlFileSystemLongPathsEnabled是否为 1 - 跳过系统保护目录(如
C:Recycler、C:System Volume Information),这些即使有管理员权限也常被拒绝访问
实际项目中,首次遍历建议加 --dry-run 模式,只统计可访问子项数量,再决定是否继续计算大小。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















