
std::filesystem::space 返回什么类型?
std::filesystem::space 是一个结构体,不是函数。真正调用的是 std::filesystem::space() 这个函数,它返回 std::filesystem::space_info 类型的对象,包含三个成员:capacity(总容量)、free(可用字节数)、available(当前进程可写入的字节数,通常 ≤ free,受权限和预留空间影响)。
注意:available 才是“用户真正能用的剩余空间”,比如 root 用户可能看到更多 free,但普通用户受限于 reserved blocks(如 ext4 默认保留 5%),available 会更小。
基本用法:获取根目录或指定路径的剩余空间
必须传入一个有效的路径(std::filesystem::path),不能直接传字符串字面量;C++17 起需链接 -lstdc++fs(GCC)或启用 /std:c++17(MSVC)。
- 路径不存在或无权限访问时,抛出
std::filesystem::filesystem_error - Windows 下支持驱动器根路径(如
"C:/"),Linux/macOS 下建议用"/"或挂载点(如"/home") - 避免传空路径或相对路径(如
"./"),行为依赖当前工作目录且易出错
include#include int main() { try { auto info = std::filesystem::space("/"); // Linux/macOS 根分区 // auto info = std::filesystem::space("C:/"); // Windows std::cout << "Available: " << info.available << " bytes\n"; std::cout << "Free: " << info.free << " bytes\n"; std::cout << "Capacity: " << info.capacity << " bytes\n"; } catch (const std::filesystem::filesystem_error& e) { std::cerr << "Error: " << e.what() << '\n'; } }
常见错误:为什么总是得到 0 或抛异常?
最常踩的坑不是 API 写错,而是环境和路径问题:
立即学习“C++免费学习笔记(深入)”;
-
std::filesystem::space()在某些旧版 libc++ 或 MinGW 上不完全支持,确认编译器版本 ≥ GCC 8 / Clang 7 / MSVC 2017 15.7 - 路径字符串未正确转义:Windows 下写
"C:\\"会被解释为C:,必须用"C:/"或R"(C:\)" - 容器或 CI 环境中挂载路径不可见(如 Docker 未挂载
/proc/mounts),space()可能 fallback 到错误值或失败 - 没捕获异常,程序直接 terminate —— 必须用
try/catch包裹,不能假设路径一定有效
如何安全地显示人类可读的剩余空间?
直接打印字节不直观,建议做单位换算,但注意别用 double 做整数除法丢失精度;同时优先显示 available(真实可用)而非 free。
auto format_bytes(uintmax_t bytes) -> std::string {
static const char* units[] = {"B", "KB", "MB", "GB", "TB"};
double size = static_cast(bytes);
int unit = 0;
while (size >= 1024.0 && unit < 4) {
size /= 1024.0;
++unit;
}
return std::to_string(static_cast(size * 100) / 100.0) + units[unit];
}
// 使用:
if (auto info = std::filesystem::space("/"); info.available > 0) {
std::cout << "Available: " << format_bytes(info.available) << '\n';
}
磁盘空间计算本身很快,但 space() 底层会触发系统调用(如 statvfs),频繁调用没必要;另外,available 和 free 的差值在某些文件系统上可能很大,别默认用 free 做判断逻辑。











