目前使用http://www.codeproject.com/Articles/15487/Magnetic-Tape-Data-Storage-Part-Tape-Drive-IO-Co
中的代码让我们考虑以下代码:
public void Load(string tapeName)
{
// Try to open the file.
m_handleValue = CreateFile(
tapeName,
GENERIC_READ,
0,
IntPtr.Zero,
OPEN_EXISTING,
FILE_ATTRIBUTE_ARCHIVE | FILE_FLAG_BACKUP_SEMANTICS,
IntPtr.Zero
);
if (m_handleValue.IsInvalid)
{
DisplayError();
throw new TapeOperatorWin32Exception(
"CreateFile", Marshal.GetLastWin32Error());
}
m_stream = new FileStream(
m_handleValue,
FileAccess.Read,
32768,//65536,
false
);
}
private void TestRead()
{
byte[] buffer = new byte[32768];
m_stream.Read(buffer, 0, buffer.Length);
m_stream.Flush();
}
让我们称之为:
mTapeOperator.Load("\\\\.\\TAPE0");
mTapeOperator.TestRead();
我总是遇到以下异常:
句柄不支持同步操作。可能需要更改FileStream构造函数的参数以指示句柄是异步打开的(即,它是为重叠的I / O显式打开的。)
问题是,句柄是使用同步标志创建的,而FileStream是使用isAsync = false创建的。
完全相同的代码在我的C上随机文件中读取时工作正常:。
如果我使用BeginRead(异步)而不是Read(同步),在调用EndRead之前我没有异常。然后引发同样的异常。