Czytanie pliku za pomocą FileStream i FILE_FLAG_NO_BUFFERING

Małe tło: eksperymentowałem z użyciem flagi FILE_FLAG_NO_BUFFERING podczas wykonywania operacji IO z dużymi plikami. Staramy się zmniejszyć obciążenie menedżera pamięci podręcznej w nadziei, że dzięki IO w tle zmniejszymy wpływ naszej aplikacji na komputery użytkowników. Wydajność nie jest problemem. Bycie za kulisami, na ile to możliwe, jest dużym problemem. Mam działający wrapper do wykonywania niebuforowanego IO, ale wpadłem na dziwny problem. Otrzymuję ten błąd, gdy dzwonię do odczytu z przesunięciem, które nie jest wielokrotnością 4.

Uchwyt nie obsługuje operacji synchronicznych. Parametry konstruktora FileStream mogą wymagać zmiany, aby wskazać, że uchwyt został otwarty asynchronicznie (to znaczy został otwarty jawnie dla nakładających się operacji we / wy).

Dlaczego to się dzieje? I czy to przesłanie nie jest sprzeczne z samym sobą? Jeśli dodam opcję pliku asynchronicznego, otrzymuję wyjątek IOException (parametr jest niepoprawny).

Wydaje mi się, że prawdziwe pytanie brzmi: jakie są te wymagania,http://msdn.microsoft.com/en-us/library/windows/desktop/cc644950%28v=vs.85%29.aspx, mam do czynienia z tymi wielokrotnościami 4.

Oto kod, który pokazuje problem:

FileOptions FileFlagNoBuffering = (FileOptions)0x20000000;
int MinSectorSize = 512;
byte[] buffer = new byte[MinSectorSize * 2];
int i = 0;
while (i < MinSectorSize)
{
    try
    {
        using (FileStream fs = new FileStream(@"<some file>", FileMode.Open, FileAccess.Read, FileShare.None, 8, FileFlagNoBuffering | FileOptions.Asynchronous))
        {
            fs.Read(buffer, i, MinSectorSize);
            Console.WriteLine(i);
        }
    }
    catch { }
    i++;
}
Console.ReadLine();

questionAnswers(2)

yourAnswerToTheQuestion