2015-06-04 3 views
0

Я пытаюсь прочитать файл test.zip с помощью библиотеки zlib и извлечь содержимое. Мое требование - считывать каждый файл и выводить содержимое (распаковывать) сначала в память, а затем в файл.Использование zlib с mingw

Я попытался следующий код:

#include <iostream> 
#include <zlib.h> 

using namespace std; 


#define LINE 1024 

int main() 
{ 
    const char *filename = "hello.zip"; 
    gzFile inFileZ = gzopen(filename, "rb"); 
    if (inFileZ == NULL) { 
     printf("Error: Failed to gzopen %s\n", filename); 
     return -1; 
    } 
    unsigned char unzipBuffer[8192]; 
    unsigned int unzippedBytes; 
    std::vector<unsigned char> unzippedData; 
    while (true) { 
     unzippedBytes = gzread(inFileZ, unzipBuffer, 8192); 
     if (unzippedBytes > 0) { 
      cout << unzippedBytes << endl; 
      for (int i = 0; i < unzippedBytes; i++) { 
       cout << unzipBuffer[i]; 
      } 
     } else { 
      break; 
     } 
    } 
    gzclose(inFileZ); 
    return 0; 
} 

Я получил вышеупомянутый пример из Интернета. Было упомянуто, что gzread раздувает содержимое и заполняет буфер (здесь unzipBuffer). Однако, когда я пытался его распечатать, он печатал то же содержимое .zip-файла (пример PK..... с нечитаемым кодом).

Я считаю, что неправильно использую API-интерфейсы zlib. Однако я не мог найти пример, связанный с этим. Может ли кто-нибудь помочь мне здесь?

ответ

1

В библиотеке zlib напрямую не обрабатывается почтовый формат. zlib обеспечивает сжатие и декомпрессию с дефлятом, которые вам нужно будет обрабатывать дефлированные записи zip, а также средство вычисления CRC-32. Однако вам нужно будет написать свой собственный код или использовать другую библиотеку для анализа и обработки zip-формата.

gzip не является почтовым индексом. Это два совершенно разных формата, которые используют или могут использовать один и тот же формат сжатого сжатия внутри.

+0

спасибо за ваши комментарии. Можете ли вы поделиться некоторыми примерами, которые я могу использовать? Это очень поможет. – programmer

+1

google - ваш друг. Вы найдете такие вещи, как libzip, libarchive, minizip и т. Д. –

+0

Я пробовал там, но не нашел хорошего примера. Я видел cpipe.c от zlib.net, но я не нашел, как я могу использовать этот код, очень специфичный для моего требования. Но спасибо за вашу помощь :). – programmer

0

Известно, что повторная реализация ZIP в C, от http://www.info-zip.org/. Они имеют Windows DLL, которые я считаю, можно было бы использовать, чтобы делать то, что вы хотите

UPDATE

несколько примеров здесь http://www.vbaccelerator.com/home/VB/Code/Libraries/Compression/Unzipping_Files/article.asp

+0

Вы имеете в виду другую библиотеку. Я должен использовать zlib. – programmer

+0

@programmer well, 'zlib' - это просто сжатие/распаковка потока, это не поможет в формате файла на диске. UnZip из Info-Zip выполняет и то, и другое: дело с форматом файлов и разжатие. Он может быть скомпилирован в Windows DLL, и в дистрибутиве есть даже пример использования DLL –

Смежные вопросы