1

現在、 DriveInfo.GetDrives()を使用して、c#ですべてのドライブとそのラベルを取得できます。次に、この方法でディスクインデックス/パーティションのインデックスを取得できます。

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:\などではないことです。

では、最終的に、DriveInfoの名前プロパティであるボリュームラベルをDiskIndexに作成するにはどうすればよいですか?この方法論またはより良い方法のいずれかを使用すると機能します。

(これは次のとおりです。ドライブがパーティションなのか別のHDDなのかを確認してください

編集:Win32_LogicalDisk、次にWin32_LogicalDiskToPartition の管理クエリを見つけました。LogicalDiskにはボリュームがあり、LogicalDisktoParitionがマッピングを提供します。しかし、地図の入手方法がわからないようです。JOINを探して値を選択しようとしましたが、c#コードで大規模なループを行わずに、これをどのように結合するかについては何も見つかりませんでした。

4

2 に答える 2

6

しばらく前に私は同じ問題を抱えていました、そして私はこれらのコードでそれをします:

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;

および2つのサブメソッド:

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;

        }

このソリューションがお役に立てば幸いです。私にとって、この結果は下の写真のようになります ハードディスク情報

于 2014-02-28T12:24:24.050 に答える
3

Win32_LogicalDiskクラスを使用する必要があります。

編集:あなたは正しいWin32_LogicalDiskToPartitionです。Win32_LogicalDiskWin32_DiskPartitionの間のリンクです。Win32_LogicalDiskToPartitionクラスでは、これら2つのプロパティはリンクを表示します。

PS> Get-WmiObject -Class Win32_LogicalDiskToPartition

先行詞:\\ computer \ root \ cimv2:Win32_DiskPartition.DeviceID = "Disk#0、Partition#1"

依存:\\ computer \ root \ cimv2:Win32_LogicalDisk.DeviceID = "D:"

これらの2つのプロパティを解析し、他のクラスを適切にフィルタリングするだけです。

于 2012-02-03T15:15:59.620 に答える