Como fazer gravações de arquivos não em cache no aplicativo winform C #

Estou tentando determinar a velocidade do disco na pior das hipóteses, então escrevi a seguinte funçã

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

A função funciona bem, mas as gravações estão sendo armazenadas em cache, portanto a velocidade não é o pior cas

No WIN32 C ++, eu simplesmente criaria o arquivo comFILE_FLAG_NO_BUFFERING, FILE_FLAG_WRITE_THROUGH opções e siga as regras de gravação não armazenadas em cache (grave no arquivo com deslocamentos de tamanho de setor, com no mínimo 4k gravações)

Eu encontrei umartig que discute a técnica .NET.

ntão escrevi uma nova função (ignore os erros de matemática

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 função funciona para tamanhos de gravação de 4k, 16K e 32K, mas depois de experimentar os tamanhos de gravação de 64K, recebo uma exceção:

operação do @IO não funcionará. Provavelmente, o arquivo ficará muito longo ou o identificador não foi aberto para oferecer suporte a operações de E / S síncrona

ntão, como posso corrigir isso para testar com tamanhos de gravação maiores que 32 KB (64 KB a 4096 KB

questionAnswers(1)

yourAnswerToTheQuestion