【发布时间】:2011-10-15 22:59:29
【问题描述】:
我正在尝试在 Windows 中实现 dd 等效项。 [澄清:我正在尝试复制 dd 的 if=/dev/hda of=/dev/hdb 功能,以便将 Windows 安装迁移到更大的 HD。奇怪的是,我现在已经成功地使用了这种方法几次。 -G]
程序可以运行(我最终将源数据复制到目标磁盘)但不会自行终止 - 一旦我确定整个源磁盘已被读取,我必须对其进行 tskill。
在 CreateFile 调用中使用“\\.\PhysicalDriveX”语法打开和锁定源和目标物理驱动器没有问题。
我的问题是成功检测到源驱动器数据的结尾。
目前我正在使用以下方法读取 32K 块:
// doesn't work - won't detect End-of-valid drive data and reads endlessly
while (( success = ReadFile(hInfile, buffer, BUFSIZE, &nRead, NULL )) && nRead != 0) {
// ... write the data to the target drive; break if it fails.
// ... write a progress indicator to the console
}
// should execute but never does
if (! success) {
// an error occurred, do cleanup.
}
else {
// all done, unlock & close filehandles
puts("ta da!");
}
“正常”文件的 EOF(在同步 io 期间)由 ReadFile 返回 TRUE 发出信号,但将读取的字节数 (nRead) 设置为 0。这是我在笨拙的 while() 语句中尝试的。
一旦读取到源 PhysicalDrive 上有效数据的末尾,ReadFile 似乎会返回空字节块。
知道何时停止阅读的正确方法是什么? - 我应该在开始之前使用 IOCTL_DISK_GET_LENGTH_INFO 吗?这似乎有点多余,因为 ReadFile 应该在读取超过磁盘末尾时报告 EOF(或失败)。
提前致谢。
【问题讨论】: