如何枚举磁盘卷名?
How to enumerate disk volume names?
如何枚举磁盘上所有逻辑卷的列表?我想要适合用 CreateFile
打开的卷的名称。
你试过什么?
我使用 FindFirstVolume
/FindNextVolume
API 来枚举卷列表。它 return 是一个名称列表,例如:
\?\Volume{0b777018-3313-11e2-8ccd-806e6f6e6963}\
\?\Volume{0b777019-3313-11e2-8ccd-806e6f6e6963}\
\?\Volume{758a2cf2-cf3a-11e4-8dce-c86000d0b92a}\
\?\Volume{4f81d34b-34f4-11e2-9f6e-c86000d0b92a}\
但是这些卷名中的 none 是有效的卷名。也就是说,这些名称中的 none 可以传递给 CreateFile
以打开卷:
0x00000003 (The system cannot find the path specified)
问题 可能 是如何将 FindFirstVolume
编辑的东西 return 转换成卷姓名?
但真正的问题是我首先要如何枚举卷?
为什么不直接使用 \.\C:
?
我不是在问如何对卷名进行硬编码;我在问如何枚举卷名。
此外,并非每个卷都有盘符,例如:
\?\Volume{0b777019-3313-11e2-8ccd-806e6f6e6963}\
==> \.\C:
\?\Volume{758a2cf2-cf3a-11e4-8dce-c86000d0b92a}\
==> \.\D:
\?\Volume{0b777018-3313-11e2-8ccd-806e6f6e6963}\
==> 没有盘符的系统保留卷
\?\Volume{4f81d34b-34f4-11e2-9f6e-c86000d0b92a}\
==> 安装在文件夹中的光盘
我发誓有一个 API 来枚举卷。
GetLogicalDriveStrings
GetLogicalDriveStrings 函数的问题是它只有 return 逻辑 驱动器 :
C:\
D:\
而不是 卷 。在我的例子中,它错过了两卷:
- 系统保留
- D:\CDROM
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}
如何枚举磁盘上所有逻辑卷的列表?我想要适合用 CreateFile
打开的卷的名称。
你试过什么?
我使用 FindFirstVolume
/FindNextVolume
API 来枚举卷列表。它 return 是一个名称列表,例如:
\?\Volume{0b777018-3313-11e2-8ccd-806e6f6e6963}\
\?\Volume{0b777019-3313-11e2-8ccd-806e6f6e6963}\
\?\Volume{758a2cf2-cf3a-11e4-8dce-c86000d0b92a}\
\?\Volume{4f81d34b-34f4-11e2-9f6e-c86000d0b92a}\
但是这些卷名中的 none 是有效的卷名。也就是说,这些名称中的 none 可以传递给 CreateFile
以打开卷:
0x00000003 (The system cannot find the path specified)
问题 可能 是如何将 FindFirstVolume
编辑的东西 return 转换成卷姓名?
但真正的问题是我首先要如何枚举卷?
为什么不直接使用 \.\C:
?
我不是在问如何对卷名进行硬编码;我在问如何枚举卷名。
此外,并非每个卷都有盘符,例如:
\?\Volume{0b777019-3313-11e2-8ccd-806e6f6e6963}\
==>\.\C:
\?\Volume{758a2cf2-cf3a-11e4-8dce-c86000d0b92a}\
==>\.\D:
\?\Volume{0b777018-3313-11e2-8ccd-806e6f6e6963}\
==> 没有盘符的系统保留卷\?\Volume{4f81d34b-34f4-11e2-9f6e-c86000d0b92a}\
==> 安装在文件夹中的光盘
我发誓有一个 API 来枚举卷。
GetLogicalDriveStrings
GetLogicalDriveStrings 函数的问题是它只有 return 逻辑 驱动器 :
C:\
D:\
而不是 卷 。在我的例子中,它错过了两卷:
- 系统保留
- D:\CDROM
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
.
换句话说,同时卷管理功能如:
- 获取卷信息
- 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}