2015-08-18 70 views
0

我喜歡在所有物理磁盤上看到每個分區/卷(也是隱藏的系統卷)。 卷的信息應包含用c#查看磁盤管理信息 - 含。隱藏卷

  • 分區索引(例如 「1」)
  • 名稱(如 「C:」),
  • 標籤(例如, 「窗口」)
  • 能力(例如, 200GB)

在我看來,「WMI」可以是解決此任務的正確選擇。

樣本輸出可以類似於此:

​​3210

我發現了幾個解決方案在網絡來獲取驅動器號(C :)用的DiskID(Disk0上)相結合。 One of those solution can be found here

public Dictionary<string, string> GetDrives() 
{ 
    var result = new Dictionary<string, string>(); 
    foreach (var drive in new ManagementObjectSearcher("Select * from Win32_LogicalDiskToPartition").Get().Cast<ManagementObject>().ToList()) 
    { 
    var driveLetter = Regex.Match((string)drive[ "Dependent" ], @"DeviceID=""(.*)""").Groups[ 1 ].Value; 
    var driveNumber = Regex.Match((string)drive[ "Antecedent" ], @"Disk #(\d*),").Groups[ 1 ].Value; 
    result.Add(driveLetter, driveNumber); 
    } 
    return result; 
} 

該解決方案的問題在於它忽略了隱藏的分區。輸出字典將只包含4個條目(m,4 - c,1 - d,1 - f,2)。

這是因爲使用「Win32_LogicalDiskToPartition」將「win32_logicalDisk」與「win32_diskpartion」組合在一起。但「win32_logicalDisk」不包含未分配的卷。

我只能在「win32_volume」中找到未分配的卷,但我無法將「win32_volume」與「win32_diskpartition」結合使用。


簡化我的數據類應該是這樣的:

public class Disk 
{ 
    public string Diskname; //"Disk0" or "0" or "PHYSICALDRIVE0" 
    public List<Partition> PartitionList; 
} 

public class Partition 
{ 
    public ushort Index //can be of type string too 
    public string Letter; 
    public string Label; 
    public uint Capacity; 

    //Example for Windows Partition 
    // Index = "1" or "Partition1" 
    // Letter = "c" or "c:" 
    // Label = "Windows" 
    // Capacity = "1000202039296" 
    // 
    //Example for System-reserved Partition 
    // Index = "0" or "Partition0" 
    // Letter = "" or "" 
    // Label = "System-reserved" 
    // Capacity = "104853504" 
} 


也許有人可以幫助:-)

回答

0

MSFT_Partition根\微軟\ WINDOWS \存儲有所有分區,包括隱藏的。我從該類中獲取DiskNumber和Offset,然後將它們與Win32_DiskPartition中的DiskIndex和StartingOffset值進行匹配。該組合應該提供唯一的標識符。

從Win32_DiskDrive開始,然後使用上面的方法獲取分區。 MSFT_Partition對象還具有一個名爲AccessPaths的屬性,該屬性將包含Win32_Volume中的DeviceID,您可以檢查它們是否將卷關聯到分區。的Win32_LogicalDisk然後也可以對分區使用您所描述的方法,像檢查:

using (ManagementObjectSearcher LogicalDiskSearcher = new ManagementObjectSearcher(new ManagementScope(ManagementPath.DefaultPath), new ObjectQuery(String.Format("ASSOCIATORS OF {{Win32_DiskPartition.DeviceID=\"{0}\"}} WHERE AssocClass = Win32_LogicalDiskToPartition", ((string)Partition["DeviceID"]).Replace("\\", "\\\\"))))) 

這將讓LogicalDisks集合從分區,如果有的話。如果其他人遇到類似的問題,希望能夠回答這個問題。不幸的是,MSFT_Partition僅在Windows 8/Server 2012及更高版本上可用。