Сопоставить DiskIndex с меткой тома - PullRequest
1 голос
/ 03 февраля 2012

В настоящее время я могу получить все диски и их метки в c # с помощью DriveInfo.GetDrives () . Затем я могу получить индекс диска / индекс раздела по этой методологии.

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, Name и Index в основном просто числа, а не метка тома, то есть C: \, D: \ и т. Д. *

Итак, суть в том, как сделать метку тома, которая является Name Proprty на DriveInfo для DiskIndex? Либо использовать эту методологию, либо лучше.

(Это следующее: Скажите, является ли диск разделом или отдельным жестким диском )

EDIT: Я нашел для запроса управления Win32_LogicalDisk , а затем Win32_LogicalDiskToPartition . LogicalDisk имеет объем, а LogicalDisktoParition обеспечивает сопоставление. Тем не менее, я не могу понять, как получить карту. Я попытался найти JOIN и выбрать значения, но не смог найти ничего о том, как сделать это объединение без обширного цикла в коде c #.

Ответы [ 2 ]

6 голосов
/ 28 февраля 2014

некоторое время назад у меня была такая же проблема, и я делаю это с помощью следующего кода:

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

3 голосов
/ 03 февраля 2012

Вам необходимо использовать класс Win32_LogicalDisk .

Редактировать: Вы правы Win32_LogicalDiskToPartition .Является ли связь между Win32_LogicalDisk и Win32_DiskPartition Win32_LogicalDiskToPartition классе эти два свойства показывают ссылки,

PS> Get-WmiObject -Class Win32_LogicalDiskToPartition

Antecedent: \\ computer \ root \ cimv2: Win32_DiskPartition.DeviceID = "Диск № 0, Раздел № 1"

Зависимый: \\ computer \ root \ cimv2: Win32_LogicalDisk.DeviceID = "D:"

Просто проанализируйте эти два свойства и отфильтруйте остальные классы соответствующим образом.

...