c++中如何使用std::filesystem::space_c++获取磁盘剩余空间【实例】

std::filesystem::space() 返回 std::filesystem::space_info 类型,含 capacity、free、available 三成员;available 表示当前进程真实可用字节数,受权限和预留空间限制,通常 ≤ free。

std::filesystem::space 返回什么类型?

std::filesystem::spac

e 是一个结构体,不是函数。真正调用的是 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 写错,而是环境和路径问题:

  • 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),频繁调用没必要;另外,availablefree 的差值在某些文件系统上可能很大,别默认用 free 做判断逻辑。