转载请注明出处,谢谢,复制粘贴,举手之劳,代表至少您对原作者的尊重。
问题描述:我自己的机器上有多个硬盘,如何把磁盘的盘符与它所在的硬盘对应起来呢?例如分许 C:/究竟在哪个硬盘上,每一个硬盘又具有多少个分区,每一个分区的盘符又是啥呢?
解决方案概述
第一步,获取本机所有硬盘的设备名称,该名称将传递给CreateFile函数使用。我们在这里需要使用到WMI服务
有关于WMI,可以查阅MSDN的描述,下面的代码来自于MSDN上的一个示例
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/wmisdk/wmi/example__getting_wmi_data_from_the_local_computer.htm
当作到上面的While循环内时,我们就已经开始枚举所有磁盘设备了,我们得到的信息包括磁盘的名称和序号,当然WMI提供了非常多的属性值,要查询这些属性值,请参考Win32_DiskDrive类的描述
第二步,打开每一个设备,得到设备句柄,这些代码应该是出现在上面的其他工作部分
第三步,调用DeviceIoControl得到相应磁盘设备的分区布局
第四步,对相应磁盘分区布局内的每一个分区,判断它的分区符号
大致思路是:
我们已经知道了磁盘的序号,和磁盘上每一个分区的序号。
现在我们从分区符号a->z,分别打开这些盘符,得到各个盘符所在的磁盘序号和分区序号,与我们已知的磁盘序号以及分区序号对比,如果相等,就说明该盘符就位于我们当前枚举的磁盘设备的相应分区上。
注意:看到这里你也许会想,我们不是可以得到盘符对应的磁盘ID和分区ID么,那么我们直接从a->z枚举盘符不就解决了你说的问题么。
简单的说,您可以这么做。但是这样每一个磁盘可能存在以下的情况:【分区虽然存在,但是没有盘符。】
在这种情况下,磁盘上的分区将找不到它对应的盘符。也就是说,假如磁盘1分了3个区,而最后一个区没有盘符,则可能出现
分区1 c:/
分区2 d:/
分区3 无盘符
如果只是枚举a->z的盘符,则得到的结果就是
c:/ 位于分区1,磁盘1
d:/ 位于分区2,磁盘1
而我们无从知晓磁盘1上还存在有一个没有盘符的分区3