C++如何判断一个路径是否位于固态硬盘(SSD)上

千芳酱_6429

千芳酱_6429

2026-06-11

768人浏览

原创

windows下最可靠方式是通过wmi查询msft_physicaldisk的mediatype字段:先将路径映射为卷,再关联到物理磁盘,mediatype值为3(ssd)或4(nvme)即确认为固态硬盘,需配合com初始化及安全上下文设置。

c++如何判断一个路径是否位于固态硬盘(ssd)上

Windows 下通过 WMI 查询磁盘类型

直接判断某个路径所在的磁盘是不是 SSD,在 C++ 里没有标准 API,得靠系统级接口。Windows 最可靠的方式是用 WMI(Windows Management Instrumentation)查 MSFT_PhysicalDisk,再把路径映射到驱动器号,最后比对 MediaType 字段。

常见错误是只查 Win32_DiskDrive,它返回的是物理设备,但一个 SSD 可能被分成多个卷,而路径可能落在某个 NTFS 卷上——必须先做路径 → 卷 → 物理磁盘的链路解析。

  • 用 GetVolumePathName() 把路径转成卷路径(如 C:\)
  • 用 GetVolumeInformationByHandleW() 或 WMI 的 Win32_Volume 查该卷对应的 DeviceID(形如 \?Volume{...})
  • 再用 WMI 查询 MSFT_StorageSetting 或关联 MSFT_PhysicalDisk,检查 MediaType 是否等于 3(SSD)或 4(NVMe)
  • 注意:WMI 查询需启用 COM 初始化、设置安全上下文,否则 CoInitializeEx() 和 CoSetProxyBlanket() 缺一不可

Linux 下读取 sysfs 中的 rotational 标志

Linux 没有统一“SSD”标识,但内核通过 /sys/block/*/queue/rotational 文件提供间接判断:值为 0 表示非旋转介质(大概率是 SSD/NVMe),1 表示 HDD。

关键难点在于路径到设备名的映射。不能直接从 /dev/sda 推导,因为路径可能挂载在 LVM、RAID 或 btrfs 子卷下。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 用 stat() 获取路径所在文件系统的 st_dev
  • 遍历 /proc/mounts 或调用 getmntent() 找到对应挂载点的块设备路径(如 /dev/nvme0n1p1)
  • 提取设备主次号,或从设备路径解析出 basename(如 nvme0n1p1 → nvme0n1),再拼接 /sys/block/{name}/queue/rotational
  • 某些 NVMe 设备(尤其带命名空间的)可能不暴露 rotational,此时可 fallback 到检查 /sys/block/{name}/device/model 是否含 NVME 或 SSD 字样

macOS 下通过 IOKit 获取 kIOBlockStorageDeviceMediumTypeKey

macOS 需用 IOKit 框架查存储设备属性,核心是拿到路径对应卷的 IOMedia 对象,再读取 kIOBlockStorageDeviceMediumTypeKey。值为 kIOBlockStorageDeviceMediumTypeSolidState 即确认为 SSD。

容易卡在设备树遍历层级:路径 → mountpoint → disk device → parent IOMedia(可能是 Logical Volume)→ Physical Media。跳过中间 Logical Volume 直接找最顶层的 Physical Media 才能拿到真实介质类型。

  • 用 statfs() 获取路径所在卷的 f_mntfromname(如 /dev/disk2s1)
  • 用 IOServiceGetMatchingServices() 匹配 IOBSDNameMatching(kIOMasterPortDefault, "disk2s1")
  • 向上调用 IORegistryEntryCreateIterator() 找到类型为 IOMedia 且 Content 为 AppleAPFSMedia 或 ApplePartitionScheme 的父节点
  • 调用 IORegistryEntryCreateCFProperties() 提取 kIOBlockStorageDeviceMediumTypeKey,比较是否等于 kIOBlockStorageDeviceMediumTypeSolidState

跨平台封装要注意的兼容性陷阱

没有一种方法能在所有系统版本上 100% 准确。Windows 7 不支持 MSFT_PhysicalDisk,得降级用 Win32_DiskDrive + Model 字段关键词匹配;Linux 上某些厂商定制内核会把 SSD 的 rotational 写成 1;macOS Monterey 后部分 APFS 加密卷的 IOMedia 层级关系也变了。

  • 永远 fallback:当系统 API 返回异常或缺失字段时,优先采信 rotational=0(Linux)、MediaType=3/4(Windows)、MediumType==SolidState(macOS),其余情况默认不认为是 SSD
  • 不要依赖设备型号字符串(如含 “SSD” 就判定),有些机械硬盘厂商也会在 Model 里写 SSD
  • 缓存结果很重要:同一路径反复查询不应每次都走 WMI/sysfs/IOKit,建议按设备 ID(如 Windows 的 DeviceID、Linux 的 MAJ:MIN)做内存缓存,有效期设为进程生命周期即可

实际写的时候,最麻烦的不是查介质类型,而是把任意路径稳稳落到最底层物理设备上——中间任何一层抽象(LVM、ZFS、BitLocker、APFS 加密卷)都可能打断这个链路。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2248

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1019

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

447

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

327

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

406

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1409

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1217

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习