c++oding="utf-8" ?>
std::filesystem::space()返回的capacity、free、available单位均为字节;计算可用百分比需用available/capacity×100.0,且必须先校验capacity≠0并捕获filesystem_error异常。

std::filesystem::space() 返回的可用空间单位是什么?
它返回的是字节数,不是百分比。直接调用 std::filesystem::space() 得到的是 std::filesystem::space_info 结构体,包含 capacity、free、available 三个字段,单位全是字节。其中 available 是当前进程可实际写入的空间(考虑权限和预留),通常比 free 更准确;capacity 是总容量。
如何安全计算磁盘可用百分比?
必须检查 capacity 是否为 0,否则除零会触发未定义行为。Windows 下某些网络路径或特殊挂载点可能返回 0 容量;Linux 下符号链接指向无效路径也可能导致异常或零值。
- 先用
std::filesystem::exists()和std::filesystem::is_directory()验证路径有效 - 捕获
std::filesystem::filesystem_error异常(例如权限不足、路径不存在) - 用
available除以capacity,再乘以 100.0 得到 double 类型百分比 - 建议四舍五入到小数点后一位,避免浮点误差显示成 99.999999%
示例关键片段:
try {
auto space_info = std::filesystem::space(path);
if (space_info.capacity == 0) return -1.0; // 无效容量
double percent = static_cast<double>(space_info.available) / space_info.capacity * 100.0;
return std::round(percent * 10) / 10.0; // 保留一位小数
} catch (const std::filesystem::filesystem_error& e) {
// 处理路径错误或权限问题
return -1.0;
}</double>
为什么用 available 而不是 free?
free 表示文件系统级空闲空间,但普通用户进程可能因配额、预留空间或 root-only 预留块而无法使用全部;available 才是当前用户/进程实际能写入的字节数,对监控或预警更真实。比如 ext4 默认保留 5% 给 root,free 包含这部分,available 不包含。
在判断“是否快满”时,必须用 available —— 否则你会误判一个还有 5GB 可用(但普通用户只剩 100MB)的磁盘为“空间充足”。
跨平台兼容性要注意什么?
C++17 起 std::filesystem 是标准库,但 Windows 上需链接 libstdc++fs(GCC)或启用 /std:c++17(MSVC);macOS 10.15+ 支持完整功能,旧版本可能返回不准确值。另外:std::filesystem::space() 在某些 FAT32 或 exFAT 卷上可能不支持或返回 0。
如果目标环境不确定,建议 fallback 到平台 API:Windows 用 GetDiskFreeSpaceEx(),Linux/macOS 用 statvfs(),但那就脱离了纯 std::filesystem 范畴。
实际写的时候,别只盯着“怎么算百分比”,先确保路径合法、异常被捕获、零容量被防御——这些比公式本身更容易出错。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











