Распакуйте с помощью COM-объекта «CompressedFolder» - PullRequest
0 голосов
/ 11 августа 2011

Я распаковываю 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 без чтения файла?

1 Ответ

0 голосов
/ 08 июня 2016

Невозможно добиться быстрого чтения с небольшими буферами. Действительно, чем больше операций ввода / вывода вы выполняете, тем больше времени занимает.

Попробуйте ограничить количество операций ввода-вывода, взяв относительно большой размер буфера. Затем, конечно, вы должны ограничить его в соответствии с объемом памяти, который вы хотите выделить для вашей программы.

Кроме того, вы можете получить задержку, потому что программа загружает библиотеки. Это не происходит для Winzip, если соответствующая DLL уже загружена.

...