2010-06-30 47 views
6

我已经使用C#编写了一个小型WPF小部件,它将当前CPU活动,使用的RAM和磁盘活动显示为三个小百分比类型条。我已经使用了以下PerformanceCounters此:(diskCounter的PerformanceCounter以每秒字节返回当前总的磁盘活动)以编程方式确定计算机的最大硬盘驱动器数据传输速率使用C#

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); 
} 

的问题是,虽然我已经发现如何得到总的可用内存来计算从使用比例,我无法找到如何读取磁盘的'理论'最大数据传输率。我需要这个来计算使用的磁盘传输速率的百分比。 任何帮助将不胜感激。

回答

2

做到这一点的唯一方法就是自己测试一下。你可以在你的应用程序的开始做这样的事情:

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目录是有问题的磁盘上。如果不是,则必须在要测量的磁盘上创建一个路径。请注意,这是测量写入速度,而不是读取速度。

由于1MB并不需要写太多的数据,所以这是有点人为的,但是您可以使用大量数据来尝试;这个概念是一样的。

+0

你会如何找到最大可能的速度? AFAIK这取决于HD的当前位置,所以这或多或少会给你一个错误的结果,或者不是? – InsertNickHere 2010-06-30 16:04:36

+0

@InsertNickHere:测量最大可能速率的唯一方法是写入整个磁盘并间隔测量。你是正确的,这取决于许多因素,但这应该至少提供一个可用的近似值。 – 2010-06-30 16:06:55

+0

感谢Adam,但我不需要任何如此准确的东西...... Jonathan建议的理论最大比率很好。 – Sheridan 2010-06-30 16:25:33

1

尝试使用WMI API,也可以帮助LINQ to WMI

+0

感谢您的链接...我已经为它们添加了书签。 :) – Sheridan 2010-06-30 16:26:00

1

我不知道有什么方法可以获得HD的最大数据传输率,但通过WMI可以获得硬盘的内置面(USB,IDE ...)。你可以使用接口的最大数据传输速率,并减少你的百分比。

此外,我将在这里留下一个链接到一个关于使用WMI获取信息的HD的小文章,以及源代码。 LINK

+0

谢谢,这听起来像我以后。也感谢这个链接,但是如果你在谈论Win32_LogicalDisk类,我还没有找到提供这些信息的合适的字段/属性......你会碰巧知道它吗? – Sheridan 2010-06-30 16:23:06

+1

我认为它的InterfaceType - http://msdn.microsoft.com/en-us/library/aa394132(VS.85).aspx下面是一个例子:http://www.geekpedia.com/tutorial73_An-introduction-in -retrieving-WMI-in-Csharp.html – SwDevMan81 2010-06-30 17:51:53

+0

感谢SwDevMan81,我会放手一搏。 – Sheridan 2010-06-30 18:41:18