如何通过filesystem::space获取硬盘分区具体可用空间量?
- 内容介绍
- 文章标签
- 相关推荐
本文共计720个文字,预计阅读时间需要3分钟。
使用 `` 标签和 `` 标签,以下是修改后的开头内容:
为什么 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 << "可用字节: " << s.available << " "; // ✅ 也可用正斜杠(C++17 兼容) s = std::filesystem::space("C:/"); } catch (const std::filesystem::filesystem_error& e) { std::cerr << "获取失败: " << e.what() << " "; } }
注意:s.available 是“当前用户可写入的字节数”,不是磁盘总空闲空间(s.free 才是所有空闲字节,含 root 预留)。
立即学习“C++免费学习笔记(深入)”;
space 返回值中 capacity、free、available 的区别
三者单位都是字节,但语义不同,尤其在启用了配额或预留空间的系统上:
-
capacity:文件系统总容量(等价于df -B1 /path | tail -1 | awk '{print $2}') -
free:未被任何文件占用的空闲字节(包括 root 预留空间,df的 “Available” 列不包含它) -
available:当前进程实际能写入的最大字节数(扣除了 reserved blocks 和 user quotas)——这才是你真正该检查的值
例如:某 ext4 分区 free = 10GB,但 available = 9.5GB,因为 5% 被 root 预留;程序用 available 判断是否够写一个 9.8GB 文件,才不会中途因 ENOSPC 失败。
跨平台代码里别假设 free == available;Windows NTFS 默认无预留,但启用配额后也会分化。真实场景中,只依赖 available 做空间判断最安全。
本文共计720个文字,预计阅读时间需要3分钟。
使用 `` 标签和 `` 标签,以下是修改后的开头内容:
为什么 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 << "可用字节: " << s.available << " "; // ✅ 也可用正斜杠(C++17 兼容) s = std::filesystem::space("C:/"); } catch (const std::filesystem::filesystem_error& e) { std::cerr << "获取失败: " << e.what() << " "; } }
注意:s.available 是“当前用户可写入的字节数”,不是磁盘总空闲空间(s.free 才是所有空闲字节,含 root 预留)。
立即学习“C++免费学习笔记(深入)”;
space 返回值中 capacity、free、available 的区别
三者单位都是字节,但语义不同,尤其在启用了配额或预留空间的系统上:
-
capacity:文件系统总容量(等价于df -B1 /path | tail -1 | awk '{print $2}') -
free:未被任何文件占用的空闲字节(包括 root 预留空间,df的 “Available” 列不包含它) -
available:当前进程实际能写入的最大字节数(扣除了 reserved blocks 和 user quotas)——这才是你真正该检查的值
例如:某 ext4 分区 free = 10GB,但 available = 9.5GB,因为 5% 被 root 预留;程序用 available 判断是否够写一个 9.8GB 文件,才不会中途因 ENOSPC 失败。
跨平台代码里别假设 free == available;Windows NTFS 默认无预留,但启用配额后也会分化。真实场景中,只依赖 available 做空间判断最安全。

