std::filesystem::space返回std::filesystem::space_info结构体,含capacity(总容量)、free(未分配字节数)、available(当前进程实际可写入字节数);其中available才是判断磁盘是否够用的可靠依据,因它已扣除保留空间、配额等限制。

std::filesystem::space 返回的是什么值
std::filesystem::space 返回一个 std::filesystem::space_info 结构体,包含三个字段:capacity(总容量)、free(剩余空间)、available(当前用户可用空间)。注意:free ≠ available —— 前者是文件系统未分配的块数,后者还要扣除 root 用户保留空间(如 ext4 默认保留 5%),普通用户能真正写入的只有 available。
调用 std::filesystem::space 的基本写法
必须传入一个有效路径(可以是目录或文件),且该路径需存在、可访问。常见错误是传入空字符串或不存在路径,会抛出 std::filesystem::filesystem_error。
示例:
#include <filesystem>
#include <iostream>
int main() {
try {
auto info = std::filesystem::space("/home");
std::cout << "Available: " << info.available << " bytes
";
} catch (const std::filesystem::filesystem_error& e) {
std::cerr << "Error: " << e.what() << '
';
}
}
- 路径必须是绝对路径或相对路径(但需确保当前工作目录下存在该路径)
- Windows 下可传
"C:\",注意转义或使用原始字符串R"(C:)" - Linux/macOS 下传
"/"获取根文件系统信息,而非挂载点本身
为什么获取到的 available 比预期小很多
这是最常被忽略的点:不同文件系统对“可用空间”的定义不同,且受权限和预留策略影响。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
立即学习“C++免费学习笔记(深入)”;
- ext4 等 Linux 文件系统默认为 root 保留 5% 空间,
available不包含这部分 - 如果进程以非 root 用户运行,即使
free很大,available可能已接近 0(例如磁盘满 + 保留空间耗尽) - 某些 NFS 或容器环境可能不支持完整 statvfs 语义,
available可能回退为free或返回 0 - macOS APFS 对硬链接、快照等有特殊处理,
available可能动态变化
跨平台兼容性与编译要求
std::filesystem 在 C++17 中标准化,但实际可用性依赖标准库实现:
- MSVC:16.2+ 默认启用,无需额外开关
- libstdc++(GCC):需链接
-lstdc++fs,且 GCC 9+ 才完全支持space() - libc++(Clang):需定义
_LIBCPP_ENABLE_CXX17_ABI并链接-lc++fs - 务必检查
__cpp_lib_filesystem宏,避免在不支持环境下编译通过但运行崩溃
真正容易出问题的是:你以为拿到了可用空间,结果在某台 CentOS 7 机器上因为旧版 libstdc++ 导致 available == 0 却没报错 —— 这种静默失败比异常更难排查。

















