2010-06-30 3 views
6

현재 CPU 사용량, 사용 된 RAM 및 디스크 동작을 세 가지 작은 백분율 유형 막대로 표시하는 C#을 사용하여 작은 WPF 위젯을 작성했습니다. 나는이에 대해 다음 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); 
} 

문제는 내가 발견하지만 방법에서 사용되는 비율을 계산하기 위해 사용 가능한 총 RAM을 얻을 수 있다는 것입니다 , 나는 디스크의 '이론적 인'최대 데이터 전송 속도를 읽는 방법을 찾을 수 없습니다. 사용 된 디스크 전송 속도의 백분율을 계산하려면이 값이 필요합니다. 도움을 주시면 대단히 감사하겠습니다.

답변

2

이렇게하는 유일한 방법은 직접 테스트하는 것입니다. 당신은 당신의 응용 프로그램의 시작 부분에 이런 일을 할 수있는 : 이것은, 그러나, Temp 디렉토리가 문제의 디스크에 있다고 가정 않습니다

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

. 그렇지 않은 경우 측정하려는 디스크에 경로를 만들어야합니다. 이것은 읽기 속도가 아니라 쓰기 속도를 측정하는 것입니다.

1MB는 ​​많은 양의 데이터를 쓸 수 없기 때문에 다소 고안되었지만 더 많은 양의 데이터로 시도해 볼 수 있습니다. 개념은 동일합니다.

+0

가능한 최대 속도는 어떻게 찾을 수 있습니까? AFAIK 이것은 HD의 현재 위치에 따라 다르므로이 결과는 어느 정도 잘못된 결과를 줄 것인가 아닌가? – InsertNickHere

+0

@InsertNickHere : 가능한 최대 속도를 측정하는 유일한 방법은 전체 디스크에 기록하고 간격을 측정하는 것입니다. 이것이 여러 가지 요소에 달려 있다는 점에서 옳습니다. 그러나 이것은 적어도 사용 가능한 근사치를 제공해야합니다. –

+0

감사합니다. Adam,하지만 저는 그렇게 정확한 것을 필요로하지 않습니다 ... Jonathan이 제시 한 이론적 최대 속도는 괜찮습니다. – Sheridan

1

WMI API를 사용해보십시오. LINQ to WMI도 도움이 될 수 있습니다.

+0

링크를 제공해 주셔서 감사합니다 ... 북마크에 추가했습니다. :) – Sheridan

1

I HD의 최대 데이터 전송 속도를 얻는 방법을 모르지만 WMI를 사용하면 하드 디스크 (USB, IDE ...)의 intarface를 얻을 수 있습니다. 인터페이스의 최대 데이터 전송 속도를 사용하여 비율을 알 수 있습니다.

또한 소스 코드와 함께 WMI를 사용하여 HD 정보를 얻는 방법에 대한 간단한 기사를 남길 것입니다. LINK

+0

감사합니다. 또한 링크를 가져 주셔서 감사합니다. 그러나 Win32_LogicalDisk 클래스에 대해 이야기하고 있다면 해당 정보를 제공하는 적절한 필드/특성을 찾지 못했습니다. 알고 계시겠습니까? – Sheridan

+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

+0

감사합니다. SwDevMan81, 감사합니다. – Sheridan