将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_LogicalDisk和Win32_DiskPartition之间的链接。上Win32_LogicalDiskToPartition类,这两个属性显示的链接,
PS>获取-WmiObject可以-Class Win32_LogicalDiskToPartition
先行:\\计算机\根\ CIMV2:Win32_DiskPartition.DeviceID =“磁盘#0,分区#1 “
从属:\\计算机\根\ CIMV2:Win32_LogicalDisk.DeviceID =” d:”
只要解析这两种性质并适当筛选的其他类。
前一段时间我有同样的问题,我用这些代码做到这一点:
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;
}
我希望这个解决方案是有益的。 对我来说,这个结果如下图
看到我的编辑,我刚刚添加。 – 2012-02-03 15:19:45
我正在考虑解决方案,但有没有办法做这个查询。我的意思是我看到SELECT * FROM,并且认为像SQL这样基本上“加入”“表”。所以它会像SELECT Win32_LogicalDisk.DeviceID,Win32_DiskPartition.DiskIndex FROM Win32_LogicalDiskToPartition INNER JOIN ...你得到的图片。 – 2012-02-03 16:28:50
不幸的是,WQL中没有连接构造。您可以从每个WMI类中选择一切,然后使用LINQ进行连接。你将不得不分析先行/依赖的价格。幸运的是,你拥有的分区和卷的数量相当小。 – 2012-02-03 18:48:43