2010-06-30 78 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