【发布时间】:2011-10-24 14:19:45
【问题描述】:
我使用 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检测打包文件大小而不读取文件?
【问题讨论】:
-
stasStg.cbSize 的值是多少?是压缩后的还是未压缩的?
-
谢谢,这是未压缩的大小。但是问题仍然存在。
-
即使我将缓冲区大小设置为未压缩文件大小,我仍然会有一点延迟(大约 2 秒)。 Window Explorer 会立即解包。怎么了?此外,如果文件的大小很大,我不能使用等于文件大小的缓冲区大小。