在我的C ++应用程序中,我试图通过createfile(带有重叠的标志,之后是readfile)异步读取iso文件。 但是,当我在简单文件(例如txt文件)上尝试此代码时,它可以工作。但是当我在iso文件上运行此代码时-失败。 我在MSDN中看到压缩文件只能通过readfile同步调用读取。iso文件是否在此类别中? 如果是,您还有其他建议如何异步读取iso文件吗?

这是我的代码: 通用标签

谢谢

有帮助吗?

解决方案

您尚未发布BUF_SIZE常量使用的值,但请确保它是卷扇区大小的整数倍。使用无缓冲文件流时,这是一个常见的陷阱。 FILE_FLAG_NO_BUFFERING文档中的CreateFile()文档说:

对使用FILE_FLAG_NO_BUFFERING标志成功使用CreateFile打开的文件有严格的要求,有关详细信息,请参见文件缓冲

有关文件缓冲说明的页面:

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

  • 文件访问大小,包括OVERLAPPED结构中的可选文件偏移量(如果有) 指定的字节数必须是卷扇区的整数倍 尺寸。例如,如果扇区大小为512字节,则应用程序可以请求读取和 写入512、1,024、1,536或2,048字节,但不写入335、981或7,171字节。

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

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

    在我的系统上,该值为4K,并且一次读取小于4K的任何内容都会产生错误。在Microsoft的许多代码示例中,默认缓冲区大小为1K,因此改编示例通常会导致未缓冲的I / O错误。

    编辑:还要确保将OVERLAPPED结构的所有成员归零。您没有将InternalInternalHigh成员设置为0。请始终按以下方式清除OVERLAPPED结构: 通用标签

    然后,您可以设置文件偏移量和事件句柄。

    编辑:还请考虑以下有关lpNumberOfBytesRead参数的注释,该参数通用标记代码

    如果这是异步操作,请对该参数使用NULL以避免潜在的错误结果。 [...]有关更多信息,请参见“备注”部分。

其他提示

我建议特别注意重叠的OffsetOffsetHigh字段,尤其是在读取大小超过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
希望对您有所帮助。不能在这个主题上找到很多东西。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top