c++ - 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,或者这不是我正在寻找的正确方法?
解决方案
您正在将 32 个字节读入一个只有 8 个字节长的缓冲区。
您需要更改ReadBuffer
为更大,将类型从 a 更改DWORD
为 16 字节长,或者更改dwBytesToRead
为适当的大小(sizeof(ReadBuffer)
并更改声明顺序)。
推荐阅读
- caching - “缓存控制:公共”实际上有什么效果吗?
- flutter - 使 showModalBottomSheet() 高度根据内容调整
- flutter - 这里我的列表视图没有滚动飞镖颤振,请帮助我我是颤振新手
- javascript - 有人可以向我解释为什么这种语法使用括号而不是大括号,在 reduce 方法中添加逗号并且不再“返回”吗?
- excel - 求和公式在单独的 Evaluate 函数中工作,但不能组合
- python - 什么会导致迭代 PyTrend 关键字的此函数的范围列表索引?
- javascript - 确保没有选择两次随机 javascript 对象选择
- swift - 将非泛型 ObjC 类向上转换为 Swift 方法参数的父类
- r - 从定义范围 [min, max] 的泊松分布生成随机数
- php - 如何从数据库中获取更新的值而不是默认值?- Laravel,Mysql