将DiskIndex映射到卷标

问题描述:

当前我可以使用DriveInfo.GetDrives()在c#中获取所有驱动器及其标签。然后我可以通过这种方法获得分区的磁盘索引/索引。将DiskIndex映射到卷标

var searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_DiskPartition"); 

foreach (var queryObj in searcher.Get()) 
{ 
    Console.WriteLine("-----------------------------------"); 
    Console.WriteLine("Win32_DiskPartition instance"); 
    Console.WriteLine("Name:{0}", (string)queryObj["Name"]); 
    Console.WriteLine("Index:{0}", (uint)queryObj["Index"]); 
    Console.WriteLine("DiskIndex:{0}", (uint)queryObj["DiskIndex"]); 
    Console.WriteLine("BootPartition:{0}", (bool)queryObj["BootPartition"]); 
} 

这样做的问题是,DiskIndex,名称和索引基本上只是数字,而不是卷标,即C:\ d:\,等...

那么底线如何我可以将卷标设为Name Proprty on the DriveInfo到DiskIndex吗?无论是使用这种方法或更好的方式将工作。

(这是一个后续到:Tell if a Drive is a partition or a separate HDD

编辑: 我确实发现了Win32_LogicalDisk的管理查询,然后Win32_LogicalDiskToPartition。 LogicalDisk具有卷,LogicalDisktoParition提供映射。但是,我似乎无法弄清楚如何获得地图。我试图寻找一个JOIN并选择值,但找不到在c#代码中没有大量循环的情况下如何进行连接。

您需要使用Win32_LogicalDisk类。

编辑:你是对的Win32_LogicalDiskToPartition。是Win32_LogicalDiskWin32_DiskPartition之间的链接。上Win32_LogicalDiskToPartition类,这两个属性显示的链接,

PS>获取-WmiObject可以-Class Win32_LogicalDiskToPartition

先行:\\计算机\根\ CIMV2:Win32_DiskPartition.DeviceID =“磁盘#0,分区#1 “

从属:\\计算机\根\ CIMV2:Win32_LogicalDisk.DeviceID =” d:”

只要解析这两种性质并适当筛选的其他类。

+0

看到我的编辑,我刚刚添加。 – 2012-02-03 15:19:45

+0

我正在考虑解决方案,但有没有办法做这个查询。我的意思是我看到SELECT * FROM,并且认为像SQL这样基本上“加入”“表”。所以它会像SELECT Win32_LogicalDisk.DeviceID,Win32_DiskPartition.DiskIndex FROM Win32_LogicalDiskToPartition INNER JOIN ...你得到的图片。 – 2012-02-03 16:28:50

+0

不幸的是,WQL中没有连接构造。您可以从每个WMI类中选择一切,然后使用LINQ进行连接。你将不得不分析先行/依赖的价格。幸运的是,你拥有的分区和卷的数量相当小。 – 2012-02-03 18:48:43

前一段时间我有同样的问题,我用这些代码做到这一点:

ListViewGroup hddgrp; 
       lstHDD.Columns.Add("Disk"); 
       lstHDD.Columns.Add("Patition"); 
       lstHDD.Columns.Add("Free Space"); 
       lstHDD.Columns.Add("Total Space"); 

       lstHDD.View = View.Details; 
       String DiskName = ""; 
       String PartState = ""; 
       String PartName = ""; 
       String PartFree = ""; 
       ManagementObjectSearcher hdd = new ManagementObjectSearcher("Select * from Win32_DiskDrive"); 
       foreach (ManagementObject objhdd in hdd.Get()) 
       { 
        PartState = ""; 
        DiskName = "Disk " + objhdd["Index"].ToString() + " : " + objhdd["Caption"].ToString().Replace(" ATA Device", "") + 
         " (" + Math.Round(Convert.ToDouble(objhdd["Size"])/1073741824,1) + " GB)"; 
        hddgrp = lstHDD.Groups.Add(DiskName, DiskName); 
        ObjCount = Convert.ToInt16(objhdd["Partitions"]); 
        ManagementObjectSearcher partitions = new ManagementObjectSearcher(
         "Select * From Win32_DiskPartition Where DiskIndex='" + objhdd["Index"].ToString() + "'"); 
        foreach(ManagementObject part in partitions.Get()) 
        { 
         PartName = part["DeviceID"].ToString(); 
         if (part["Bootable"].ToString() == "True" && part["BootPartition"].ToString() == "True") 
          PartState = "Recovery"; 
         else 
         { 
          ManagementObjectSearcher getdisks = new ManagementObjectSearcher 
           ("Select * From Win32_LogicalDiskToPartition Where "); 
          PartState = GetPartName(PartName); 
          PartFree = GetFreeSpace(PartState); 
          PartState = "Local Disk (" + PartState + ")"; 
         } 

         lstHDD.Items.Add(new ListViewItem(new String[] { "Partition " + part["Index"].ToString(), 
          PartState,PartFree ,Math.Round(Convert.ToDouble(part["Size"].ToString())/1073741824,1) + " GB"}, hddgrp)); 
        } 
       } 
       lstHDD.Columns[0].Width = 80; 
       lstHDD.Columns[1].Width = 120; 
       lstHDD.Columns[2].Width = 100; 
       lstHDD.Columns[3].Width = 100; 

和两个子方法:

private String GetFreeSpace(String inp) 
     { 
      String totalspace = "", freespace = "", freepercent = ""; 
      Double sFree = 0, sTotal = 0, sEq = 0; 
      ManagementObjectSearcher getspace = new ManagementObjectSearcher("Select * from Win32_LogicalDisk Where DeviceID='" + inp +"'"); 
      foreach (ManagementObject drive in getspace.Get()) 
      { 
       if (drive["DeviceID"].ToString() == inp) 
       { 
        freespace = drive["FreeSpace"].ToString(); 
        totalspace = drive["Size"].ToString(); 
        sFree = Convert.ToDouble(freespace); 
        sTotal = Convert.ToDouble(totalspace); 
        sEq = sFree * 100/sTotal; 
        freepercent = (Math.Round((sTotal - sFree)/1073741824, 2)).ToString() + " (" + Math.Round(sEq,0).ToString() + " %)"; 
        return freepercent; 
       } 
      } 
      return ""; 
     } 
     private String GetPartName(String inp) 
     { 
      //MessageBox.Show(inp); 
      String Dependent = "", ret = ""; 
      ManagementObjectSearcher LogicalDisk = new ManagementObjectSearcher("Select * from Win32_LogicalDiskToPartition"); 
      foreach (ManagementObject drive in LogicalDisk.Get()) 
      { 
       if (drive["Antecedent"].ToString().Contains(inp)) 
       { 
        Dependent = drive["Dependent"].ToString(); 
        ret = Dependent.Substring(Dependent.Length - 3, 2); 
        break; 
       } 

      } 
      return ret; 

     } 

我希望这个解决方案是有益的。 对我来说,这个结果如下图 Hard Disks Informations