如何通过filesystem::space获取硬盘分区具体可用空间量?

2026-05-08 04:044阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计720个文字,预计阅读时间需要3分钟。

如何通过filesystem::space获取硬盘分区具体可用空间量?

使用 `` 标签和 `` 标签,以下是修改后的开头内容:

为什么 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 返回值中 capacityfreeavailable 的区别

三者单位都是字节,但语义不同,尤其在启用了配额或预留空间的系统上:

  • 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 做空间判断最安全。

标签:硬盘C

本文共计720个文字,预计阅读时间需要3分钟。

如何通过filesystem::space获取硬盘分区具体可用空间量?

使用 `` 标签和 `` 标签,以下是修改后的开头内容:

为什么 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 返回值中 capacityfreeavailable 的区别

三者单位都是字节,但语义不同,尤其在启用了配额或预留空间的系统上:

  • 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 做空间判断最安全。

标签:硬盘C