我使用Win API解压缩zip存档。此API基于COM接口;可以通过CompressFolder
COM对象访问COM模型。
我遇到了以下问题。当我解压缩一个小文件(3.5 MB)时,需要很长时间。我发现IStream::Read()
导致了这个问题。它运作缓慢。我使用一个小缓冲区(1KB)在多次迭代中读取该文件;如果我使用几乎等于文件大小的缓冲区,那么它的工作速度会快得多。
即使缓冲区大小远小于文件大小,如何快速解压缩?可能吗?我认为这很重要,因为文件可能很大,比如1 GB。
以下是读取文件的代码片段:
...
CComPtr<IEnumSTATSTG> pEnum = NULL;
pStorage->EnumElements(0, NULL, 0, &pEnum);
STATSTG stasStg;
while (S_OK == pFolderEnum->Next(1, &stasStg, NULL)) {
if (stasStg.type == STGTY_STREAM) {
CComPtr<IStream> pStream = NULL;
pStorage->OpenStream(stasStg.pwcsName, NULL, STGM_READ, NULL, &pStream);
...
while (hr == S_OK) {
// reading
pStream->Read(btBuffer, 1024, &ulByresRead); // it works slowly
}
}
}
我有一个问题:
有没有方法通过IStream
检测打包文件大小而不读取文件?
答案 0 :(得分:0)
使用小缓冲区无法实现快速读取。实际上,您执行的I / O操作越多,所需的时间就越多。
尝试通过采用相对较大的缓冲区大小来限制I / O操作的数量。当然,您必须根据要分配给程序的内存来限制它。
除此之外,由于程序加载库,您可能会遇到延迟。如果已加载关联的dll,则Winzip不会发生这种情况。