Cómo hacer grabaciones de archivos no almacenados en caché en la aplicación winform de C #

Estoy tratando de determinar la velocidad del disco en el peor de los casos, así que escribí la siguiente función.

static public decimal MBytesPerSec(string volume)
{
    string filename = volume + "\\writetest.tmp";

    if (System.IO.File.Exists(filename))
        System.IO.File.Delete(filename);

    System.IO.StreamWriter file = new System.IO.StreamWriter(filename);

    char[] data = new char[64000];
    Stopwatch watch = new Stopwatch();
    watch.Start();

    int i = 0;

    for (; i < 1000; i++)
    {
        file.Write(data);
        if (watch.ElapsedMilliseconds > 2000)
        {
            break;
        }
    }

    watch.Stop();
    file.Close();

    System.IO.File.Delete(volume + "\\test.txt");
    decimal mbytessec = (i * 64 / watch.ElapsedMilliseconds);
    return mbytessec;
}

La función funciona bien, pero las escrituras se almacenan en caché, por lo que la velocidad no es el peor de los casos.

En WIN32 C ++, simplemente crearía el archivo conFILE_FLAG_NO_BUFFERING, FILE_FLAG_WRITE_THROUGH opciones, y luego asegúrese de seguir las reglas de escritura no almacenadas en caché (escriba en el archivo con desplazamientos de tamaño de sector, con un mínimo de 4k escrituras)

Encontré unoartícul que analiza la técnica .NET.

Así que escribí una nueva función (ignorar los errores matemáticos).

static public decimal MBytesPerSecNonCached(string volume)
{
    const FileOptions FILE_FLAG_NO_BUFFERING = (FileOptions)0x20000000;

    string filename = volume + "\\writetest.tmp";

    using (FileStream fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None, 1024, FileOptions.WriteThrough | FILE_FLAG_NO_BUFFERING))
    {
        byte[] data = new byte[65535];
        int i = 0;

        Stopwatch watch = new Stopwatch();
        watch.Start();

        for (; i < 1000; i++)
        {
            fs.Write(data, 0, 65535);
            if (watch.ElapsedMilliseconds > 2000)
            {
                break;
            }
        }

        watch.Stop();
        fs.Close();

        System.IO.File.Delete(filename);

        decimal mbytessec = (i * 64 / watch.ElapsedMilliseconds);

        return mbytessec;
    }
}

Esta función funciona para tamaños de escritura de 4k, 16K y 32K, pero una vez que pruebo los tamaños de escritura de 64K, obtengo una excepción:

a operación @IO no funcionará. Lo más probable es que el archivo sea demasiado largo o que el identificador no se haya abierto para admitir operaciones de E / S sincrónicas.

Entonces, ¿cómo puedo solucionar esto para poder realizar pruebas con tamaños de escritura mayores de 32 KB (64 KB a 4096 KB)?

Respuestas a la pregunta(1)

Su respuesta a la pregunta