c++如何获取当前系统的所有磁盘分区_磁盘空间查询【技巧】

陌涛大大_6019

陌涛大大_6019

2026-04-12

251人浏览

原创

应枚举A:–Z:盘符,先用GetDriveType筛选DRIVE_FIXED、DRIVE_REMOVABLE、DRIVE_REMOTE等可用类型,再对有效盘符调用GetDiskFreeSpaceEx获取精确容量,避免直接遍历导致卡顿或错误。

c++如何获取当前系统的所有磁盘分区_磁盘空间查询【技巧】

Windows 下用 GetDriveType + GetDiskFreeSpaceEx 枚举所有盘符

Windows 没有“分区列表”系统调用,得靠枚举可能的盘符(A:–Z:)再逐个探测。关键不是“列出分区”,而是“哪些盘符实际存在且可访问”。GetDriveType 能快速筛掉未就绪、网络驱动器或不存在的盘符;GetDiskFreeSpaceEx 则提供真实可用空间(比 GetDiskFreeSpace 更准,支持 >4GB 文件系统)。

常见错误是直接遍历 A:–Z: 却不检查 GetDriveType 返回值,导致对软驱、光驱或空插槽反复调用 GetDiskFreeSpaceEx,引发明显卡顿或权限错误(如访问被禁用的 U 盘)。

  • 只对 DRIVE_FIXED(本地硬盘)、DRIVE_REMOVABLE(U 盘/SD 卡)、DRIVE_REMOTE(映射网络驱动器)调用 GetDiskFreeSpaceEx
  • 跳过 DRIVE_NO_ROOT_DIR 和 DRIVE_UNKNOWN,它们大概率不可用
  • 用宽字符函数(GetDriveTypeW、GetDiskFreeSpaceExW),避免 ANSI 编码路径乱码

Linux/macOS 用 /proc/mounts 或 getmntent 获取挂载点

类 Unix 系统不暴露“物理分区”概念,而是通过挂载点(mount point)组织存储。最可靠方式是读取 /proc/mounts(Linux)或用 setmntent("/etc/mtab", "r")(兼容性更好),配合 getmntent 解析每行。注意:不要解析 df 命令输出——它依赖 locale、格式不稳定,且无法获取挂载选项细节。

容易踩的坑是忽略文件系统类型过滤。比如 devtmpfs、sysfs、proc 这些内存伪文件系统会出现在 /proc/mounts 中,但显然不是磁盘分区。应只保留 ext4、xfs、btrfs、apfs、hfs 等真实块设备文件系统。

  • 用 statvfs() 替代 statfs(),前者 POSIX 标准,字段含义更一致
  • statvfs 的 f_frsize 是“基本块大小”,计算总空间时用 f_blocks * f_frsize,别误用 f_bsize
  • macOS 上 /proc 不存在,必须走 getmntent + statvfs 组合

跨平台统一查询:C++17 std::filesystem::space 的局限与绕过

std::filesystem::space 看似完美,但它的输入是路径而非设备名,且行为依赖底层 OS 实现。在 Windows 上传入 "C:" 可能成功,但 "C:\" 才是稳定写法;Linux 上若传 "/" 只返回根挂载点,无法得知 /home 是否独立分区。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

更严重的是,它不提供“该路径对应哪个设备”信息,也没法枚举所有挂载点。所以它适合已知路径查空间,不适合“发现所有磁盘分区”。强行用它做枚举,结果不可靠:比如 Windows 上 "A:" 若无光盘插入,space 会抛 std::filesystem::filesystem_error;Linux 上对未挂载的设备节点(如 /dev/sdb1)调用会失败。

  • 仅用于已确认存在的、可访问的挂载点路径(如 "/"、"C:\")
  • 务必用 try/catch 捕获 std::filesystem::filesystem_error
  • 不要用它替代 GetDriveType 或 getmntent —— 它不是发现工具,只是查询工具

注意设备名与挂载点的映射关系(尤其是 Linux LVM / RAID)

用户真正关心的常是“这块 SSD 上有哪些逻辑卷”,而不仅是“/dev/sda1 用了多少”。Linux 下需解析 /proc/partitions、/sys/block/*/slaves 或调用 lsblk -J(需解析 JSON),才能把 /dev/mapper/vg0-lv_root 关联到物理盘 /dev/sda。Windows 的 WMIC 或 WMI 查询(Win32_Volume 类)也能拿到卷 GUID 与物理磁盘号的映射。

这个层面的问题,标准 C++ 库完全不涉及。如果业务需要展示“某块 NVMe 盘上所有分区”,就必须引入平台特定 API 或外部命令。别试图用 statvfs 的 statfs.f_fsid 反推设备——它在不同内核版本含义不同,且无法跨文件系统比较。

多数应用其实不需要这层映射。先确认需求是否真要物理归属,还是只要“用户能看到的存储单元”——后者用前述挂载点或盘符方案已足够。强行深挖设备拓扑,反而让代码脆弱且难以测试。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2355

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3882

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1296

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

4519

7

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.26

3499

3

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.27

3038

6

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

2023.08.01

1548

3

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2759

5

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.08

3370

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习