可借助c++17的模块结合系统接口获取所有挂载点及其剩余空间:linux读/proc/mounts,windows调用win32卷枚举api;对各路径用std::filesystem::space()查询,捕获异常并格式化输出gib单位信息。

如果您需要在 C++ 程序中获取系统中所有硬盘分区的详细挂载点及其剩余可用空间,则可借助 C++17 引入的标准库
一、遍历系统中所有已挂载的文件系统路径
标准 std::filesystem::directory_iterator 无法直接枚举“挂载点”,需结合操作系统特定机制获取根路径列表;但可通过预设常见挂载路径(如 Linux 的 /、/home、/boot)或读取 /proc/mounts(Linux)或 GetVolumePathNames(Windows)间接构造候选路径集,再对每个路径调用 std::filesystem::space() 验证其是否为独立文件系统。
1、在 Linux 系统上,打开并逐行解析 /proc/mounts 文件,提取每行第 2 列(挂载点路径)。
2、对每一挂载点路径,调用 std::filesystem::exists(path) 确认路径存在且可访问。
3、过滤掉伪文件系统(如 proc、sysfs、devtmpfs),仅保留实际存储设备对应的挂载点(如 ext4、xfs、btrfs 类型)。
二、使用 std::filesystem::space() 查询指定路径所在文件系统的空间信息
std::filesystem::space() 接收一个路径参数,返回 std::filesystem::space_info 结构体,其中包含 capacity(总容量)、free(空闲空间)、available(用户可用空间,已扣除 root 预留)三个字段,单位均为字节。
1、声明变量 std::filesystem::space_info si。
2、执行 si = std::filesystem::space("/"); 获取根分区空间数据。
3、将 si.capacity、si.free、si.available 分别转换为 GiB(除以 1024³)并保留两位小数输出。
三、跨平台兼容:区分 Linux 与 Windows 路径枚举策略
Linux 下依赖 /proc/mounts 或 getmntent();Windows 下需调用 Win32 API GetLogicalDrives() 获取驱动器位掩码,再用 FindFirstVolumeW() 和 GetVolumePathNamesW() 枚举每个卷的挂载路径(如 C:、D:),避免仅依赖盘符导致 NTFS 卷挂载到子目录的情形被遗漏。
1、在 Windows 平台,使用 std::vector<:wstring> 存储所有卷的挂载路径字符串。
2、对每个挂载路径调用 std::filesystem::path(wstr).string() 转为 UTF-8 字符串供 space() 使用。
3、跳过挂载路径为空或长度小于 3 的无效项(如 \?Volume{...} 未映射到任何路径)。
四、处理权限不足或不可访问挂载点的异常
当某挂载点因权限限制(如非 root 用户访问 /boot/efi)或设备卸载导致 std::filesystem::space() 抛出 std::filesystem::filesystem_error 异常时,应捕获该异常并跳过该路径,继续处理其余挂载点,防止程序中断。
1、将 std::filesystem::space(path) 放入 try 块内。
2、catch (const std::filesystem::filesystem_error& e),输出错误消息但不终止循环。
3、检查异常码 e.code().value() 是否为 EACCES 或 ENOTDIR,据此记录警告级别日志。
五、格式化输出挂载点与剩余空间信息
为提升可读性,需对每个有效挂载点生成结构化文本行,包含挂载路径、总容量、已用空间、可用空间、使用率百分比,并统一单位为 GiB,保留一位小数;使用制表符或固定宽度对齐字段,便于终端查看或重定向至文件。
1、计算使用率:若 si.capacity > 0,则 double usage = 100.0 * (si.capacity - si.available) / si.capacity;。
2、使用 std::fixed 与 std::setprecision(1) 控制浮点输出精度。
3、输出格式示例:"/home 456.2 GiB 210.5 GiB 245.7 GiB 46.2%"。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











