游乐游手机版
首页/编程语言/文章详情

C++如何获取文件夹大小 _ 递归遍历与file_size函数【实战】

时间:2026-05-05 06:05
C++如何获取文件夹大小:递归遍历与file_size函数实战 使用 std::filesystem::file_size 前必须检查文件类型 直接对目录路径调用 std::filesystem::file_size 会抛出 std::filesystem::filesystem_error 异常,

C++如何获取文件夹大小:递归遍历与file_size函数实战

C++如何获取文件夹大小 _ 递归遍历与file_size函数【实战】

使用 std::filesystem::file_size 前必须检查文件类型

直接对目录路径调用 std::filesystem::file_size 会抛出 std::filesystem::filesystem_error 异常,提示“No such file or directory”或“Invalid argument”。这并非路径错误,而是因为该函数仅适用于普通文件。因此,在获取文件大小前,务必使用 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:RecyclerC:System Volume Information),这些目录即使拥有管理员权限也常被拒绝访问

在实际开发中,建议首次遍历时启用 --dry-run 模式,仅统计可访问的子项数量,评估可行性后再决定是否进行完整的文件夹大小计算。

来源:https://www.php.cn/faq/2318541.html
上一篇php for循环语句 _ PHP for循环语句的三种表达式与循环控制break和continue使用 下一篇c++如何解析Subtitle字幕文件中的时间偏移参数【实战】
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
CentOS与Golang打包常见兼容性问题探讨
编程语言 · 2026-07-01

CentOS与Golang打包常见兼容性问题探讨

CentOS与Golang打包的兼容性问题集中在glibc版本不匹配、交叉编译环境变量错误、依赖库缺失及Go依赖管理不规范。可通过Docker容器编译、选择兼容Go版本、正确设置GOOS GOARCH环境变量、安装对应开发包及使用GoModules解决。

CentOS中Fortran与Python如何协同工作从入门到实战完整教程
编程语言 · 2026-07-01

CentOS中Fortran与Python如何协同工作从入门到实战完整教程

在CentOS中,Fortran与Python可通过f2py、SWIG、共享库调用或subprocess协同。f2py封装Fortran为Python模块,支持数组运算;共享库需手动对齐数据类型;系统调用适合独立计算。

CentOS中Golang打包优化方法
编程语言 · 2026-07-01

CentOS中Golang打包优化方法

在CentOS中优化Golang编译打包,可显著提升编译速度并减小二进制文件体积。关键技巧包括:设置环境变量、使用Go模块管理依赖、编译时添加-ldflags= "-s-w "去除调试信息、利用UPX工具压缩、运行strip清理符号表,以及优化cgo内C代码的编译选项。综合运用这些方法能有效优化最终程序。

在CentOS系统中cpustat与其他工具协同使用的完整方法
编程语言 · 2026-07-01

在CentOS系统中cpustat与其他工具协同使用的完整方法

cpustat作为sysstat包的CPU监控工具,可通过管道与grep等命令配合过滤数据,利用脚本自动记录带时间戳的日志,或结合图形工具查看,也可格式化输出后接入Zabbix、Grafana等Web监控系统,实现可视化与告警。

CentOS中readdir与其他Linux发行版的差异
编程语言 · 2026-07-01

CentOS中readdir与其他Linux发行版的差异

CentOS基于RHEL,与Ubuntu、Debian、Fedora在包管理器(yum dnfvsapt)、默认文件系统(XFSvsext4)等存在差异,但readdir等系统调用遵循POSIX标准,行为一致。