读取文件async-iso文件c++
Readfile async - iso files c++
在我的c++应用程序中,我正试图通过createfile
异步读取iso文件-带有重叠标志,之后是readfile
。然而,当我在一个简单的文件(例如txt文件)上尝试这个代码时,它是有效的。但当我在iso文件上运行此代码时,它失败了。我在MSDN中看到,压缩文件只能通过readfile同步调用读取。iso文件属于这一类吗?如果是-你有其他建议如何异步读取iso文件吗?
这是我的代码:
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hFile;
DWORD NumberOfBytesRead = 0, dw;
BYTE *buf = (BYTE*)malloc(BUF_SIZE*sizeof(BYTE));
OVERLAPPED overlapped;
overlapped.Offset = overlapped.OffsetHigh = 0;
memset(buf, 0, 1024);
overlapped.hEvent = CreateEvent(NULL, true, false, NULL);
if(NULL == overlapped.hEvent)
printf("error");
hFile = CreateFile("xxx.iso",
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED | FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING ,
NULL);
if (hFile == INVALID_HANDLE_VALUE)
printf("invalid hfilen");
int i;
i= ReadFile(hFile,
buf,
BUF_SIZE,
&NumberOfBytesRead,
&overlapped);
if( GetLastError() == ERROR_IO_PENDING)
{
dw = WaitForSingleObject(overlapped.hEvent, INFINITE);
if(dw == WAIT_OBJECT_0)
if (GetOverlappedResult(hFile,&overlapped,&NumberOfBytesRead, TRUE) != 0)
{
if (NumberOfBytesRead != 0)
{
printf("!!!n");
}
}
}
感谢
您还没有公布BUF_SIZE
常量的值,但请确保它是卷扇区大小的整数倍。当使用未缓冲的文件流时,这是一个常见的陷阱。CreateFile()
文档中的FILE_FLAG_NO_BUFFERING
文档显示:
使用FILE_FLAG_NO_BUFFERING标志成功使用CreateFile打开的文件有严格的要求,有关详细信息,请参阅文件缓冲。
文件缓冲说明页面:
如前所述,应用程序在工作时必须满足某些要求使用FILE_FLAG_NO_BUFFERING打开的文件。以下具体情况适用:
文件访问大小,包括OVERLAPPED结构中的可选文件偏移量,如果指定的字节数必须是卷扇区的整数倍大小例如,如果扇区大小为512字节,则应用程序可以请求读取并512、1024、1536或2048字节的写入,但不是335、981或7171字节的写入。
用于读取和写入操作的文件访问缓冲区地址应为物理扇区对齐,这意味着在内存中的地址上对齐,这些地址是卷的物理扇区大小。根据磁盘的不同,此要求可能不是强制执行。
应用程序开发人员应注意新类型的存储设备以4096字节的物理媒体扇区大小引入市场
在我的系统上,这个值是4K,一次读取任何小于4K的内容都会产生错误。在微软的许多代码示例中,1K是默认的缓冲区大小,因此调整示例通常会导致未缓冲I/O的错误。
编辑:同时确保将OVERLAPPED
结构的所有成员清零。您没有将Internal
和InternalHigh
成员设置为0。始终以以下方式清除OVERLAPPED
结构:
OVERLAPPED overlapped;
ZeroMemory(&overlapped, sizeof(OVERLAPPED));
然后,您可以设置文件偏移量和事件句柄。
编辑:还要考虑以下关于lpNumberOfBytesRead
参数到ReadFile()
:的注意事项
如果这是一个异步操作,请对此参数使用NULL,以避免潜在的错误结果。[…]有关详细信息,请参阅备注部分。
我建议仔细注意重叠的Offset
和OffsetHigh
字段,尤其是在读取大小超过32位无符号整数边界的文件时。我相信你面临的问题就潜伏在那里。
如果像Dodo所说的那样调用GetLastError(),即使没有错误,也会更好。ReadFile返回的内容将非常有帮助。就ISO文件而言,我认为它们是压缩文件类型。不过,您可以查找使用LzRead函数。下面我们来看看:"
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365226%28v=vs.85%29.aspx"。您也可以使用LzOpenFile打开该文件。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365225%28v=vs.85%29.aspx希望能有所帮助。在这个话题上找不到太多。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将内容数组写入文本文件?
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到