一点背景知识:在对大文件进行 IO 时,我一直在尝试使用 FILE_FLAG_NO_BUFFERING 标志。我们正在尝试减少缓存管理器的负载,希望通过后台 IO,我们将减少我们的应用程序对用户计算机的影响。性能不是问题。尽可能多地在幕后工作是一个大问题。我有一个接近工作的包装器来做无缓冲的 IO,但我遇到了一个奇怪的问题。当我使用不是 4 的倍数的偏移量调用 Read 时出现此错误。
句柄不支持同步操作。FileStream 构造函数的参数可能需要更改以指示句柄是异步打开的(即,它是为重叠 I/O 显式打开的)。
为什么会这样?这条信息不是自相矛盾吗?如果我添加异步文件选项,我会得到一个 IOException(参数不正确。)
我想真正的问题是这些要求是什么, http: //msdn.microsoft.com/en-us/library/windows/desktop/cc644950%28v=vs.85%29.aspx与这些倍数有关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();