c++oding="utf-8" ?>
std::filesystem::space(path)返回挂载点磁盘空间信息,含capacity、free、available三字段,其中available≤free;路径应为有效挂载点,windows需用"c:"等规范写法。

std::filesystem::space 返回值的含义容易误解
调用 std::filesystem::space(path) 返回的是 std::filesystem::space_info 结构体,包含三个字段:capacity(总容量)、free(磁盘上未被任何文件占用的字节数)、available(当前进程可实际写入的字节数)。很多人误以为 free == available,但其实 available 通常 ≤ free —— 因为部分空间可能被系统保留(如 Linux 的 reserved blocks),或受用户配额限制。
路径参数必须指向挂载点,否则结果不可靠
std::filesystem::space() 的行为依赖底层 statvfs()(POSIX)或 GetDiskFreeSpaceEx()(Windows),这些 API 实际查询的是路径所在**文件系统挂载点**的信息。传入一个普通文件或深层子目录(如 "./data/cache/file.txt")不会报错,但返回值和该路径所在分区一致 —— 这本身没问题;但若路径不存在、权限不足或跨符号链接进入另一挂载点,就可能抛出 std::filesystem::filesystem_error 或返回错误值(如 static_cast<uintmax_t>(-1)</uintmax_t>)。
实操建议:
- 始终用
std::filesystem::absolute(path).root_path()或std::filesystem::canonical(path).parent_path()确保路径有效且稳定 - 在调用前检查路径是否存在且可访问:
std::filesystem::exists(path) && std::filesystem::is_directory(path) - 捕获异常并处理:常见错误信息包括
"Operation not permitted"(权限不足)、"No such file or directory"(路径无效)
Windows 下要注意驱动器根路径写法
Windows 没有 Unix 风格的挂载点概念,每个驱动器(如 C:、D:)是独立文件系统。直接传 "C:" 可能失败(某些标准库实现要求末尾带反斜杠),安全写法是 "C:" 或使用 std::filesystem::path("C:/")。MSVC 和 libstdc++/libc++ 在此行为基本一致,但早期 GCC 版本(如 9.2 前)对 "C:" 解析不统一。
示例正确调用:
try {
auto info = std::filesystem::space("C:\");
std::cout <h3>单位是字节,但显示时需注意整数溢出与可读性</h3><p><code>space_info</code> 所有字段类型都是 <code>uintmax_t</code>,在 64 位系统上通常是 <code>unsigned long long</code>。直接输出大数值(如 2TB ≈ 2,199,023,255,552)不易读,建议转换为 GiB(1024³)或 GB(1000⁹);但注意除法截断问题 —— 应先转为 <code>double</code> 再除,避免整数除法丢精度。</p><p>常见误区:</p>
- 用
info.capacity / 1024 / 1024 / 1024得到整数 GiB,会向下取整(如 999GB 显示为 0) - 误用
1000 * 1000 * 1000计算 GiB(应为1024ULL * 1024 * 1024) - 未检查
info.capacity == static_cast<uintmax_t>(-1)</uintmax_t>就直接计算,导致溢出
推荐做法:先验证字段非异常值,再转 double 计算并保留一两位小数。
真正麻烦的不是调用函数本身,而是判断“这个 available 值到底能不能信”——它取决于 OS、文件系统类型(ext4 vs NTFS vs APFS)、挂载选项(noatime、user_xattr)、甚至当前用户的磁盘配额设置。生产环境务必加异常兜底和日志记录,别只靠一次调用就做容量决策。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











