読み取りディスクを raw モードで開く必要があるため、そのために CreateFile API 関数を使用しています。
private static FileStream OpenDisk(string drive)
{
// Try to open hard disk drive in raw mode for reading
SafeFileHandle safeHandle = Native.CreateFile(
string.Format(@"\\.\{0}", drive),
FileAccess.Read,
FileShare.Read,
IntPtr.Zero,
FileMode.Open,
FileAttributes.ReadOnly | FileAttributes.Device,
IntPtr.Zero);
// Check if the drive was successfully opened
if (safeHandle.IsInvalid)
{
Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
}
// Create file stream on the file for reading
return new FileStream(safeHandle, FileAccess.Read);
}
しかし、ストリームから読み込もうとすると、次のエラーが発生します
Handle does not support synchronous operations. The parameters to the FileStream constructor may need to be changed to indicate that the handle was opened asynchronously (that is, it was opened explicitly for overlapped I/O).
この問題を再現するサンプル コードは次のとおりです。
using (FileStream stream = OpenDisk("X:"))
{
byte[] buffer = new byte[1000];
while (stream.Read(buffer, 0, 1000) > 0) { }
}
私はそれが私に何を望んでいるのか本当にわかりませんか?より大きなバッファー (4096 など) を使用すると機能します。私がそれが機能すると言うとき、それは本当に(常に)機能することを意味します。バッファサイズを変更するまで、しばらくの間機能していました。内部である種の非同期バッファリングを行っていると思いますが、デフォルトのバッファリングサイズよりも大きなバッファを指定すると、それは使用されませんが、これを取り除くにはどうすればよいですか?
ありがとう
アップデート
BufferedStream を使用して読み取ろうとすると、同じ問題が発生します
using (BufferedStream stream = new BufferedStream(OpenDisk("X:"), 4096))
{
byte[] buffer = new byte[1000];
while (stream.Read(buffer, 0, 1000) > 0) { }
}
BufferedStream の間違った目的を理解していますか? 指定されたサイズのチャンクを読み取ってキャッシュするべきではありませんか?