C++中获取硬盘分区挂载点及剩余空间有五种方案:一、C++17 filesystem库枚举路径调用space();二、Linux用statvfs();三、解析/proc/mounts自动发现挂载点;四、Windows用GetDiskFreeSpaceEx();五、跨平台用libstatgrab库。

如果您需要在 C++ 程序中获取本地硬盘各分区的挂载点路径及其剩余可用空间等详细信息,则需调用操作系统提供的底层接口或依赖跨平台库解析文件系统状态。以下是实现该功能的多种可行方案:
一、使用标准 C++17 filesystem 库(仅限支持 POSIX 或 Windows 原生路径语义的系统)
std::filesystem 提供了 portable 的路径遍历与空间查询能力,但其 space() 函数仅对有效挂载路径生效,需预先枚举所有可能的根目录并逐个探测。
1、包含必要头文件:#include
2、构造 std::vector<:string> 存储候选挂载点,例如在 Linux 上可初始化为 {"/", "/home", "/boot", "/var"};在 Windows 上可枚举 "C:\", "D:\", "E:\" 等驱动器根路径。
3、对每个路径执行 std::filesystem::space() 调用,捕获返回的 std::filesystem::space_info 结构体。
4、检查 space_info.capacity、space_info.free、space_info.available 字段是否非零且无异常抛出,若成功则输出挂载点与剩余空间(available 字节值)。
二、调用 Linux 系统级 API:statfs() 或 statvfs()
statvfs() 是 POSIX 标准接口,可精确获取指定挂载点的文件系统统计信息,包括总块数、可用块数、块大小及挂载标志等,适用于深度定制需求。
1、包含头文件:#include
2、声明 struct statvfs buf;并以挂载点字符串(如 "/home")为参数调用 statvfs("/home", &buf)。
3、验证返回值是否为 0,若非零则通过 strerror(errno) 获取失败原因。
4、计算剩余可用字节数:buf.f_bavail * buf.f_frsize,并结合 buf.f_mntonname 字段获取实际挂载路径。
三、解析 /proc/mounts(Linux 专用)配合 statvfs() 补全信息
/proc/mounts 是内核动态生成的文本文件,列出当前所有已挂载的文件系统及其类型、选项和挂载点,适合自动发现全部活跃分区。
1、使用 std::ifstream 打开 "/proc/mounts" 文件,按行读取。
2、对每行使用 std::istringstream 拆分字段,提取第 2 列作为挂载路径(如 "/srv/data"),跳过以 "none"、"sysfs"、"debugfs" 开头的伪文件系统行。
3、对每个提取出的有效挂载点再次调用 statvfs() 获取空间数据。
4、将挂载点、文件系统类型(第 3 列)、总大小(buf.f_blocks * buf.f_frsize)、可用空间(buf.f_bavail * buf.f_frsize)格式化输出。
四、Windows 平台使用 GetDiskFreeSpaceEx() API
该 Win32 API 可直接获取指定根路径所在卷的总容量、空闲空间与可用空间(考虑配额),无需手动解析注册表或 WMI。
1、包含头文件:#include
2、声明 ULARGE_INTEGER total, free, usable;调用 GetDiskFreeSpaceEx(_T("C:\"), &usable, &total, &free)。
3、检查返回值是否为 TRUE,否则调用 GetLastError() 获取错误码。
4、将 usable.QuadPart 解析为字节数,对应用户实际可写入的剩余空间,同时记录 _T("C:\") 为挂载点。
五、跨平台封装库:libstatgrab 或 df-like 自定义封装
libstatgrab 是轻量级 C 库,提供统一接口获取磁盘使用情况,支持 Linux、BSD、macOS 和 Windows,避免重复实现平台适配逻辑。
1、编译时链接 -lstatgrab,并在代码中包含 #include
2、调用 sg_init(0) 初始化库,随后调用 sg_get_disk_io_stats() 获取设备 I/O 统计,或 sg_get_disk_stats() 获取各挂载点空间详情。
3、遍历 sg_get_disk_stats() 返回的 sg_disk_stats 结构数组,读取 name(设备名或挂载点)、used、total 字段。
4、对每个条目输出 name 字段值作为挂载标识,并将 used 与 total 转换为人类可读单位(如 GiB)后打印。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











