0

我使用 Win API 解压了一个 zip 存档。该 API 基于 COM 接口;COM 模型可通过CompressFolderCOM 对象访问。

我遇到了以下问题。当我解压缩一个小文件(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不读取文件的情况下检测打包文件的大小?

4

1 回答 1

0

用小缓冲区是不可能实现快速读取的。事实上,您执行的 I/O 操作越多,花费的时间就越多。

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

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

于 2016-06-08T12:00:57.340 回答