少し背景:大きなファイルでIOを実行するときに、FILE_FLAG_NO_BUFFERINGフラグを使用して実験してきました。バックグラウンドIOを使用して、ユーザーマシンへのアプリの影響を減らすことを期待して、キャッシュマネージャーの負荷を軽減しようとしています。パフォーマンスは問題ではありません。可能な限り舞台裏にいることは大きな問題です。バッファリングされていないIOを実行するためのほぼ機能するラッパーがありますが、奇妙な問題が発生しました。4の倍数ではないオフセットを使用してReadを呼び出すと、このエラーが発生します。
Handleは同期操作をサポートしていません。FileStreamコンストラクターのパラメーターを変更して、ハンドルが非同期で開かれた(つまり、重複したI / Oのために明示的に開かれた)ことを示す必要がある場合があります。
なぜこれが起こるのですか?そして、このメッセージはそれ自体と矛盾していませんか?非同期ファイルオプションを追加すると、IOExceptionが発生します(パラメーターが正しくありません)。
本当の問題は、これらの要件( http://msdn.microsoft.com/en-us/library/windows/desktop/cc644950%28v=vs.85%29.aspx)がこれらの倍数と何の関係があるかということだと思います。 4.4。
この問題を示すコードは次のとおりです。
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();