不可靠——std::filesystem::space仅返回路径所在文件系统的空间信息,无法枚举挂载点、识别设备名或区分bind mount,且不提供挂载点本身;跨平台获取df -h级信息需Linux解析/proc/mounts+statvfs、Windows调用卷API。
用
获取分区剩余空间是否可靠?
不可靠——它只返回调用路径所在文件系统的空间信息,且不提供挂载点(mount point)本身。比如传入
或
,得到的是该路径所在分区的
/
/
,但你根本不知道这个分区挂载在哪儿、设备名是什么、是否是独立挂载(如
、
)、有没有被 bind mount 覆盖。
实际场景中,你要列出所有挂载点(如
、
、
),并分别查它们的剩余空间,
单独用解决不了这个问题。
是“路径到空间”的单向查询,不是“系统到挂载点”的枚举工具
它不区分
(root 可用)和
(普通用户可用),而 Linux
会返回
,更贴近
行为
Windows 下它可能返回整个卷信息,但无法识别 NTFS 的挂载点(如
这种目录挂载)
Linux 下必须解析
或调用
标准 C++ 没有跨平台挂载点枚举接口,Linux 必须依赖系统设施。
是最轻量、无需链接额外库的方式,但要注意过滤伪文件系统(
、
、
等)和网络/内存文件系统(
、
),否则你会拿到一堆无效或不可用的空间数据。
推荐直接读取
并逐行解析,比调用
+
更可控(避免 glibc 版本兼容问题)。
立即学习
“
C++免费学习笔记(深入)
”;
C知道
CSDN推出的一款AI技术问答工具
下载
每行格式为:
,用空格或 tab 分隔
关键过滤条件:
应为
、
、
、
、
等物理存储类型;排除
、
、
、
、
、
对每个通过过滤的
,再调用
获取空间数据
注意:某些挂载点(如
)可能是
,但被误列入,务必按
字段严格判断
Windows 下怎么拿到类似
的结果?
Windows 没有统一挂载点概念,但有卷(volume)和驱动器号(
、
),以及通过
创建的目录挂载点。C++ 标准库完全无法枚举这些,必须用 Windows API。
核心是
+
,但它只能拿到驱动器号,拿不到目录挂载点(例如你把卷
挂到了
,这个映射关系不在 API 直接返回里)。
若只要驱动器号信息:遍历
到
,用
排除非固定磁盘(
),再用
查空间
若要目录挂载点(如
):必须调用
/
枚举卷 GUID,再对每个卷调用
获取所有挂载路径
在 Windows 上对驱动器根路径(
)有效,但对挂载目录(
)也有效——前提是该路径确实是一个卷挂载点;否则它会向上回溯到父卷,导致重复统计
跨平台封装时最容易踩的坑
别试图用
加一个“找父挂载点”的逻辑来模拟
——它没有提供底层
或
的原始字段,也没法告诉你当前路径是否就是挂载根(
对比),更没法处理 bind mount 或 overlayfs。
Linux 下:不要信任
所在位置代表“主分区”,
和
很可能属于不同设备
Windows 下:
返回的
是用户可用空间(类似
),而
的
字段在 MSVC 实现中正是映射它,但 GCC/libstd
c++
在 MinGW 下行为不一致,慎用
权限问题:非 root 用户读
没问题,但某些安全加固系统(如 Android SELinux)可能限制访问;Windows 上需要确保进程有查询卷信息的权限(通常默认有)
符号链接路径:传给
前务必用
展开,否则可能查到错误设备
真正可靠的方案永远是:Linux 走
+
,Windows 走卷枚举 API,
只作最终空间查询的便携包装,绝不用于发现挂载结构。
std::filesystem::space"./""/home/user"capacityfreeavailable/boot/home//boot/homestd::filesystem::spacestd::filesystem::spacefreeavailablestatvfsf_bavaildf -hC:mntdisk2/proc/mountsgetmntent/proc/mountsprocsysfsdevtmpfsnfstmpfs/proc/mountssetmntentgetmntentdevice_name mount_point fs_type options dump passfs_typeext4xfsbtrfsvfatntfs3procsysfsdebugfssecurityfstmpfsdevtmpfsmount_pointstd::filesystem::space(mount_point)/runtmpfsfs_typedf -hC:D:MountVolGetLogicalDrives()GetDiskFreeSpaceEx()\?Volume{...}C:dataA:Z:GetDriveType()DRIVE_FIXEDGetDiskFreeSpaceEx()C:mntol2FindFirstVolumeFindNextVolumeFindFirstVolumeMountPointstd::filesystem::space"C:\""C:\mnt\vol2"std::filesystem::spacedfstatvfsGetDiskFreeSpaceExst_devstd::filesystem::current_path()//homeGetDiskFreeSpaceEx*lpFreeBytesAvailablef_bavailstd::filesystem::spaceavailable/proc/mountsstd::filesystem::spacestd::filesystem::canonical()/proc/mountsstatvfsstd::filesystem::space