MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Получить общий свободный объем для каждого диска через WMI на C#"
Answer 940360
Используя класс Win32_LogicalDiskToPartition, который позволяет связать между собой логические диски и разделы. От раздела легко перейти к физическому диску по индексу. Как-то так:
using System; using System.IO; using System.Collections.Generic; using System.Text; using System.Management; namespace ConsoleApp1 { class Program { public struct WmiSelectionCondition { public string PropertyName { get; set; } public string PropertyValue { get; set; } } public struct LogicalDiskToPartition { public WmiSelectionCondition PartitionSelectionCondition { get; set; } public WmiSelectionCondition LogicalDiskSelectionCondition { get; set; } } //получает таблицу соответствия логических дисков и разделов public static List<LogicalDiskToPartition> GetPartitionMap() { ManagementObjectSearcher mos = new ManagementObjectSearcher( "SELECT Antecedent,Dependent FROM Win32_LogicalDiskToPartition" ); LogicalDiskToPartition item; WmiSelectionCondition condition; List<LogicalDiskToPartition> list = new List<LogicalDiskToPartition>(); string text; string[] arr, arr2; using (mos) { var moc = mos.Get(); foreach (ManagementObject mo in mos.Get()) { item = new LogicalDiskToPartition(); //Распарсим значения ref-полей класса Win32_LogicalDiskToPartition //Они имеют формат Class.Property="Value" text = mo["Antecedent"].ToString(); //Partition reference arr = text.Split(new char[] { '=', '"' }, StringSplitOptions.RemoveEmptyEntries); if (arr.Length >= 2) { arr2 = arr[0].Split(new char[] { ':', '.' }, StringSplitOptions.RemoveEmptyEntries); condition = new WmiSelectionCondition(); if (arr2.Length == 0) condition.PropertyName = ""; else condition.PropertyName = arr2[arr2.Length - 1]; condition.PropertyValue = arr[1]; item.PartitionSelectionCondition = condition; } text = mo["Dependent"].ToString(); //Logical disk reference arr = text.Split(new char[] { '=', '"' }, StringSplitOptions.RemoveEmptyEntries); if (arr.Length >= 2) { arr2 = arr[0].Split(new char[] { ':', '.' }, StringSplitOptions.RemoveEmptyEntries); condition = new WmiSelectionCondition(); if (arr2.Length == 0) condition.PropertyName = ""; else condition.PropertyName = arr2[arr2.Length - 1]; condition.PropertyValue = arr[1]; item.LogicalDiskSelectionCondition = condition; } list.Add(item); } } return list; } //выборка значения свойства из WMI-класса по заданному условию public static object WmiPerformSelection(string prop_to_select,string classname, WmiSelectionCondition condition ) { ManagementObjectSearcher mos = new ManagementObjectSearcher( String.Format( "SELECT {0} FROM {1} WHERE {2} = '{3}'", prop_to_select, classname, condition.PropertyName, condition.PropertyValue) ); foreach (ManagementObject mo in mos.Get()) { foreach (var prop in mo.Properties) { if (prop.Value != null) return prop.Value; } } return null; } //вычисляет свободное место на диске, заданном индексом public static long CalcDriveFreeSpace(List<LogicalDiskToPartition> map, int index) { long result = 0; foreach (var item in map) { object val = WmiPerformSelection("DiskIndex", "Win32_DiskPartition", item.PartitionSelectionCondition); if (val == null) continue; int item_index = Convert.ToInt32(val); if (item_index != index) continue; val = WmiPerformSelection("FreeSpace", "Win32_LogicalDisk", item.LogicalDiskSelectionCondition); if (val == null) continue; long freespace = Convert.ToInt64(val); result += freespace; } return result; } static void Main(string[] args) { var map = GetPartitionMap(); ManagementObjectSearcher mos = new ManagementObjectSearcher( String.Format( "SELECT Caption, Index, Size FROM Win32_DiskDrive") ); foreach (ManagementObject mo in mos.Get()) { object val = mo["Index"]; int index = Convert.ToInt32(val); string caption=""; if (mo["Caption"] != null) caption = mo["Caption"].ToString(); string size="0"; if (mo["Size"] != null) size = mo["Size"].ToString(); long freespace = CalcDriveFreeSpace(map, index); Console.WriteLine("{0}: {1} bytes total; {2} bytes free",caption, size, freespace); } Console.ReadKey(); } } }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.