win32 在 C 中使用带有 ReadFile/WriteFile 的 while 循环从一个程序写入一个新程序

par*_*ter 1 file-io winapi while-loop

我编写了一个程序,它从一个文件中读取文本并将其复制到一个新文件中。使用 while 循环和 ReadFile/Writefile 函数,我的程序可以工作……但我的程序不会停止运行,除非我强制停止它。我猜我没有正确关闭我的句柄,或者我的 while 循环可能设置错误。一旦我强制停止我的程序,文件就会以新名称成功复制到新位置。

int n = 0;
while(n=ReadFile(hFileSource, buffer, 23, &dwBytesRead, NULL)){
    WriteFile(hFileNew, buffer, dwBytesRead, &dwBytesWritten, NULL);
}       

CloseHandle(hFileSource);
CloseHandle(hFileNew);

return 0;
Run Code Online (Sandbox Code Playgroud)

Jon*_*ter 5

您没有正确测试文件结尾。ReadFileEOF 不返回失败,它返回成功但读取了 0 个字节。要正确检查 EOF:

while (ReadFile(hFileSource, buffer, 23, &dwBytesRead, NULL))
{
    if (dwBytesRead == 0)
        break;
    // write data etc
}
Run Code Online (Sandbox Code Playgroud)

有什么理由一次只能读/写 23 个字节吗?这将是相当低效的。

  • 我会选择将循环更改为 `do/while` 并将 `ReadFile()` 调用移动到循环内,以便它可以对 `ReadFile()` 进行错误处理并报告任何读取错误并丢弃不完整的目标如果源文件无法正确读取文件。否则,您必须在循环退出后检查错误,但您不知道是“ReadFile()”还是“WriteFile()”出错。 (4认同)