C++获取本地硬盘分区信息有五种方案:一、C++17 filesystem库(POSIX系统);二、statvfs()系统调用;三、解析df命令输出;四、libmount+libblkid组合(推荐生产环境);五、Windows下GetDiskFreeSpaceExW API。

如果您需要在 C++ 程序中获取本地硬盘各分区的挂载点路径及其剩余空间、总空间等详细信息,则需调用操作系统提供的底层接口或封装库。以下是实现该功能的多种可行方案:
一、使用标准 C++17 filesystem 库(仅限支持 POSIX 的系统)
std::filesystem 提供了 path、space_info 等类型,可在 Linux/macOS 上直接获取挂载点的空间使用情况,但需注意其 space() 函数返回的是所在文件系统的统计值,而非严格按挂载点边界判定;对 /proc/mounts 中的每个挂载项需单独调用。
1、包含头文件 #include
2、遍历 /proc/mounts 文件,逐行解析设备名、挂载路径、文件系统类型字段。
立即学习“C++免费学习笔记(深入)”;
3、对每个挂载路径调用 std::filesystem::space(path) 获取可用字节数、总字节数、空闲字节数。
4、过滤掉类型为 proc、sysfs、devtmpfs 等虚拟文件系统条目。
二、调用 Linux 系统调用 statfs() 或 statvfs()
statvfs() 是 POSIX 标准接口,可跨平台兼容性略优于 statfs(),返回结构体中包含 f_frsize、f_blocks、f_bavail 等字段,用于计算实际可用空间。
1、包含头文件 #include
2、定义 std::vector<:string> 存储从 /proc/mounts 解析出的有效挂载路径。
3、对每个路径执行 statvfs(mount_path.c_str(), &buf),检查返回值是否为 0。
4、通过公式 buf.f_frsize * buf.f_bavail 计算剩余空间字节数,buf.f_frsize * buf.f_blocks 计算总空间字节数。
三、解析 /proc/mounts + 调用 df 命令子进程获取格式化输出
该方法不依赖特定 API,适用于快速原型开发,但存在安全性与性能开销问题,仅建议调试阶段使用。
1、使用 popen("df -P", "r") 启动子进程并读取标准输出流。
2、跳过首行表头,逐行解析每列字段:文件系统名、1024-块总数、已用块、可用块、使用百分比、挂载点。
3、将挂载点字符串作为键,构建 map
4、对每个挂载点再次调用 statvfs() 验证 df 输出一致性,避免符号链接或 bind mount 导致的歧义。
四、使用 libblkid 与 libmount 组合解析(推荐用于生产环境)
libmount 提供 mount table 抽象层,libblkid 可识别设备 UUID、LABEL 及文件系统类型,二者配合可精确区分物理设备与挂载关系。
1、链接时添加 -lmount -lblkid,并包含 #include
2、调用 mnt_new_table() 创建挂载表对象,再用 mnt_table_parse_mtab() 加载 /proc/self/mountinfo。
3、遍历表中每个 struct libmnt_fs *,提取 fs_target(挂载点)、fs_source(设备路径)、fs_fstype(文件系统类型)。
4、对每个 fs_target 调用 statvfs() 获取空间数据,并通过 blkid_get_tag_value() 查询对应设备的 LABEL 或 UUID 以增强可读性。
五、Windows 平台适配:使用 GetDiskFreeSpaceExW API
在 Windows 下需枚举所有驱动器字母,调用宽字符版本 API 获取各卷的剩余空间、总空间及可用空间,注意处理 UNC 路径与挂载点映射关系。
1、包含头文件 #include
2、调用 GetLogicalDrives() 获取已分配驱动器位掩码,依次构造 L"C:\" 形式路径。
3、对每个路径调用 GetDiskFreeSpaceExW(path.c_str(), &free_bytes, &total_bytes, &total_free_bytes)。
4、使用 GetVolumeInformationW() 获取卷标名称与文件系统类型,补充到结果结构中。


















