Я распаковываю zip-архив, используя Win API.Этот API основан на интерфейсах COM;COM-модель доступна через CompressFolder
COM-объект.
Я столкнулся со следующей проблемой.Когда я распаковываю небольшой файл (3,5 МБ), это занимает много времени.Я понял, что IStream::Read()
вызывает эту проблему.Работает медленно.Я использую небольшой буфер (1 КБ) для чтения этого файла во многих итерациях;если я использую буфер, который почти равен размеру файла, то он работает намного быстрее.
Как мне быстро распаковать его, даже если размер буфера намного меньше размера файла?Является ли это возможным?Я думаю, что это важно, потому что файлы могут быть большими, скажем, 1 ГБ.
Вот фрагмент кода, который читает файл:
...
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
без чтения файла?