当前位置: 首页
编程语言
C++如何获取文件夹大小 _ 递归遍历与file_size函数【实战】

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

热心网友 时间:2026-05-05
转载

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

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
Debian PHP如何使用框架

Debian PHP如何使用框架

在 Debian 上使用 PHP 框架的标准流程 想在 Debian 系统上顺利跑起一个现代化的 PHP 框架吗?无论是 Lara vel、Symfony,还是 ThinkPHP、CakePHP,标准化的部署流程其实大同小异。核心步骤通常包括:安装 PHP 环境与必备扩展、配置 Composer 依

时间:2026-05-05 13:08
Debian PHP兼容性怎样

Debian PHP兼容性怎样

Debian 上 PHP 的兼容性概览 在 Debian 环境下,PHP 的兼容性表现通常相当稳健。这背后的原因不难理解:通过官方的 APT 仓库,或者选择性地添加由 Ondřej Surý 维护的第三方仓库,你获得的都是与 Debian 系统库深度集成、经过充分测试的打包版本。再配合 PHP-FP

时间:2026-05-05 13:08
Debian下如何配置Golang环境变量

Debian下如何配置Golang环境变量

在Debian系统下配置Golang环境变量 想在Debian系统里顺利使用Golang,环境变量的配置是绕不开的一步。这事儿其实不复杂,核心就是编辑一下用户目录下的配置文件,比如 ~ bashrc 或者 ~ profile。下面咱们就以最常用的 ~ bashrc 为例,把整个配置过程拆解清楚

时间:2026-05-05 13:08
Debian编译Golang时如何避免错误

Debian编译Golang时如何避免错误

在Debian系统上编译Golang时如何避免错误 在Debian环境下手动编译安装Golang,其实是个挺直接的过程,但有几个关键步骤如果没做到位,就很容易踩坑。下面这份操作指南,能帮你绕开那些常见的编译错误,顺利把环境搭起来。 1 确保系统已更新 第一步千万别省:在动手之前,务必先让你的Deb

时间:2026-05-05 13:07
Debian下如何监控Golang应用性能

Debian下如何监控Golang应用性能

Debian下监控Golang应用性能 一 方案总览 在 Debian 环境中构建一套完整的 Golang 应用可观测性体系,通常建议采用“指标 + 剖析 + 日志 + 追踪”的组合拳。这套组合能让你从宏观到微观,全方位把握应用的运行状态。 指标:这是监控的基石。借助 Prometheus 采集应用

时间:2026-05-05 13:07
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜
热门教程
更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程