首页 > 解决方案 > ReadFile 在第二次调用时返回 INVALID_HANDLE

问题描述

我正在尝试仅使用 Windows API 以块的形式读取 PCAPNG 文件中的所有数据。

我第一次读取使用 ReadFile 的文件,并且返回的数据是正确的,但在我们随后的调用中,我们使用 INVALID_HANDLE 使 ReadFile 失败。

    HANDLE hFile;
    DWORD dwBytesToRead = 32;
    DWORD dwBytesRead = 0;
    DWORD ReadBuffer[2] = {0};

    hFile = CreateFile(LogPath.c_str(), 
            GENERIC_READ,
            0,
            NULL,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            NULL);
    if(hFile == INVALID_HANDLE_VALUE)
        return false;

    while(ReadFile(hFile, ReadBuffer, dwBytesToRead, &dwBytesRead, NULL) && dwBytesRead > 0)
    {
         std::cout << "Data from ReadBuffer[0]: " << ReadBuffer[0] << std::endl;
         std::cout << "Data from ReadBuffer[1]: " << ReadBuffer[1] << std::endl;
    }

    std::cout << "Failed with: " << GetLastError() << std::endl;
    CloseHandle(hFile);

在 ReadFile 的第一次迭代期间,我们能够成功读取文件的内容,但在循环的第二次迭代中,我们遇到了 INVALID_HANDLE 错误。

基于此文档的此 ReadFile 循环:https ://docs.microsoft.com/en-us/windows/win32/fileio/appending-one-file-to-another-file

我不确定我们失败的原因是什么。

我已经对 SetFilePointer 和 OVERLAPPED 结构进行了一些测试,但我都没有取得太大的成功。

我是否误解了 ReadFile API,或者这不是我正在寻找的正确方法?

标签: c++winapi

解决方案


您正在将 32 个字节读入一个只有 8 个字节长的缓冲区。

您需要更改ReadBuffer为更大,将类型从 a 更改DWORD为 16 字节长,或者更改dwBytesToRead为适当的大小(sizeof(ReadBuffer)并更改声明顺序)。


推荐阅读