【问题标题】:ReadFile doesn't signal EOF at the end of a PhysicalDriveReadFile 在 PhysicalDrive 的末尾没有发出 EOF 信号
【发布时间】: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(或失败)。

提前致谢。

【问题讨论】:

    标签: winapi eof readfile


    【解决方案1】:

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

    【讨论】:

    • 嗯,我不确定。根据 SDK 文档,只有在 ReadFile 返回 FALSE 时才需要调用 GetLastError,并且只有在执行 OVERLAPPED IO 时才需要检测 EOF。我的 ReadFile 调用的最后一个参数是一个 NULL 指针;我正在执行同步 IO。
    猜你喜欢
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    相关资源
    最近更新 更多