std::filesystem::space 返回的 available 字段才是普通进程实际可写空间,free 包含保留块等不可用部分;调用前须校验路径有效性并捕获异常,推荐用 canonical(p).root_path() 获取卷根路径。

std::filesystem::space 返回值的含义容易误解
调用 std::filesystem::space 得到的是 std::filesystem::space_info 结构体,包含三个字段:capacity、free 和 available。很多人误以为 free 就是“可用剩余空间”,但其实 available 才是普通用户进程实际能写入的空间(考虑了 reserved blocks、quota、权限等限制)。Linux 上 root 用户能看到更多 free,而普通进程受 available 约束;Windows 下二者通常相等,但也不能假设恒等。
调用前必须检查路径是否有效且可访问
传入无效路径(如不存在、无读权限、跨挂载点失败)会导致抛出 std::filesystem::filesystem_error。不能只靠返回值判断,必须捕获异常或先用 std::filesystem::exists + std::filesystem::is_directory 做前置校验。尤其注意:传入文件路径时,space 检查的是该文件所在卷的根设备,不是文件本身所在目录的逻辑空间(即不支持“目录配额”这类语义)。
- 正确做法:用
std::filesystem::path("/").parent_path()或直接传"/"(Linux/macOS)或"C:/"(Windows)来明确目标卷 - 错误写法:传
"./data/temp.txt"且未处理异常,程序可能崩溃 - 跨平台建议:用
std::filesystem::canonical(p).root_path()获取卷根路径再调用space
Windows 下需链接额外库并注意路径格式
MSVC 默认启用 std::filesystem,但需链接 libcpmt.lib(多线程静态)或对应动态版本;MinGW-w64 则常需显式加 -lstdc++fs 链接器选项。更重要的是路径格式:传 "C:" 可能失败,必须用 "C:/" 或 "C:\" —— 单个冒号不构成合法卷根。若传入 UNC 路径(如 "\servershare"),部分 Windows 版本可能返回零值或抛异常,应降级为本地驱动器检测。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
try {
auto s = std::filesystem::space("C:/");
std::cout <h3>单位是字节,大容量下注意整数溢出和显示精度</h3><p><code>space_info</code> 的三个字段都是 <code>std::uintmax_t</code>,在 32 位系统上仍是 64 位,一般不会溢出,但做除法转换为 GiB 时若用 <code>int</code> 或 <code>long</code> 中间变量会截断。推荐统一用 <code>static_cast<double></double></code> 转换后再除以 <code>1024.0 * 1024.0 * 1024.0</code>。另外,<code>available</code> 可能比 <code>free</code> 小得多(例如 ext4 默认保留 5% 空间给 root),这个差值不是 bug,是设计行为。</p>
- 安全转换示例:
double avail_gib = static_cast<double>(s.available) / (1024.0 * 1024.0 * 1024.0)</double> - 避免:
s.available / 1073741824(整数除法丢精度) - 注意:某些嵌入式或旧文件系统(如 FAT32)可能不支持精确
available,返回值与free相同
别忘了 available 才是你真正能写的量,而且它永远 ≤ free;异常不是边缘情况,是常态,尤其在容器、CI 环境或受限沙箱里。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










