如何通过卷标获取驱动器信息

10

我有一个包含卷标的txt文件。

我需要从驱动器卷标(Windows)获取驱动器信息(驱动器字母、驱动器大小等):

卷标格式如下:

\\?\Volume{XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}

这个驱动可以是可移动的或本地磁盘。

无论信息是如何检索的(可能是脚本、cpp、c#、Java代码),都没有关系。

编辑:

我试过使用DriveInfo、Win32_LogicalDisk、Win32_Volume、Win32_PnpDevices,但我找不到这个奇怪的ID...在所有情况下,ID都有不同的格式。

更新:

找到了解决方法。

你可以像这样枚举Win32_Volume:

ManagementObjectSearcher ms = new ManagementObjectSearcher("Select * from Win32_Volume");    
foreach(ManagementObject mo in ms.Get())   
{
    var guid = mo["DeviceID"].ToString();

    if(guid == myGuid)
        return mo["DriveLetter"];
}

你是怎么在文本文件中获取那个ID的?通过逆向工程来达到这个结果。 - Nikhil Agrawal
我正在尝试追踪“文件历史记录”(Windows 8中的新功能)保存其备份文件的位置。我发现目标设备名称保存在一个XML文件中,它还保存驱动器字母和名称,但这不足够,因为这些参数不是唯一的,可以更改:有人可以弹出设备,然后在下一次分配不同的字母等等...所以我发现微软还保存了类似以下内容的东西:“<TargetVolumePath> \?\Volume{XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} <\TargetVolumePath>”,这是唯一的ID。 - user844541
4个回答

3

卷大小等易于处理,只需使用常规的Win32方法即可。任何接受驱动器 "C:" 的函数也将接受卷 GUID 路径(因为这正是一个\\?\Volume{XXX}被正确称呼的名字)。

“驱动器字母”有点棘手,因为可能会有0、1或多个驱动器字母。您需要调用FindFirstVolumeMountPoint / FindNextVolumeMountPoint / FindVolumeMountPointClose来获取它们。


你能添加一个使用WMI的代码示例吗?我使用了GetVolumeNameForVolumeMountPoint,它可以工作,但是我无法使用wmi使其工作。 - user844541
请参考以下链接中的示例:http://msdn.microsoft.com/zh-cn/library/windows/desktop/aa394515(v=vs.85).aspx - MSalters

2
尝试使用这个。
System.Management.ManagementObjectSearcher ms =
new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
foreach (ManagementObject mo in ms.Get())
{
    //Find by ID
}

有关详细信息,请阅读此Win32_DiskDrive类


1
这里有一个相关的API函数:GetVolumePathNamesForVolumeName。它返回一个以null结尾的数组,以允许多个挂载点。如果你只有一个挂载点(通常情况下),那么你可以将其读取为一个普通的以null结尾的字符串。这比枚举磁盘/卷更有效率,因为后者可能会导致空闲磁盘启动。

-4
你可以使用 DriveInfo.GetDrives Method 来获取驱动器信息。以下是来自 MSDN 的示例代码。
DriveInfo[] allDrives = DriveInfo.GetDrives();

foreach (DriveInfo d in allDrives)
{
    Console.WriteLine("Drive {0}", d.Name);
    Console.WriteLine("  File type: {0}", d.DriveType);
    if (d.IsReady == true)
    {
        Console.WriteLine("  Volume label: {0}", d.VolumeLabel);
        Console.WriteLine("  File system: {0}", d.DriveFormat);
        Console.WriteLine(
            "  Available space to current user:{0, 15} bytes", 
            d.AvailableFreeSpace);

        Console.WriteLine(
            "  Total available space:          {0, 15} bytes",
            d.TotalFreeSpace);

        Console.WriteLine(
            "  Total size of drive:            {0, 15} bytes ",
            d.TotalSize);
    }
}

虽然此代码确实列出了计算机上当前安装的驱动器,但不幸的是它并没有回答这个问题(即如何通过GUID访问驱动器),因为在DriveInfo中没有与驱动器GUID相关的属性。 - jrh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接