Я записал маленький виджет WPF с помощью C#, который отображает текущую активность ЦП, RAM используемая и активность диска как три печатающих штанги небольшого процента. Я использовал следующий PerformanceCounters для этого: (diskCounter PerformanceCounter возвращает текущую общую активность диска в байтах в секунду),
private void InitialisePerformanceCounters()
{
cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total", true);
totalRam = (int)(new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory / 1024 / 1024);
ramCounter = new PerformanceCounter("Memory", "Available MBytes");
diskCounter = new PerformanceCounter("PhysicalDisk", "Disk Bytes/sec", "_Total", true);
}
Проблема состоит в том, что, хотя я обнаружил, как заставить общую доступную RAM вычислять используемый процент от, я не могу узнать, как считать 'теоретическую' максимальную скорость передачи данных диска. Мне нужно это для вычисления процента дисковой используемой скорости передачи. Любая справка значительно ценилась бы.
Единственный способ сделать это - проверить это самостоятельно. Вы можете сделать что-то вроде этого в начале вашего приложения:
byte[] data = new byte[1024];
string path = System.IO.Path.GetTempFileName();
int bytesPerSecond = 0;
using (System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Create))
{
System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start();
for (int i = 0; i < 1024; i++) fs.Write(data, 0, data.Length);
fs.Flush();
watch.Stop();
bytesPerSecond = (int)((data.Length * 1024) / watch.Elapsed.TotalSeconds);
}
System.IO.File.Delete(path);
Однако это предполагает, что каталог Temp
находится на рассматриваемом диске. Если нет, вам нужно будет создать путь на диске, который вы хотите измерить. Обратите внимание, что это измерение скорости записи, а не чтения.
Это несколько надумано, поскольку 1 МБ - это не так много данных для записи, но вы можете попробовать это с большим объемом данных; концепция та же.
Попробуйте использовать WMI api, также может оказаться полезным LINQ to WMI .
Я не знаю никакого способа получить максимальную скорость передачи данных HD, но с WMI вы можете получить внутреннюю поверхность жесткого диска (USB, IDE ...). Вы можете использовать максимальную скорость передачи данных интерфейса и относиться к ней в процентах.
Также я собираюсь оставить здесь ссылку на небольшую статью о получении информации из HD с помощью WMI с исходным кодом. LINK