c++oding="utf-8" ?>
应优先使用std::filesystem::space获取available字段判断可用空间,因其反映当前进程实际可写入字节数;需规范路径、捕获异常,并注意跨平台差异及文件系统语义差异。

用 std::filesystem::space 获取剩余空间最直接
它返回一个 std::filesystem::space_info 结构体,包含 capacity、free 和 available 三个字段。注意:free 是磁盘上未被占用的字节数,available 是当前进程实际可写入的字节数(受用户配额、保留空间等影响),日常判断是否够用应优先看 available。
基本用法很简单:
#include <filesystem>
#include <iostream><p>namespace fs = std::filesystem;</p>
<p>int main() {
auto space_info = fs::space("/"); // Linux/macOS;Windows 用 "C:/"
std::cout </p></iostream></filesystem>
但必须确保编译器支持 C++17 且启用了文件系统支持(如 GCC 需加 -lstdc++fs 链接选项)。
路径参数传错会抛 std::filesystem::filesystem_error
常见错误包括:路径不存在、无读取权限、传入了相对路径但当前工作目录不可靠、或在 Windows 上用了反斜杠没转义(如 "C: emp" 会被解释为 C:(tab)emp)。
安全做法是:
- 用
fs::absolute()或fs::weakly_canonical()规范路径,再传给space() - 始终用
try/catch捕获std::filesystem::filesystem_error - Windows 下推荐用正斜杠或双反斜杠:
"C:/"或"C:\\"
示例:
try {
auto path = fs::weakly_canonical("C:/");
auto s = fs::space(path);
if (s.available == static_cast<uintmax_t>(-1)) {
// 表示无法获取信息(比如 NFS 挂载点不支持)
}
} catch (const fs::filesystem_error& e) {
std::cerr <h3>
<code>available</code> 和 <code>free</code> 差值大?可能是 root 保留空间或配额限制</h3>
<p>Linux ext4 默认为 root 用户保留 5% 空间,普通用户看不到这部分,所以 <code>available 是正常现象。macOS APFS、Windows NTFS 也可能因配额策略导致二者不等。</code></p>
<p>判断“是否足够”时,别只看 <code>free</code> —— 如果你的程序以普通用户运行,<code>available</code> 才是真实上限。例如写入 2GB 文件前,应检查:</p>
<pre class="brush:php;toolbar:false;">if (space_info.available <p>注意用 <code>ULL</code> 后缀避免整型溢出;<code>uintmax_t</code> 通常是 <code>unsigned long long</code>,但不保证所有平台都一样。</p><h3>跨平台编译时要注意标准库实现差异</h3><p>MSVC 从 VS2019 16.10 起对 <code>std::filesystem::space</code> 的 Windows 实现较稳定;GCC 11+ 在 Linux 下表现良好,但 GCC 9/10 对某些网络文件系统(如 CIFS)可能返回 <code>-1</code>;Clang + libc++ 目前不完全支持 <code>space()</code>(会抛 <code>not_implemented</code> 异常)。</p><p>如果目标环境不确定,建议:</p>
- 先
fs::exists(path) && fs::is_directory(path)做前置校验 - 把
space()当作“尽力而为”的辅助手段,关键逻辑仍需配合写入试探或 errno 检查 - 不要依赖
space_info.capacity做容量百分比计算——某些虚拟文件系统(如 /proc、/sys)会返回 0 或异常值
真正难处理的不是 API 调用本身,而是不同内核、挂载选项、权限模型下 available 的语义漂移。写监控工具或安装程序时,这点最容易漏测。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











