需调用平台特定API获取硬盘挂载点与剩余空间:Linux用/proc/mounts+statvfs,Windows用GetDriveType+GetDiskFreeSpaceEx或卷GUID枚举,跨平台可选C++17 filesystem(限路径查询)、libstatgrab或df命令解析,Boost可封装统一接口。
如果您需要在C++程序中获取系统硬盘分区的详细挂载点与剩余空间信息,则需调用操作系统提供的文件系统接口。不同平台(Linux、Windows、macOS)暴露的API差异较大,因此必须采用跨平台或平台专属方式读取挂载点列表及对应磁盘使用状态。以下是几种可行的实现方法:
一、使用标准C++17 filesystem库(仅限支持该特性的系统)
std::filesystem::space函数可获取指定路径所在文件系统的空间信息,但不直接提供挂载点枚举能力;需结合其他机制获取路径列表后逐一查询。
1、包含头文件
#include
2、遍历已知可能挂载点路径(如"/"、"/home"、"/boot"等),对每个路径调用std::filesystem::space(path)获取容量、可用空间与空闲块数。
立即学习“C++免费学习笔记(深入)
”;
3、检查返回值中
capacity != 0以确认路径有效且属于独立文件系统。
4、将结果结构化存储为结构体,包含挂载路径、总容量(bytes)、可用字节数、空闲字节数字段。
二、Linux平台使用getmntent系列函数解析/etc/mtab或/proc/mounts
Linux内核通过/proc/mounts导出当前所有活动挂载点,getmntent()可安全读取该文件并提取设备名、挂载路径、文件系统类型等元数据。
1、包含头文件
#include
2、使用
setmntent("/proc/mounts", "r")打开挂载表文件句柄。
3、循环调用
getmntent()获取每个struct mntent对象,提取其mnt_dir字段作为挂载点路径。
4、对每个挂载点路径调用
statvfs(mnt_dir, &buf)填充struct statvfs,从中提取f_blocks、f_bavail、f_frsize计算总容量与剩余空间。
5、跳过伪文件系统(如proc、sysfs、debugfs)和网络挂载(如nfs、cifs),仅保留本地块设备挂载项。
三、Windows平台调用GetDriveType与GetDiskFreeSpaceEx API
Windows不使用“挂载点”概念,但可通过枚举逻辑驱动器字母(如C:、D:)并查询其属性模拟等效行为;NTFS还支持目录级挂载点,需额外调用FindFirstVolume/FindNextVolume枚举卷GUID路径。
1、包含头文件
#include
2、调用
GetLogicalDrives()获取启用的驱动器位掩码,再用循环检测A-Z各盘符是否有效。
C知道CSDN推出的一款AI技术问答工具下载
3、对每个有效盘符(如"L:\\"),调用
GetDriveType(L"\\")排除非固定磁盘(如U盘、CD-ROM)。
4、调用
GetDiskFreeSpaceEx(L"\\", &freeBytesAvailable, &totalNumberOfBytes, &totalNumberOfFreeBytes)获取精确字节级空间数据。
5、若需支持NTFS卷挂载点(非盘符形式),则需先调用
FindFirstVolume获取首个卷GUID字符串,再用GetVolumePathNamesForVolumeName查询其映射到的所有挂载路径。
四、跨平台封装库:使用libstatgrab或df命令行封装
libstatgrab是开源C库,提供统一接口获取磁盘、内存、CPU等系统指标,内部自动适配各平台底层调用;另一种轻量方式是执行系统df命令并解析其输出,适用于快速原型开发。
1、在Linux/macOS下编译链接
-lstatgrab,调用sg_get_disks_stats()获取所有磁盘设备统计数组。
2、对每个sg_disk_stats结构体,使用
sg_get_mount_point_by_device()反查挂载路径(需提前调用初始化函数)。
3、若选择命令行方案,在C++中调用
popen("df -P", "r")启动进程,逐行读取输出,跳过标题行后按空白符分割字段,提取第1列(文件系统)、第5列(使用率)、第6列(挂载点)。
4、对每行结果,再次调用
statvfs(挂载点路径, &buf)验证并补全精确字节数,避免df默认单位歧义。
五、C++现代封装:基于Boost.Filesystem + 自定义挂载点探测
Boost.Filesystem本身不提供挂载点枚举,但可结合平台特定代码构建统一接口;通过模板特化分离Linux/Windows逻辑,对外暴露一致的get_all_mount_points()与get_disk_usage(const std::string&)函数。
1、定义结构体
struct DiskInfo { std::string mount_point; uint64_t total_bytes; uint64_t available_bytes; };
2、在Linux特化版本中,实现
get_all_mount_points()解析/proc/mounts并过滤只读、noexec等标志位。
3、在Windows特化版本中,实现相同函数,先枚举所有卷GUID,再为每个卷查询全部挂载路径,剔除重复和无效路径(如\??\UNC\...)。
4、统一调用
get_disk_usage(mount_point),内部根据OS宏选择statvfs或GetDiskFreeSpaceEx分支。
5、将全部DiskInfo对象存入std::vector并返回,供上层业务逻辑直接迭代使用。
