C++中获取硬盘分区挂载点及剩余空间需依平台选择方法:Linux用statvfs、/proc/mounts或getmntent;Windows用GetDiskFreeSpaceEx;跨平台可封装Boost.Filesystem。

如果您需要在C++程序中获取系统中各硬盘分区的挂载点及其剩余空间信息,则需调用操作系统提供的底层接口或标准库封装功能。以下是实现该目标的多种方法:
一、使用statvfs系统调用(Linux/Unix平台)
statvfs是POSIX标准定义的系统调用,用于获取指定挂载路径的文件系统统计信息,包括总空间、可用空间、块大小等,适用于已知挂载点的精确查询。
1、包含必要头文件:#include
2、声明struct statvfs类型的变量用于接收返回数据。
立即学习“C++免费学习笔记(深入)”;
3、调用statvfs函数并传入挂载路径字符串,例如"/"或"/home"。
4、检查返回值是否为0,非零表示调用失败,可通过errno获取错误原因。
5、从结构体成员f_frsize、f_blocks、f_bavail中计算总字节数与可用字节数:总空间 = f_frsize × f_blocks,可用空间 = f_frsize × f_bavail。
二、读取/proc/mounts文件解析挂载列表(Linux平台)
/proc/mounts是内核虚拟文件系统提供的实时挂载信息源,按行记录所有已挂载的文件系统及其类型、选项和挂载点,适合动态枚举全部挂载点。
1、使用std::ifstream打开/proc/mounts路径。
2、逐行读取内容,跳过以#开头的注释行。
3、对每行使用空格或制表符分割字段,第2个字段即为挂载点路径。
4、过滤掉伪文件系统(如proc、sysfs、devtmpfs),保留ext4、xfs、btrfs等实际存储设备挂载项。
5、对每个有效挂载点路径再次调用statvfs进行空间信息采集。
三、调用getmntent系列函数(Linux/Unix平台)
getmntent是GNU C库提供的标准接口,用于顺序读取/etc/mtab或指定文件中的挂载条目,比直接解析/proc/mounts更符合POSIX习惯且支持多格式兼容。
1、包含头文件:#include
2、调用setmntent函数打开/proc/mounts(推荐)或/etc/mtab。
3、循环调用getmntent获取struct mntent*指针,其中mnt_dir成员即挂载点。
4、判断mnt_type是否为实际块设备类型(如"ext4"、"xfs"),排除"proc"、"devtmpfs"等。
5、关闭句柄前对每个挂载点执行statvfs调用获取空间数据。
四、Windows平台使用GetDiskFreeSpaceEx API
Windows不采用挂载点概念,但通过驱动器盘符(如C:\、D:\)可获取对应卷的容量与剩余空间,需使用Win32 API进行查询。
1、包含头文件:#include
2、声明ULARGE_INTEGER类型变量用于接收各空间数值。
3、调用GetDiskFreeSpaceEx函数,传入盘符路径(如"C:\\")及三个指针参数分别接收总空间、可用空间、总空闲空间。
4、检查返回值是否为TRUE,否则通过GetLastError获取错误码。
5、遍历所有可能盘符(A:~Z:),对每个GetDriveType返回DRIVE_FIXED或DRIVE_REMOVABLE的盘符执行查询。
五、跨平台封装方案:使用Boost.Filesystem(需预编译支持)
Boost.Filesystem提供portable接口访问路径属性,虽不直接暴露挂载点列表,但可通过已知路径反查空间信息,并结合平台探测逻辑组合使用。
1、确保项目链接boost_filesystem和boost_system库。
2、包含头文件:#include
3、使用boost::filesystem::space函数传入路径,返回space_info结构体,含capacity、free、available字段。
4、在Linux下配合/proc/mounts解析结果,在Windows下配合盘符枚举,将路径映射为挂载点或卷根。
5、对每个目标路径调用space函数并记录返回值,注意捕获boost::filesystem::filesystem_error异常。


















