我正在尝试在Windows中实现一个与dd相当的功能。[澄清:我试图复制dd的if = /dev/hda of = /dev/hdb功能,以便将Windows安装迁移到更大的硬盘上。令人惊讶的是,我已经成功地使用了这种方法几次。-G]
程序可以工作(源数据被复制到目标磁盘),但不会自动终止-我必须在确定整个源磁盘已被读取后才能使用tskill终止程序。
我没有问题使用“\\.\PhysicalDriveX”语法在CreateFile调用中打开和锁定源和目标物理驱动器。
我的问题在于成功检测源驱动器数据的末尾。
目前,我正在使用以下方式读取32K块:
程序可以工作(源数据被复制到目标磁盘),但不会自动终止-我必须在确定整个源磁盘已被读取后才能使用tskill终止程序。
我没有问题使用“\\.\PhysicalDriveX”语法在CreateFile调用中打开和锁定源和目标物理驱动器。
我的问题在于成功检测源驱动器数据的末尾。
目前,我正在使用以下方式读取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!");
}
当进行同步 io 时,对于“普通”文件的 EOF 是由 ReadFile 返回 TRUE,但将读取的字节数(nRead)设置为 0 来表示的。这就是我在我的 while() 语句中尝试的。
一旦 ReadFile 已经读取了源 PhysicalDrive 上有效数据的结尾,它似乎会返回一系列空字节块。
如何知道何时停止阅读? - 我应该在开始之前使用 IOCTL_DISK_GET_LENGTH_INFO 吗? 这似乎有点多余,因为 ReadFile 应该在读取磁盘结尾后报告 EOF(或失败)。
提前感谢您。