Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Readfile async-iso文件c++;_C++_Winapi_Asynchronous_Readfile_Createfile - Fatal编程技术网

C++ Readfile async-iso文件c++;

C++ Readfile async-iso文件c++;,c++,winapi,asynchronous,readfile,createfile,C++,Winapi,Asynchronous,Readfile,Createfile,在我的C++应用程序中我想读ISO文件异步的代码< > CeaFeFiels——重叠的标志,然后是->代码> Read Fixs/Cuff>。 然而,当我在一个简单的文件(例如txt文件)上尝试这段代码时,它是有效的。但当我在iso文件上运行此代码时,它失败了。 我在MSDN中看到,压缩文件只能通过readfile同步调用读取。iso文件是否属于此类别? 如果是-您对如何异步读取iso文件有其他建议吗 这是我的代码: int _tmain(int argc, _TCHAR* argv[]) {

在我的C++应用程序中我想读ISO文件异步的代码< > CeaFeFiels——重叠的标志,然后是->代码> Read Fixs/Cuff>。 然而,当我在一个简单的文件(例如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 hfile\n");

   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");
            }

        }

   }

谢谢

如果您像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 希望能有帮助。在这个主题上找不到太多内容。

您还没有公布您对
BUF_SIZE
常量使用的值,但请确保它是卷扇区大小的整数倍。这是使用无缓冲文件流时常见的陷阱。中的
FILE\u FLAG\u NO\u BUFFERING
文档说明:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365226%28v=vs.85%29.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/aa365225%28v=vs.85%29.aspx 对于使用FILE_标志\u NO_缓冲标志成功使用CreateFile打开的文件,有严格的要求,有关详细信息,请参阅

有关文件缓冲的页面请注意:

如前所述,应用程序在工作时必须满足某些要求 使用文件标志打开的文件没有缓冲。以下细节适用:

  • 文件访问大小,包括重叠结构中的可选文件偏移量(如果需要) 指定的字节数必须是卷扇区的整数倍 尺寸。例如,如果扇区大小为512字节,则应用程序可以请求读和写操作 写入512、1024、1536或2048字节,但不写入335、981或7171字节

  • 用于读写操作的文件访问缓冲区地址应为物理扇区 对齐,这意味着在内存中的地址是 卷的物理扇区大小。根据磁盘的不同,此要求可能不适用 强制执行

应用程序开发人员应注意正在开发的新型存储设备 引入市场的物理媒体扇区大小为4096字节。

在我的系统上,这个值是4K,一次读取任何小于4K的数据都会产生错误。在Microsoft的许多代码示例中,1K是默认的缓冲区大小,因此调整示例通常会导致无缓冲I/O错误

编辑:还要确保将重叠的
结构的所有成员归零。您不会将
Internal
InternalHigh
成员设置为0。始终按以下方式清除重叠的
结构:

OVERLAPPED overlapped;
ZeroMemory(&overlapped, sizeof(OVERLAPPED));
然后,可以设置文件偏移量和事件句柄

<强>编辑:还考虑以下代码:<代码> LpNoNoBoopByTeReule< /Cult>参数:

如果这是一个异步操作,请对此参数使用NULL,以避免潜在的错误结果。[…]有关更多信息,请参阅备注部分


我建议仔细注意重叠的
Offset
OffsetHigh
字段,尤其是在读取大小超过32位无符号整数边界的文件时。我相信您所面临的问题就潜伏在那里。

尝试windows错误函数,即GetLastError(),并对产生的错误进行更具体的描述。没有错误。只是缓冲区不包含任何压缩文件意味着OS压缩文件。这些是罕见的。