2012-02-03 50 views
0

當前我可以使用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#代碼中沒有大量循環的情況下如何進行連接。

回答

2

您需要使用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

3

前一段時間我有同樣的問題,我用這些代碼做到這一點:

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