当前位置:

首页 > 编程开发 > C++如何获取硬盘分区的详细挂载点信息与剩余空间 _ filesystem库【实战】

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

std::filesystem::space仅返回容量、空闲和可用空间,无法获取挂载点、文件系统类型等关键信息。Windows需调用Win32API枚举盘符及卷挂载点,Linux/macOS需读取挂载点列表并调用statvfs计算空间。需处理权限、虚拟文件系统、路径斜杠等细节,避免程序阻塞或异常。

提到 std::filesystem::space,很多 C++ 开发者首先想到的就是拿它来查询磁盘空间。但这个 API 真的有看起来那么能干吗?

先说几个核心判断:它只返回 capacity、free、a vailable 三个数字,至于这个路径属于哪个挂载点、文件系统是什么类型、能不能写——统统不告诉你。更坑的是,如果你传进去一个符号链接,它查的是链接指向的目标位置的文件系统,而不是链接本身所在的分区。所以,在需要精确管理存储资源的场景里,这个 API 的信息量根本不够用。

从结构上看,space_info 就三个字段,没有设备名、没有挂载路径、也没有文件系统类型。跨平台行为虽然一致,但信息严重不足;Windows 下甚至可能把 NTFS 卷和 ReFS 卷都统报为同一抽象“空间”,你完全无法区分底层挂载关系。而且,如果路径不存在或权限不足,它会抛 filesystem_error,你必须显式捕获,否则程序就直接挂了。

那么,在 Windows 上想要枚举所有挂载点并拿到完整的空间信息,该怎么办?得绕开标准库,直接调用 Win32 API。常见组合拳是:GetLogicalDrives 获取有盘符的驱动器位掩码,然后对每个盘符调用 GetDiskFreeSpaceEx。需要注意的是,GetDiskFreeSpaceEx 返回的三个值里,第三个是 total_free,它和 free 并不等价——因为系统会保留一部分空间。要获取卷标和文件系统类型(比如到底是不是 NTFS),还得补上 GetVolumeInformation,提前分配好 MAX_PATH 大小的缓冲区。千万别试图用 directory_iterator("C:/") 去猜挂载点,它遍历的是目录内容,不是卷列表;也别硬编码 "C:"、"D:" 字符串,Windows 支持把卷挂载到任意空目录(比如 C:\mnt\data),这时它没有盘符,传统方法会漏掉。要捕捉这种场景,得用 FindFirstVolume/FindNextVolume 配合 GetVolumePathNamesForVolumeName。

Linux 和 macOS 下的玩法又不一样了。读 /proc/mounts(Linux)或 getmntinfo(macOS)只是拿到了挂载点列表,真正的空间数据必须调用 statvfs。struct statvfs 里的字段需要手动换算:f_blocks * f_frsize 是总空间,f_ba vail 是非 root 用户可用空间,而 f_bfree 是 root 可用空间(通常多 5% 的保留块)。计算容量时,必须用 f_frsize,而不是 f_bsize(那个是 I/O 块大小)。

在 Linux 上遍历 /proc/mounts 时,记得过滤掉 proc、sysfs、devtmpfs 这些虚拟文件系统,否则 statvfs 会返回 0 或 -1。macOS 那边,/etc/fstab 只管静态配置,运行时动态挂载的外接硬盘、APFS 加密卷都不会出现在里面,所以必须用 getmntinfo。另外,statvfs 对 NFS 挂载可能阻塞甚至超时,生产环境里建议用 alarm() 或者走线程加超时控制,别让一个调用卡死整个主逻辑。

最后,如果把这一切封装成跨平台接口,真正的坑往往不在 API 选择上,而在语义对齐、错误容忍和路径归一化这几个细节。Windows 下 "C:" 和 "C:\" 在 GetDiskFreeSpaceEx 中的行为不同——前者可能失败,后者才稳定;Linux 下 statvfs("/home") 和 statvfs("/home/") 结果一样,但路径末尾缺了斜杠可能导致 realpath() 失败,从而找不到挂载点。有些 Linux 文件系统(比如 overlayfs、btrfs subvolume)会在 /proc/mounts 里出现多次,但 statvfs 返回的是底层块设备的空间,不是子卷的配额——如果你需要子卷级别的空间数据,得调 btrfs filesystem usage 或解析 /sys/fs/btrfs/*/allocations,标准库这层完全不覆盖。

权限问题也是重灾区。普通用户在 Linux 上对某些挂载点(比如 root-squashed NFS)调 statvfs,会返回 -1 并设 errno=EPERM,此时应该降级为跳过,而不是抛异常;Windows 上碰到 BitLocker 加密卷未解锁的情况,GetDiskFreeSpaceEx 返回 FALSE,GetLastError() 给出 ERROR_ACCESS_DENIED,也得静默处理。

挂载点识别和空间统计从来不是纯算法问题,而是操作系统接口契约的理解问题。别指望一个 std::filesystem 调用能横跨 Win、macOS、Linux 给出一致且完整的答案。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 硬盘 C++
相关文章 更多
C++动态数组初始化怎么写?常用语句与代码示例
C++动态数组初始化怎么写?常用语句与代码示例

深入解析C++中动态数组的初始化机制,涵盖new操作符的不同用法、基本类型与类对象的初始化差异,以及为何在现代C++开发中应优先使用std::vector。

WMV转MP4方法
WMV转MP4方法

WMV视频压缩指南:如何高效“瘦身”释放硬盘空间 在日常处理和收藏视频时,不少人会发现一个有趣的现象:WMV格式的文件,在画质相当的情况下,体积往往比MP4更小巧。这原本是它的优势,但架不住日积月累,一堆WMV文件同样会悄悄吃掉大量的硬盘空间。因此,如何给WMV视频“减减肥”,就成了优化存储、提升效

C++类构造与析构函数详解
C++类构造与析构函数详解

C++类构造与析构函数详解 C++这门语言,可以说是从C语言这棵大树上衍生出的高级果实,如今的应用普及度有目共睹。作为一种静态类型的通用编程语言,它厉害的地方在于融合了多种编程哲学——无论是传统的面向过程,还是主流的面向对象,乃至数据抽象、泛型编程这些高级概念,它都能很好地支持。正因为这份卓越的扩展

C++中std::upper
C++中std::upper

C++中std::upper_bound用法解析 在C++标准模板库(STL)的算法工具箱里,upper_bound() 绝对算得上是一把精准的“探针”。它的核心任务很明确:在一个已经排好序的区间 [first, last) 内,帮你快速定位到第一个**严格大于**指定值 value 的那个元素。这

C++常对象与成员解析
C++常对象与成员解析

C++中“常”概念全景解析:从对象、成员到指针与引用 在C++的世界里,“常量性”是一个强大的保障机制。它不仅仅是一个const关键字那么简单,而是构建健壮、安全程序的重要基石。今天,我们就来系统梳理一下围绕“常”的一系列概念:常成员、常对象、常指针与常引用。理解它们,是写出高质量C++代码的关键一

50TB硬盘来了!希捷2028年正式出货
50TB硬盘来了!希捷2028年正式出货

快科技7月30日消息,希捷CEO戴夫·莫斯利在2026财年第四季度财报电话会上宣布,公司旗下50TB级HAMR(热辅助磁记录)硬盘平台Mozaic 5,将于2027年底启动客户认证,2028年正式出货。这个时间节点很关键,意味着超大容量硬盘的商用化终于进入了倒计时。 莫斯利透露,基于现有长期供应协议

c++如何将结构体写入SQLite数据库_对象关系映射方案【进阶】
c++如何将结构体写入SQLite数据库_对象关系映射方案【进阶】

直接用SQLiteCAPI绑定结构体需要手动处理字段展平与顺序对齐,ORM库虽省代码但存在隐式行为风险。小项目建议原生绑定,中大型项目可搭配编译期校验使用轻量ORM。绑定std::string需传指针与长度,注意生命周期;浮点字段比较需设误差范围。

什么是编程,学习编程的意义是?
什么是编程,学习编程的意义是?

编程是编写程序指令,让设备按意图运行,常用Python、C等语言或Scratch图形化编程。学习编程能跟上科技时代,锻炼自学与解决问题能力,提升逻辑思维,代表行动力,推动事物前进。各司其职,编程者尽本分。

编程是门艺术_是编程艺术吗?
编程是门艺术_是编程艺术吗?

编程被争论是否为艺术。从定义看,编程是技能表达,但并非所有编程都是应用开发。写代码如音乐、文章,有独特风格。好代码需耐心与逻辑能力。编程是艺术,但应用开发不等同于编程艺术。

【编程的感受】
【编程的感受】

很多人提起编程,总觉得这是一门“不起眼”的学问——不就是写写代码嘛,能有多深?但真走进去了才会发现,编程里头的门道,远比表面看上去要丰富得多。 学习编程的过程中,最容易卡住的往往是那些基础语法。就拿那个常见的 for 循环来说吧,刚开始时怎么都绕不过弯来:为什么这么写能循环?循环条件到底怎么控制?一

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Postman macOS版
Postman macOS版
Mac

Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。

Docker Desktop macOS版
Docker Desktop macOS版
Mac

Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。

Android Studio macOS版
Android Studio macOS版
Mac

Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。

WINDOWS 更多
Postman Windows版
Postman Windows版
Windows

Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等

Docker Desktop Windows版
Docker Desktop Windows版
Windows

Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。

Android Studio Windows版
Android Studio Windows版
Windows

Android Studio 是 Google 面向 Android 应用开发提供的官方集成开发环境,以 IntelliJ IDEA 为基础,集成智能代码编辑、Gradle 构建、设备模拟、界面预览、调试测试及性能分析工具,