【问题标题】:How to get drive information by volume id如何通过卷 ID 获取驱动器信息
【发布时间】:2012-04-17 06:33:53
【问题描述】:

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

我需要从驱动器卷 ID (Windows) 中获取驱动器信息(驱动器号、驱动器大小等):

卷 id 的格式如下:

\\?\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"];
}

【问题讨论】:

  • 你是如何在 txt 文件中获得该 ID 的。对其进行逆向工程以获得结果。
  • 我正在尝试跟踪“文件历史记录”(Windows 8 中的新功能)保存备份文件的位置。我发现目标设备名称保存在一个xml文件中,它还保存了驱动器号和名称,但这还不够,因为这些参数不是唯一的,可以更改:somene可以弹出设备,然后在下次它将分配一个不同的字母,等等......所以我发现微软还保存了如下所示的内容:“ \\?\Volume{XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} " 这是唯一的 id。

标签: c# c++ drive driveinfo


【解决方案1】:

体积大小等很容易。只需使用正常的 Win32 方法即可。任何接受 "C:" 作为驱动器的函数也将接受 volume GUID 路径(因为这是正确调用 \\?\Volume{XXX} 的内容)。

“驱动器号”有点棘手,因为可能有 0、1 或多个驱动器号。您需要致电FindFirstVolumeMountPoint / FindNextVolumeMountPoint / FindVolumeMountPointClose 获取所有这些信息。

【讨论】:

【解决方案2】:

试试这个

System.Management.ManagementObjectSearcher ms =
new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
foreach (ManagementObject mo in ms.Get())
{
    //Find by ID
}

详情请戳Win32_DiskDrive class

【讨论】:

    【解决方案3】:

    为此有一个 API 函数: GetVolumePathNamesForVolumeName

    它返回一个以空结尾的数组,以允许多个挂载点。如果您只有一个挂载点(典型),那么您可以将其读取为常规的以空字符结尾的字符串。

    这比枚举磁盘/卷更有效,这可能导致空闲磁盘启动。

    【讨论】:

      【解决方案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。
      猜你喜欢
      • 2016-10-02
      • 1970-01-01
      • 2017-12-08
      • 2022-12-18
      • 2015-09-03
      • 2020-06-23
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多