【发布时间】:2017-06-18 14:16:24
【问题描述】:
我正在寻找一种方法来读取二进制 zip 文件的一部分(起始位置和要读取的字节数)。目前我正在 Windows 上对此进行调查,但最好是独立于平台的。对于普通的二进制文件(解压后),可以通过以下方式实现:
//Open the file
std::ifstream file (path, std::ios::in | std::ios::binary | std::ios::ate);
//Move to the position to start reading
file.seekg(64);
//Read 128 bytes of the file
std::vector<unsigned char> mDataBuffer;
mDataBuffer.resize( 128 ) ;
file.read( (char*)( &mDataBuffer[0]), 128 ) ;
//Read as string
std::string s_data( mDataBuffer.begin(), mDataBuffer.end());
file.close()
此示例是this one 的略微修改版本。
还有许多可用的解压缩包(例如 zlib 或 minizip)。每个覆盖功能都用于解压缩文件。我可以简单地解压缩我的压缩文件,将其保存在磁盘上并使用上述方法读取它。
不幸的是,我没有找到一个示例来直接从压缩文件中读取二进制 zip 文件的一部分(如果可能的话)。因为我的文件很大,我不想完全将它解压缩到硬盘上。此外,我要阅读的部分很小,因此完全解压缩文件会浪费cpu时间。出于同样的原因,我也不想将 complete 文件解压缩到我的内存中。我正在寻找一种仅读取压缩文件的部分的真正方法。
如何在 C++ 中实现这一点?
【问题讨论】:
-
什么是压缩文件的部分?
-
普通二进制文件中seek的开始和结束位置(有问题修改)
-
您是否应该从存档中提取单个文件?没关系,我仍然建议您找到一个便携式库来为您处理它。
-
不,目前我的存档包含多个文件,但我只想从其中一个文件中读取几个字节。
-
@takje 应该在哪里存储和检索特别压缩文件的开始/结束位置?
zip格式不支持该 IIRC。除此之外,您的问题是 OT,因为它要求推荐 3rd 方资源。