如何枚举磁盘卷名?

How to enumerate disk volume names?

如何枚举磁盘上所有逻辑卷的列表?我想要适合用 CreateFile 打开的卷的名称。

你试过什么?

我使用 FindFirstVolume/FindNextVolume API 来枚举卷列表。它 return 是一个名称列表,例如:

但是这些卷名中的 none 是有效的卷名。也就是说,这些名称中的 none 可以传递给 CreateFile 以打开卷:

0x00000003 (The system cannot find the path specified)

问题 可能 是如何将 FindFirstVolume 编辑的东西 return 转换成卷姓名?

但真正的问题是我首先要如何枚举卷?

为什么不直接使用 \.\C:

我不是在问如何对卷名进行硬编码;我在问如何枚举卷名。

此外,并非每个卷都有盘符,例如:

我发誓有一个 API 来枚举卷。

GetLogicalDriveStrings

GetLogicalDriveStrings 函数的问题是它只有 return 逻辑 驱动器 :

而不是 。在我的例子中,它错过了两卷:

FindFirstVolume正确return。

红利阅读

您问题的答案隐藏在 Naming a Volume 中。使用 卷 GUID 路径 时,规则略有不同:

All volume and mounted folder functions that take a volume GUID path as an input parameter require the trailing backslash. [...] but this is not the case with the CreateFile function. You can open a volume by calling CreateFile and omit the trailing backslash from the volume name you specify. CreateFile processes a volume GUID path with an appended backslash as the root directory of the volume.

解决方案很简单:使用 CreateFile.

从卷 GUID 路径中删除结尾的反斜杠以打开卷

换句话说,同时卷管理功能如:

  • 获取卷信息
  • GetVolumePathNamesForVolumeName

do 获取 FindFirstVolume/FindNextVolume 返回的完整卷名,CreateFile 要求删除返回的尾部反斜杠:

  • \?\Volume{0b777018-3313-11e2-8ccd-806e6f6e6963}
  • \?\Volume{0b777019-3313-11e2-8ccd-806e6f6e6963}
  • \?\Volume{758a2cf2-cf3a-11e4-8dce-c86000d0b92a}
  • \?\Volume{4f81d34b-34f4-11e2-9f6e-c86000d0b92a}