std::filesystem::space 返回 -1 是误判,实际会抛 filesystem_error 异常;原因包括路径无效、权限不足或挂载点不存在;capacity/free/available 均为字节单位,available 表示当前用户实际可用空间。

直接用 std::filesystem::space,但必须传入有效路径(如根目录),且需确认编译器支持 C++17 并启用 std::filesystem 链接。
为什么 std::filesystem::space 返回 -1 或抛异常?
常见原因是路径无效或权限不足。比如传入空字符串、不存在的挂载点,或在 Windows 上访问被策略限制的驱动器(如某些企业环境禁用 C: 的磁盘查询)。
- 确保路径是已挂载的目录(推荐用
"C:/"(Windows)或"/"(Linux/macOS)) - 检查编译选项:GCC/Clang 需加
-lstdc++fs;MSVC 2017+ 默认支持,但项目属性中要设为 C++17 或更高 - 捕获异常:
std::filesystem::space在出错时抛std::filesystem::filesystem_error,不返回 -1 —— 返回 -1 通常是手误写了未初始化的变量或调用了错误重载
space_info 三个字段的实际含义和单位
capacity、free、available 全部以字节(bytes)为单位,类型是 uintmax_t。它们不是“四舍五入后的整数”,而是精确值,但要注意:
-
capacity= 磁盘总容量(含系统保留空间) -
free= 所有未分配空间(包括 root 保留区),普通用户不可用的部分也计入 -
available= 当前用户实际可写入的空间(扣除 reserved blocks、quota 限制等),日常判断“还能存多少文件”应优先看它 - Linux 下若启用了配额(quota),
available可能远小于free;Windows 通常三者接近,但 BitLocker 加密卷或存储感知(Storage Sense)启用时可能临时压缩可用值
跨平台写法示例与关键检查点
下面这段代码在 GCC 11+、Clang 12+、MSVC 2019 Update 16.10+ 上可直接运行:
#include <filesystem>
#include <iostream>
int main() {
try {
auto path = std::filesystem::path("/"); // Linux/macOS
// auto path = std::filesystem::path("C:/"); // Windows
auto info = std::filesystem::space(path);
std::cout
<ul>
<li>不要用 <code>std::filesystem::current_path()</code> 作为参数——当前路径可能在 RAM disk 或网络挂载点,导致结果非预期</li>
<li>Windows 上路径末尾斜杠不能省略(<code>"C:"</code> 是无效路径,<code>"C:/"</code> 或 <code>"C:\"</code> 才行)</li>
<li>Linux/macOS 下 <code>"/"</code> 安全;若想查特定挂载点(如 <code>/home</code>),需确保该路径存在且可访问</li>
</ul>
<p>真正容易被忽略的是:即使 <code>std::filesystem::space</code> 成功返回,<code>available</code> 值也可能在几毫秒后失效——它不带缓存,每次调用都是 syscall。高频轮询时要考虑开销,且不要把它当作“写入前的绝对保证”。</p></iostream></filesystem>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











