我正在嘗試將驅動器鏈接到它們的磁區;代碼正在運行,并且正在將資料作為單個物件檢索。
"DeviceID_0": "\\.\PPHYSICALDRIVE0",
"SerialNumber_0": "52dT9SPRq9gCRv",
"Drive_letter0_0": "G:",
"Prtition_0_0": "Disk #0, Partition #0",
"Drive_letter0_1": "H:",
"Prtition_0_1": "Disk #0, Partition #1",
"DeviceID_1": "\\.\PHYSICALDRIVE`2`",
"SerialNumber_1": "bdUxR74dG3sZuL7Cw",
"Drive_letter1_0": "M:",
"Prtition_1_0": "Disk #1, Partition #0"
我很好奇是否有辦法獲得這樣一個更有吸引力的結構?
[
{
device_id: "\\\\.\\PHYSICALDRIVE0",
serial_number: "52dT9SPRq9gCRv",
partitions: [
{
letter: "G:",
partition: "Disk #0, Partition #0"
},
{
letter: "H:",
partition: "Disk #0, Partition #1"
}
]
},
{
device_id: "\\\\.\\PHYSICALDRIVE1",
serial_number: "bdUxR74dG3sZuL7Cw",
partitions: [
{
letter: "M:",
partition: "Disk #1, Partition #0"
}
]
}
]
我正在使用的 C# 中的方法。
public static Dictionary<string, string> LogicalDrives()
{
Dictionary<string, string> Drive = new Dictionary<string, string>();
using (ManagementObjectSearcher search = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive"))
{
int i = 0;
foreach (ManagementObject drive in search.Get())
{
Drive.Add("DeviceID_" i, drive["DeviceID"].ToString());
Drive.Add("SerialNumber_" i, drive["SerialNumber"].ToString());
string antecedent = drive["DeviceID"].ToString();
antecedent = antecedent.Replace(@"\", "\\");
string query = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" antecedent "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition";
using (ManagementObjectSearcher partitionSearch = new ManagementObjectSearcher(query))
{
int j = 0;
foreach (ManagementObject part in partitionSearch.Get())
{
query = "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" part["DeviceID"] "'} WHERE AssocClass = Win32_LogicalDiskToPartition";
using (ManagementObjectSearcher logicalpartitionsearch = new ManagementObjectSearcher(query))
{
foreach (ManagementObject logicalpartition in logicalpartitionsearch.Get())
{
Drive.Add("Drive_letter" i "_" j, logicalpartition["DeviceID"].ToString());
Drive.Add("Prtition_" i "_" j, part["DeviceID"].ToString());
}
}
j ;
}
}
i ;
}
}
return Drive;
}
我問是因為我嘗試使用string[][][], string[][], string[,], 也喜歡這樣
Dictionary<string, object> Drive = new Dictionary<string, object>();
,
Dictionary<string, Dictionary<string, object>> Drive = new Dictionary<string, Dictionary<string, object>>();
但不幸的是沒有運氣,或者我只是錯過了一些東西。
###########[在接受答案的幫助后]
我們設定了新的類來收集資料。
public class Device
{
public string DeviceId { get; set; }
public string SerialNumber { get; set; }
public List<Partition> Partitions { get; set; }
= new List<Partition>();
}
public class Partition
{
public string Letter { get; set; }
public string PartitionName { get; set; }
}
這里還有更新的方法:
public static List<Device> LogicalDrives()
{
var results = new List<Device>();
using (ManagementObjectSearcher search = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive"))
{
foreach (ManagementObject drive in search.Get())
{
/////////////////////
//This was updated
var device = new Device();
device.DeviceId = drive["DeviceID"].ToString();
device.SerialNumber = drive["SerialNumber"].ToString();
results.Add(device);
//This was updated
/////////////////////
string antecedent = drive["DeviceID"].ToString();
antecedent = antecedent.Replace(@"\", "\\");
string query = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" antecedent "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition";
using (ManagementObjectSearcher partitionSearch = new ManagementObjectSearcher(query))
{
foreach (ManagementObject part in partitionSearch.Get())
{
query = "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" part["DeviceID"] "'} WHERE AssocClass = Win32_LogicalDiskToPartition";
using (ManagementObjectSearcher logicalpartitionsearch = new ManagementObjectSearcher(query))
{
foreach (ManagementObject logicalpartition in logicalpartitionsearch.Get())
{
/////////////////////
//This was updated
var partition = new Partition();
partition.Letter = logicalpartition["DeviceID"].ToString();
partition.PartitionName = part["DeviceID"].ToString();
device.Partitions.Add(partition);
//This was updated
/////////////////////
}
}
}
}
}
}
var resultStr = JsonConvert.SerializeObject(results, Formatting.Indented);
Console.WriteLine(resultStr);
return results;
}
該方法的實際結果輸出:
[
{
"DeviceId": "\\\\.\\PHYSICALDRIVE3",
"SerialNumber": "240881765286406",
"Partitions": [
{
"Letter": "G:",
"PartitionName": "Disk #3, Partition #0"
},
{
"Letter": "H:",
"PartitionName": "Disk #3, Partition #1"
}
]
},
{
"DeviceId": "\\\\.\\PHYSICALDRIVE2",
"SerialNumber": "6479_A749_C020_0781.",
"Partitions": [
{
"Letter": "D:",
"PartitionName": "Disk #2, Partition #0"
}
]
},
{
"DeviceId": "\\\\.\\PHYSICALDRIVE1",
"SerialNumber": "E823_8FA6_BF53_0001_001B_448B_48A1_E1DB.",
"Partitions": [
{
"Letter": "C:",
"PartitionName": "Disk #1, Partition #1"
}
]
},
{
"DeviceId": "\\\\.\\PHYSICALDRIVE0",
"SerialNumber": " Z6EPB01AS",
"Partitions": [
{
"Letter": "F:",
"PartitionName": "Disk #0, Partition #0"
}
]
}
]
uj5u.com熱心網友回復:
創建一些模型以使其更容易
public class Device
{
public string DeviceId { get; set; }
public string SerialNumber { get; set; }
public List<Partition> Partitions { get; set; }
= new List<Partition>();
}
public class Partition
{
public string Letter { get; set; }
public string PartitionName { get; set; }
}
現在只需添加所有設備。
var results = new List<Device>();
...
編輯:
對于磁區
var device = new Device();
results.Add(device);
// foreach partition
var partition = new Partition();
partition.Letter = "...";
partition.PartitionName = "...";
device.Partitions.Add(partition);
要列印結果,您可以執行
var resultStr = JsonConvert.SerializeObject(results, Formatting.Indented);
Console.WriteLine(resultStr);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/434492.html
上一篇:無法將字串正確添加到字典中
