不能,std::filesystem::space()仅返回路径所在文件系统的capacity、free、available空间统计,不提供挂载点路径、设备名或文件系统类型等元信息;需配合/proc/mounts(Linux)、GetVolumeInformation(Windows)等平台特定API获取挂载信息。

std::filesystem::space() 能不能拿到挂载点路径?
不能。std::filesystem::space() 只返回磁盘空间统计(capacity、free、available),不提供挂载路径、文件系统类型或挂载选项等元信息。它连“这个空间属于哪个分区”都不告诉你——传入 "C:/" 或 "/home",它只查该路径所在文件系统的空间数据,但不会反查该路径对应的设备名或挂载配置。
Linux 下怎么拿到 /proc/mounts 里的真实挂载项
标准 C++ 没有跨平台挂载信息接口,Linux 必须读取系统文件。最可靠的是解析 /proc/mounts(内核实时视图),而非 /etc/fstab(仅配置,不一定已挂载)。
-
/proc/mounts每行格式:设备名 + 挂载点 + 文件系统类型 + 挂载选项 + dump + pass,用空格分隔(注意:挂载点和选项中可能含空格,需按字段数容错解析) - 推荐用
std::ifstream逐行读,用std::istringstream分词,取第2列(挂载点)、第3列(fstype)、第4列(opts) - 跳过以
#开头的注释行;过滤掉rootfs、sysfs等伪文件系统(它们不是硬盘分区) - 示例关键片段:
std::string line; while (std::getline(fs, line)) { if (line.empty() || line[0] == '#') continue; std::istringstream iss(line); std::string dev, mountpoint, fstype, opts; if (iss >> dev >> mountpoint >> fstype >> opts) { if (fstype != "rootfs" && fstype != "sysfs" && fstype != "proc") { // 保留 mountpoint 和 fstype } } }
Windows 怎么枚举驱动器并获取卷信息
Windows 没有挂载点概念,但可用 GetLogicalDrives() + GetVolumeInformation() 组合逼近等效信息。
-
GetLogicalDrives()返回位掩码,标出所有存在的驱动器字母(如C:、D:) - 对每个有效驱动器调用
GetVolumeInformation(L"C:\", ...),能拿到卷标(lpVolumeNameBuffer)、文件系统名(lpFileSystemNameBuffer,如"NTFS")、序列号等 - 注意:必须传入带尾部反斜杠的根路径(
"C:\"),否则失败;lpVolumeNameBuffer可能为空(无卷标) - 无法直接获得“挂载选项”,但可通过
GetVolumePathNamesForVolumeName()查某卷的所有挂载路径(例如一个 NTFS 卷可被挂载到C:和D:data)
跨平台封装时最容易漏掉的三个细节
写一个统一接口时,别只盯着路径和类型——这些坑不处理,程序在真实环境里会静默失效:
- Linux 下
/proc/mounts的挂载点可能是符号链接(如/home → /mnt/data/home),要用std::filesystem::canonical()归一化,否则和用户传入路径比对会失败 - Windows 驱动器可能“存在但不可访问”(如光驱没放盘、USB 设备被拔出),调用
GetVolumeInformation()前先用GetDriveType()检查是否为DRIVE_FIXED或DRIVE_REMOVABLE,跳过DRIVE_NO_ROOT_DIR - 权限问题:Linux 上普通用户可读
/proc/mounts,但某些安全加固系统(如容器、SELinux 严格策略)可能屏蔽;Windows 上需要管理员权限才能获取部分卷信息(如 BitLocker 状态),但基础字段通常无需提权
真正麻烦的从来不是“怎么读”,而是“读到的值在不同环境下是否可信”。比如 /proc/mounts 里某行写着 /dev/sdb1 /mnt/usb vfat rw,nosuid...,你得确认 /mnt/usb 真的可访问、且不是被 umount 后残留的条目——这时候加一句 std::filesystem::exists("/mnt/usb") 比什么都管用。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











