使用“CompressedFolder”COM对象解压缩

时间:2011-08-11 01:39:07

标签: c++ winapi unzip istream

我使用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检测打包文件大小而不读取文件?

1 个答案:

答案 0 :(得分:0)

使用小缓冲区无法实现快速读取。实际上,您执行的I / O操作越多,所需的时间就越多。

尝试通过采用相对较大的缓冲区大小来限制I / O操作的数量。当然,您必须根据要分配给程序的内存来限制它。

除此之外,由于程序加载库,您可能会遇到延迟。如果已加载关联的dll,则Winzip不会发生这种情况。