La determinación de la velocidad de transferencia de datos máxima de disco duro de un ordenador mediante programación con C #

StackOverflow https://stackoverflow.com/questions/3150956

Pregunta

I haber escrito un pequeño WPF de widgets utilizando C # que muestra la actividad de la CPU, RAM utilizada y la actividad del disco como tres pequeñas barras de tipo porcentaje actuales. He utilizado las siguientes PerformanceCounters para esto: (diskCounter PerformanceCounter devuelve actividad de disco total actual en bytes por segundo)

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

El problema es que aunque he descubierto cómo conseguir la RAM total disponible para calcular un porcentaje usado de, no puedo encontrar la manera de leer tasa 'teórico' máxima de transferencia de datos del disco. Necesito esto para calcular el porcentaje de tasa de transferencia de disco utilizado. Cualquier ayuda sería muy apreciada.

¿Fue útil?

Solución

La única manera de hacer esto sería probar por sí mismo. Se podría hacer algo como esto en el comienzo de su aplicación:

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

Esto, sin embargo, se supone que el directorio Temp está en el disco en cuestión. Si no es así, tendrá que crear un camino en el disco que desea medir. Tenga en cuenta que se trata de medir la velocidad de escritura, no la velocidad de lectura.

Esto se ideó un poco desde 1 MB no es la cantidad de datos a escribir, pero se puede tratar con una mayor cantidad de datos; el concepto es el mismo.

Otros consejos

Trate de usar WMI api, también LINQ a WMI puede ser de ayuda.

No sé de ninguna manera de obtener la máxima velocidad de transferencia de datos de un HD, pero con WMI se puede obtener el intarface del disco duro (USB, IDE ...). Se podría utilizar la velocidad de transferencia de datos máxima de la interfaz y su reffers porcentuales a la misma.

Además, voy a dejar un enlace aquí a un pequeño artículo acerca de obtener información frm el HD mediante WMI, con el código fuente. ENLACE

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top