std::filesystem::space 返回-1或抛异常的最常见原因是路径无效或无访问权限;windows需用"c:"或"c:/"等带尾部分隔符的驱动器路径,linux/macos需确保挂载点存在且有读取权限。

直接用 std::filesystem::space 就能拿到,但 Windows 上需注意驱动器路径格式,Linux/macOS 则要确保挂载点存在且有权限。
为什么 std::filesystem::space 返回 -1 或抛异常?
最常见原因是路径无效或无访问权限:
-
std::filesystem::space接收的是路径(std::filesystem::path),不是卷标(如 "C:")或设备名(如 "/dev/sda1");传入"C:"在 Windows 下可能失败,必须用"C:\"或"C:/" - Linux/macOS 下若传入未挂载的目录(如
"/mnt/usb"但 U 盘没插)、或当前用户无读取权限(如"/root"),会抛std::filesystem::filesystem_error - 某些容器环境或 chroot 中,
/proc/mounts不可用,space可能 fallback 到 statvfs 失败
Windows 下获取 C 盘可用空间的正确写法
关键在路径末尾的分隔符——不能省略,否则 std::filesystem::space 可能解析为相对路径或报错:
#include <filesystem>
#include <iostream>
int main() {
try {
// ✅ 正确:带尾部反斜杠或正斜杠
auto s = std::filesystem::space("C:\");
std::cout
<p>注意:<code>s.available</code> 是“当前用户可写入的字节数”,不是磁盘总空闲空间(<code>s.free</code> 才是所有空闲字节,含 root 预留)。</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master"><img
src="https://img.php.cn/upload/skill/000/000/081/179051228971575.jpg" alt="C++ Code Review Master" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="overflowclass">C++ Code Review Master</a>
<p class="overflowclass">组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。</p>
</div>
<a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
<h3>
<code>space</code> 返回值中 <code>capacity</code>、<code>free</code>、<code>available</code> 的区别</h3>
<p>三者单位都是字节,但语义不同,尤其在启用了配额或预留空间的系统上:</p>
<ul>
<li>
<code>capacity</code>:文件系统总容量(等价于 <code>df -B1 /path | tail -1 | awk '{print $2}'</code>)</li>
<li>
<code>free</code>:未被任何文件占用的空闲字节(包括 root 预留空间,<code>df</code> 的 “Available” 列不包含它)</li>
<li>
<code>available</code>:当前进程实际能写入的最大字节数(扣除了 reserved blocks 和 user quotas)——这才是你真正该检查的值</li>
</ul>
<p>例如:某 ext4 分区 <code>free = 10GB</code>,但 <code>available = 9.5GB</code>,因为 5% 被 root 预留;程序用 <code>available</code> 判断是否够写一个 9.8GB 文件,才不会中途因 ENOSPC 失败。</p>
<p>跨平台代码里别假设 <code>free == available</code>;Windows NTFS 默认无预留,但启用配额后也会分化。真实场景中,只依赖 <code>available</code> 做空间判断最安全。</p></iostream></filesystem>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










