c++中获取本地硬盘挂载点及剩余空间有五种方案:一、linux/macos用statvfs配合/proc/mounts枚举;二、windows调用getdiskfreespaceex;三、跨平台用boost.filesystem::space;四、linux专用健壮方案为解析/proc/mounts再statvfs;五、linux增强方案结合libudev与statvfs识别设备级信息。

如果您在 C++ 项目中需要获取本地硬盘各分区的挂载点及其剩余空间信息,则需调用操作系统提供的底层接口或封装跨平台库。以下是实现该功能的多种可行方案:
一、使用 statvfs 系统调用(Linux/macOS)
statvfs 是 POSIX 标准定义的系统调用,用于获取文件系统统计信息,包括总空间、可用空间、块大小等,适用于已挂载的路径。
1、包含必要头文件:#include
2、声明 struct statvfs 类型变量用于接收返回数据。
3、对每个目标挂载路径(如 "/home"、"/")调用 statvfs(path.c_str(), &fs)。
4、通过 fs.f_frsize * fs.f_bavail 计算以字节为单位的可用空间。
5、遍历 /proc/mounts(Linux)或使用 getmntent(POSIX)枚举所有挂载点,避免硬编码路径。
二、调用 Windows API GetDiskFreeSpaceEx(Windows)
GetDiskFreeSpaceEx 是 Windows 原生 API,可精确获取指定驱动器根路径的总容量、可用空间及用户可用空间,支持 NTFS 权限感知。
1、包含头文件:#include
2、声明 ULARGE_INTEGER 类型变量 freeBytesAvailable、totalNumberOfBytes、totalNumberOfFreeBytes。
3、构造盘符路径字符串,格式为 "C:\\"(注意双反斜杠转义)。
4、调用 GetDiskFreeSpaceEx(path.c_str(), &freeBytesAvailable, &totalNumberOfBytes, &totalNumberOfFreeBytes)。
5、检查返回值是否为非零,失败时调用 GetLastError() 获取错误码。
三、使用 Boost.Filesystem 库(跨平台抽象)
Boost.Filesystem 提供了高层封装,屏蔽了平台差异,通过 space() 函数直接获取空间信息,但需确保 Boost 已正确编译并链接。
1、包含头文件:#include
2、启用命名空间:using namespace boost::filesystem;
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
3、对任意路径 path 调用 space(path),返回 space_info 结构体。
4、从返回值中提取 capacity、free、available 字段,单位均为字节。
5、若路径不存在或无权限访问,抛出 filesystem_error 异常,需用 try-catch 捕获。
四、解析 /proc/mounts 与 statvfs 组合(Linux 专用健壮方案)
该方法主动枚举所有挂载点,再逐个调用 statvfs,避免遗漏网络文件系统或临时挂载卷,适合服务端长期运行场景。
1、打开文件 /proc/mounts 使用 std::ifstream。
2、逐行读取,按空格分割字段,提取第二列作为挂载路径(如 "/boot")。
3、过滤掉类型为 "proc"、"sysfs"、"devtmpfs" 等虚拟文件系统。
4、对每个有效挂载路径调用 statvfs,并校验 fs.f_blocks > 0 以排除无效条目。
5、将结果存入 std::vector<:tuple uint64_t>> 结构,分别记录挂载点、总空间、可用空间。
五、调用 libudev + statvfs(Linux 设备级识别增强)
libudev 可枚举块设备及其挂载关系,配合 statvfs 可区分同一物理磁盘上的多个逻辑分区,并获取设备模型、序列号等元信息。
1、初始化 udev:struct udev *udev = udev_new();
2、创建 enumerate 对象并添加匹配规则:udev_enumerate_add_match_subsystem(enumerate, "block")。
3、执行遍历后,对每个 device 调用 udev_device_get_property_value(dev, "ID_FS_USAGE") 判断是否为 filesystem。
4、若为 filesystem,读取 udev_device_get_property_value(dev, "MOUNTPOINT") 获取挂载路径。
5、对非空 MOUNTPOINT 调用 statvfs 并记录结果,最后释放 udev 资源。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










