我使用 Win API 解压了一个 zip 存档。该 API 基于 COM 接口;COM 模型可通过CompressFolder
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
不读取文件的情况下检测打包文件的大小?