2010-06-30 12 views
6

Ho scritto un piccolo widget WPF utilizzando C# che visualizza l'attività corrente della CPU, la RAM utilizzata e l'attività del disco come tre barre di piccolo tipo percentuale. Ho usato le seguenti PerformanceCounters per questo: (diskCounter PerformanceCounter ritorna l'attività del disco corrente totale in byte al secondo)Determinazione della velocità di trasferimento dati massima del disco rigido di un computer a livello di codice con 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); 
} 

Il problema è che, anche se ho scoperto come ottenere la RAM totale disponibile per calcolare una percentuale utilizzata da , Non riesco a scoprire come leggere la massima velocità di trasferimento dati "teorica" ​​del disco. Ho bisogno di questo per calcolare la percentuale di velocità di trasferimento del disco utilizzata. Qualsiasi aiuto sarebbe molto apprezzato.

risposta

2

L'unico modo per farlo sarebbe provarlo da soli. Si potrebbe fare qualcosa di simile, all'inizio della vostra applicazione:

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

Ciò, tuttavia, si supponga che la directory Temp è sul disco in questione. In caso contrario, dovrai creare un percorso sul disco che desideri misurare. Si noti che questo sta misurando la velocità di scrittura, non la velocità di lettura.

Questo è un po 'forzato dal momento che 1 MB non è molti dati da scrivere, ma è possibile provarlo con una quantità maggiore di dati; il concetto è lo stesso.

+0

come troverai il tasso massimo possibile? AFAIK dipende dalla posizione attuale dell'HD, quindi questo ti darà più o meno un risultato sbagliato o no? – InsertNickHere

+0

@InsertNickHere: l'unico modo per misurare la massima velocità possibile è scrivere sull'intero disco e misurare a intervalli. Hai ragione nel senso che ciò dipende da una serie di fattori, ma questo dovrebbe fornire almeno un'approssimazione utilizzabile. –

+0

Grazie Adam, ma non ho bisogno di nulla di così accurato ... la massima velocità teorica suggerita da Jonathan va bene. – Sheridan

1

Provare a utilizzare WMI api, anche LINQ to WMI può essere utile.

+0

Grazie per i collegamenti ... Li ho aggiunti ai segnalibri. :) – Sheridan

1

I Non so alcun modo per ottenere la massima velocità di trasferimento dati di un HD, ma con WMI è possibile ottenere l'intarface del disco rigido (USB, IDE ...). È possibile utilizzare la massima velocità di trasferimento dati dell'interfaccia e reffare la percentuale su di essa.

Inoltre, ho intenzione di lasciare un collegamento qui a un piccolo articolo su come ottenere informazioni dall'HD usando WMI, con il codice sorgente. LINK

+0

Grazie, questo suona come quello che sto cercando. Grazie anche per il collegamento, ma se stai parlando della classe Win32_LogicalDisk, non ho trovato il campo/attributo adatto che fornisce quell'informazione ... ti capiteresti di saperlo? – Sheridan

+1

Penso che il suo InterfaceType - http://msdn.microsoft.com/en-us/library/aa394132(VS.85).aspx Ecco un esempio: http://www.geekpedia.com/tutorial73_An-introduction-in -retrieving-WMI-in-Csharp.html – SwDevMan81

+0

Grazie a SwDevMan81, ci provo. – Sheridan

Problemi correlati