У меня есть некоторый код C #, который использует FileStreams для открытия PhysicalDrive и получения образа всего диска, но последовательно выдает IOException с сообщением «Ошибка данных (проверка циклическим избыточным кодом)». После копирования около 121 МБ диска 128 МБ.
using Microsoft.Win32.SafeHandles;
using System.IO;
using System;
[DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
protected static extern SafeFileHandle CreateFile(
string lpFileName,
uint dwDesiredAccess,
uint dwShareMode,
IntPtr SecurityAttributes,
uint dwCreationDisposition,
uint dwFlagsAndAttributes,
IntPtr hTemplateFile
);
public void MakeImage()
{
SafeFileHandle TheDevice = null;
try
{
TheDevice = CreateFile(@"\\.\PHYSICALDRIVE1", (uint)FileAccess.Read, (uint)0, IntPtr.Zero, (uint)FileMode.Open, (uint)FILE_ATTRIBUTE_SYSTEM, IntPtr.Zero);
if (TheDevice.IsInvalid) { throw new IOException("Unable to access drive. Win32 Error Code " + Marshal.GetLastWin32Error()); }
using (FileStream Dest = System.IO.File.Open("output.bin", FileMode.Create))
{
using (FileStream Src = new FileStream(TheDevice, FileAccess.Read))
{
Src.CopyTo(Dest);
Src.Close();
}
Dest.Close();
}
}
catch(Exception Ex)
{
//Here is where i am getting the IOException
//Handle error..
}
finally
{
if (TheDevice != null)
{
if (!TheDevice.IsClosed)
TheDevice.Close();
TheDevice.Dispose();
}
}
}
Я запустил Scan Disk на диске, о котором идет речь, и, похоже, с ним все в порядке. Если я изменю первый параметр CreateFile, чтобы просто прочитать раздел (а не то, что я хочу сделать), то изображение будет создано нормально.
Это продолжение реализации Windows C # команды linux dd , которую я пытался сделать.
UPDATE:
Дальнейшие исследования показывают, что ошибка связана с невозможностью получить или узнать свойство Src.Length. Я изменил свой код, чтобы копировать побайтово и вести подсчет, он выдает ошибки после 126959616 байт, что на 1 байт больше, чем общий размер изображения, созданного дд.