Linux下C++程序可通过解析/proc/mounts获取挂载点与文件系统类型,再调用statfs()或statvfs()获取总容量、可用空间等数据,最后格式化为表格输出,无需root权限且不依赖第三方库。

在Linux系统中用C++程序实时读取每个硬盘分区的挂载点路径、文件系统类型、总容量、已用空间和剩余空间,是系统监控工具、备份软件或磁盘分析器的基础能力。直接调用系统命令虽快但不可靠,解析/proc/mounts或statfs()更稳定可控。
读取/proc/mounts获取所有挂载点列表
打开/proc/mounts文件,逐行解析设备名、挂载路径、文件系统类型三字段,跳过以#开头的注释行和rootfs等伪文件系统。
使用std::ifstream按行读取,用std::istringstream分割每行空格分隔的字段;注意第2列是挂载点路径,第3列是文件系统类型(如ext4、xfs、btrfs),第1列设备路径可暂存备用。
这一步不依赖第三方库,纯标准C++即可完成,且结果与mount命令输出完全一致。
立即学习“C++免费学习笔记(深入)”;
对每个挂载点调用statfs()获取空间数据
方法一:使用struct statfs + statfs()系统调用
为每个挂载点路径(如"/"、"/home")调用int statfs(const char *path, struct statfs *buf),成功返回0,失败返回-1并设置errno。
【必须传入挂载点路径而非设备路径】 传"/dev/sda1"会失败,必须传其实际挂载位置如"/boot"。
从buf->f_blocks(总块数)、buf->f_bfree(空闲块数)、buf->f_bsize(块大小)计算出总字节数、剩余字节数;再用f_bavail(非特权用户可用块数)算出真正可用空间——这对监控告警更准确。
方法二:兼容性更强的statvfs()
用struct statvfs替代statfs,调用statvfs(path, &buf),字段名略有不同(f_frsize代替f_bsize,f_blocks/f_bfree/f_bavail语义一致),POSIX标准,跨Unix系统更稳。
格式化输出为易读的表格结构
第一步:收集全部挂载点信息到std::vector<MountInfo>容器,每个元素含mount_point、fs_type、total_bytes、available_bytes、used_percent。
第二步:遍历容器,对每个条目计算used_percent = static_cast<double>(total_bytes - available_bytes) * 100.0 / total_bytes;注意total_bytes为0时跳过防止除零。
第三步:用std::setw和std::left控制列宽,打印表头"Mount Point | Type | Total | Available | Use%",再逐行列出数据,字节数自动转为GB(/1024.0/1024.0/1024.0)并保留一位小数。
这一步输出干净直观,可直接集成进终端UI或日志记录模块。
编译与运行注意事项
无需额外链接库,仅需g++ -std=c++17 -o diskinfo diskinfo.cpp;但必须在Linux环境下运行,/proc/mounts和statfs()在Windows/macOS不可用。
普通用户可读取所有挂载点的空间信息,无需root权限;但部分挂载点(如被chmod 000锁定的目录)可能statfs()失败,此时跳过并记录警告即可。


















