我可以从这样的驱动器字母中获取卷标(我想要的)..
try
{
DriveInfo[] myDrives = DriveInfo.GetDrives();
foreach (DriveInfo drive in myDrives)
{
Console.WriteLine("Drive:" + drive.Name);
Console.WriteLine("Drive Type:" + drive.DriveType);
if (drive.IsReady == true)
{
Console.WriteLine("Vol Label:" + drive.VolumeLabel);
}
}
}
catch (Exception)
{
throw;
}
但我想要一个驱动器号码的卷标。我可以用这个获得驱动器号码......
foreach (var drive in new ManagementObjectSearcher("Select * from Win32_LogicalDiskToPartition").Get().Cast<ManagementObject>().ToList())
{
var driveNumber = Regex.Match((string)drive["Antecedent"], @"Disk #(\d*),").Groups[1].Value;
Console.WriteLine("Drive Number: " + driveNumber);
Console.WriteLine(Environment.NewLine);
}
如何将一些东西放在一起以获取所有给定驱动器号的卷标(从显示的第二个代码块)?
更多信息:我无法使用“LogicalDisk ...”进行查询,因为我发现安装的vhds似乎不被视为“logicalDisks”
跟进你对Win32_LogicalDiskToPartition
的搜索,搜索Win32_LogicalDisk
过滤由确定的driveLetter拉回VolumeName
属性。
var drives = new ManagementObjectSearcher("Select * from Win32_LogicalDiskToPartition").Get().Cast<ManagementObject>();
var disks = new ManagementObjectSearcher("Select * from Win32_LogicalDisk").Get().Cast<ManagementObject>();
foreach (var drive in drives)
{
var driveLetter = Regex.Match((string)drive["Dependent"], @"DeviceID=""(.*)""").Groups[1].Value;
var driveNumber = Regex.Match((string)drive["Antecedent"], @"Disk #(\d*),").Groups[1].Value;
Console.WriteLine("Drive Letter: " + driveLetter);
Console.WriteLine("Drive Number: " + driveNumber);
// TODO: Enhance this to properly handle when the LINQ returns nothing.
// Likely only an edge case, but BSTS.
var foundDisk = disks.Where((d) => d["Name"].ToString() == driveLetter).FirstOrDefault();
// In the event that Drive Letter is not available, try the disk path
if (foundDisk == null) {
foundDisk = disks.Where((d) => d.Path.ToString() == drive["Dependent"].ToString()).FirstOrDefault();
}
if (foundDisk == null) {
Console.WriteLine("Drive Label: <Unknown>");
} else {
Console.WriteLine("Drive Label: " + foundDisk["VolumeName"]);
}
Console.WriteLine(Environment.NewLine);
}
您所谓的“驱动器号”在WMI用语中被命名为“磁盘索引”。您不必解析任何东西来建立WMI类之间的关系。
你只能从Win32_LogicalDisk的VolumeName
财产获得一个卷标。它也适用于已安装的VHD(X)。以下代码浏览所有分区(注意磁盘可以有多个分区)并转储关联的逻辑磁盘(注意分区可以有多个逻辑磁盘)卷名,如果有的话:
foreach (var partition in new ManagementObjectSearcher("SELECT * FROM Win32_DiskPartition").Get())
{
Console.WriteLine("Caption : " + partition["Caption"]);
Console.WriteLine("Disk Index : " + partition["DiskIndex"]);
// associate the partition with logical disk(s)
foreach (var logicalDisk in new ManagementObjectSearcher(
"ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" +
partition["DeviceID"] +
"'} WHERE AssocClass=Win32_LogicalDiskToPartition").Get())
{
Console.WriteLine(" " + logicalDisk["VolumeName"]);
}
}
如果您想要给定磁盘的分区和卷名,只需限制初始查询,例如:SELECT * FROM Win32_DiskPartition WHERE DiskIndex=1
。