WinAPIを使用して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
を読み取らずにパックされたファイルサイズを検出する方法はありますか?