C++如何获取硬盘分区的详细挂载信息 _ filesystem库实战【实战】
C++如何获取硬盘分区的详细挂载信息 _ filesystem库实战【实战】

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
std::filesystem::space() 能不能拿到挂载点路径?
答案是:不能。很多开发者会误以为std::filesystem::space()能提供完整的磁盘信息,其实它只负责一件事:返回指定路径所在文件系统的空间统计,也就是capacity、free和a vailable这三个数字。至于这个空间属于哪个分区、挂载点路径是什么、文件系统类型为何,它一概不告诉你。
这就好比问一个仓库管理员“库房里还有多少空位”,他能给你一个准确的数字,但你要问他“这个仓库在哪个园区、门牌号多少、用什么锁”,他就无能为力了。你传入"C:/"或"/home",它只会埋头计算该路径所在的文件系统空间,绝不会反过来告诉你对应的设备名或挂载配置。
Linux 下怎么拿到 /proc/mounts 里的真实挂载项
既然标准库不提供,那就得用系统自己的方法。在Linux环境下,没有跨平台的通用接口,最直接可靠的方式就是去读取系统文件。这里有个关键区别:要获取当前实际生效的挂载信息,应该解析/proc/mounts,这是内核提供的实时视图;而不是去读/etc/fstab,那只是静态配置文件,里面的条目不一定都已经挂载上了。
具体怎么操作呢?
- 文件格式:
/proc/mounts的每一行都遵循固定格式:设备名、挂载点、文件系统类型、挂载选项、dump标志、pass标志,各字段之间用空格分隔。需要注意的是,挂载点路径和挂载选项字符串内部可能包含空格或特殊字符,解析时不能简单按空格切割,得根据字段数量进行容错处理。 - 解析步骤:推荐使用
std::ifstream逐行读取,然后用std::istringstream进行分词。我们主要关心第2列(挂载点)、第3列(文件系统类型fstype)和第4列(挂载选项opts)。 - 数据过滤:记得跳过以
#开头的注释行。更重要的是,像rootfs、sysfs、proc这类伪文件系统并非实际的硬盘分区,通常需要将它们过滤掉,只保留物理磁盘或网络存储等条目。 - 代码片段示例:
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的哲学与Linux不同,它没有明确的“挂载点”概念,取而代之的是驱动器字母。不过,我们可以通过一组API组合来获取等效信息。
- 枚举驱动器:使用
GetLogicalDrives()函数,它会返回一个位掩码(bitmask),每一位代表一个存在的驱动器字母(例如C:、D:)。遍历这个掩码就能得到所有有效的盘符。 - 获取详细信息:对于每一个有效的驱动器,调用
GetVolumeInformation(L"C:\\", ...)。这个函数能提供丰富的卷信息,包括卷标(lpVolumeNameBuffer)、文件系统名称(lpFileSystemNameBuffer,如“NTFS”、“FAT32”)、卷序列号等。这里有个细节要注意:传入的路径必须是带有尾部反斜杠的根路径(如L"C:\\"),否则调用会失败。另外,lpVolumeNameBuffer有可能为空字符串,这表示该卷没有设置卷标。 - 关于挂载选项:Windows没有直接对应Linux挂载选项的概念。但是,一个高级功能是,同一个物理卷可以被挂载到多个路径。你可以使用
GetVolumePathNamesForVolumeName()来查询某个卷的所有挂载路径。例如,一个NTFS卷可能同时被挂载到C:和D:\data。
跨平台封装时最容易漏掉的三个细节
当你试图将这些逻辑封装成一个统一的接口时,注意力往往集中在获取路径和类型这些主要信息上。然而,下面这三个细节如果被忽略,你的程序在复杂的真实环境中很可能 silently fail(静默失效)。
立即学习“C++免费学习笔记(深入)”;
- Linux符号链接问题:
/proc/mounts中列出的挂载点,有可能是一个符号链接(例如/home → /mnt/data/home)。如果你直接用读到的字符串与用户传入的路径进行比较,可能会因为路径形式不一致而失败。稳妥的做法是,使用std::filesystem::canonical()函数将路径归一化,消除符号链接的影响。 - Windows驱动器状态问题:不是所有通过
GetLogicalDrives()检测到的驱动器都是可立即访问的。例如,光驱里没有光盘,或者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...。你的程序不能假设这条记录一定有效。更严谨的做法是,在获取信息后,加一步简单的验证,比如调用std::filesystem::exists("/mnt/usb"),确认这个挂载点当前确实可访问,而不是一个已被卸载但残留的条目。这一步小小的检查,往往比复杂的逻辑更能保证程序的健壮性。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
Debian环境下Node.js日志清理技巧有哪些
Debian服务器Node js日志管理与轮转最佳实践指南 高效的日志管理是保障Node js应用稳定运行与快速排障的关键环节。在Debian服务器环境中,随着应用持续运行,日志文件会不断累积,若不加以妥善管理,极易导致磁盘空间耗尽,进而引发服务中断。本文将深入解析几种在Debian系统上管理Nod
Debian JS日志如何自动化处理
Debian JS日志自动化处理方案 处理服务器日志,尤其是Node js应用产生的日志,如果全靠手动,那简直就是运维人员的噩梦。文件无限增长、问题难以追溯、磁盘空间告急……这些问题,其实一套清晰的自动化方案就能搞定。下面就来聊聊如何在Debian系统上,为你的JS应用搭建一个从生成、轮转、采集到分
Debian JS日志如何审计
Debian JS日志审计实操指南 一 审计目标与总体架构 要搭建一套有效的日志审计体系,首先得把目标和框架理清楚。这事儿其实不复杂,核心就三件事:明确范围、打通链路、保障安全。 明确审计范围:一个完整的JS应用生态,日志来源是分散的。前端浏览器的JS异常、后端的Node js服务日志、承载服务的W
Debian JS日志如何分析性能瓶颈
Debian 环境下用 JS 日志定位性能瓶颈的实操指南 性能问题就像系统里的“暗伤”,平时不易察觉,一旦爆发却足以让应用瘫痪。好在,高质量的日志就是最好的“诊断报告”。今天,我们就来聊聊在 Debian 环境中,如何从海量 JS 日志里,精准揪出那些拖慢系统的“元凶”。 一 准备可度量的日志 定位
Debian JS日志如何监控
Debian 上监控 Ja vaScript 日志的实用方案 一 场景与总体架构 聊到Ja vaScript日志监控,首先得把场景分清楚。前端和后端,完全是两码事。 前端 JS(浏览器)这块,核心是捕捉运行时的错误和用户行为。通常的做法是接入像 Sentry 这类专业的前端异常监控服务。当然,开发阶
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
相关攻略
2015-03-10 11:25
2015-03-10 11:05
2021-08-04 13:30
2015-03-10 11:22
2015-03-10 12:39
2022-05-16 18:57
2025-05-23 13:43
2025-05-23 14:01
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

