ReadFile不会在PhysicalDrive结束时发出EOF信号

时间:2011-07-29 13:05:43

标签: winapi eof readfile

我正在尝试在Windows中实现dd等效项。 [澄清:我正在尝试复制dd的= / dev / hdb = = dev / hdb功能,以便将Windows安装迁移到更大的HD。很奇怪,我现在成功地使用了这种方法几次。 - G]

该程序可行(我最终将源数据复制到目标磁盘)但不会自行终止 - 一旦我确定已经读取了整个源磁盘,我必须完成它。

使用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()语句中尝试的。

ReadFile一旦读取了源PhysicalDrive上有效数据的末尾,就会返回空字节块。

知道何时停止阅读的正确方法是什么? - 我应该在开始之前使用IOCTL_DISK_GET_LENGTH_INFO吗?它似乎有点多余,因为ReadFile应该在读取超过磁盘末尾时报告EOF(或失败)。

提前致谢。

1 个答案:

答案 0 :(得分:0)

根据MSDN,您必须使用GetLastError检查ERROR_HANDLE_EOF。也许这有帮助。在这种情况下,它应该也返回0.