2012-07-23 7 views
5

Ich habe eine archive.zip, die zwei verschlüsselte ". Txt" -Dateien enthält. Ich möchte das Archiv dekomprimieren, um diese 2 Dateien zu erhalten.Entpacken Sie eine Zip-Datei mit zlib

Hier ist, was ich bisher getan habe:

FILE *FileIn = fopen("./archive.zip", "rb"); 
if (FileIn) 
    printf("file opened\n"); 
else 
    printf("unable to open file\n"); 

fseek(FileIn, 0, SEEK_END); 
unsigned long FileInSize = ftell(FileIn); 
printf("size of input compressed file : %u\n", FileInSize); 

void *CompDataBuff = malloc(FileInSize); 
void *UnCompDataBuff = NULL; 

int fd = open ("archive.zip", O_RDONLY); 
CompDataBuff = mmap(NULL, FileInSize, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); 
printf("buffer read : %s\n", (char *)CompDataBuff); 

uLongf UnCompSize = (FileInSize * 11/10 + 12); 
UnCompDataBuff = malloc(UnCompSize); 

int ret_uncp ; 

ret_uncp = uncompress((Bytef*)UnCompDataBuff, &UnCompSize, (const Bytef*)CompDataBuff,FileInSize); 
printf("size of uncompressed data : %u\n", UnCompSize); 

if (ret_uncp == Z_OK){ 
    printf("uncompression ok\n"); 
    printf("uncompressed data : %s\n",(char *)UnCompDataBuff); 
    } 
if (ret_uncp == Z_MEM_ERROR) 
    printf("uncompression memory error\n"); 
if (ret_uncp == Z_BUF_ERROR) 
    printf("uncompression buffer error\n"); 
if (ret_uncp == Z_DATA_ERROR) 
    printf("uncompression data error\n"); 

Ich bekomme immer „Uncompression Datenfehler“ und ich weiß nicht, warum. Und dann würde ich gerne wissen, wie die 2 Dateien mit meinen Daten unkomprimiert abgerufen werden.

Antwort

4

Zlib ist keine Bibliothek zum Verarbeiten von ZIP-Dateien. Es unterstützt das Dekomprimieren von zlib- und gzip-Streams, die beide auf der Ebene eines einzelnen Datenstroms arbeiten, anstatt eines "Archiv" -Formats wie .zip.

Sie benötigen eine andere Bibliothek (z. B. libzip; es gibt viele andere) zum Öffnen und Bearbeiten von ZIP-Archiven.

+0

Oh wirklich, ich war sicher, dass zlib mit .zip behandeln würde .. trotzdem danke für information! :) – user1336204

+0

Zlib kann in der Tat mit Zip-Verarbeitung helfen, und die Quelldistribution kommt mit beigetragenem Code, um Zip-Dateien zu verarbeiten. Siehe meine Antwort. –

+1

Oh, und Libzip verwendet zlib. –

12

zip ist ein Dateiformat, um komprimierte Datenströme, um Header und Trailer Informationen wickelt eine Reihe von Dateien und Verzeichnissen zu repräsentieren. Die komprimierten Datenströme sind fast immer deflate data streams, die tatsächlich von zlib generiert und entschlüsselt werden können. zlib stellt außerdem die crc32-Funktion zur Verfügung, mit der die CRC-Werte in den ZIP-Wrapper-Informationen generiert und überprüft werden können.

Was zlib nicht selbst tut, ist das Dekodieren und Dekonstruieren der Zip-Struktur. Sie können entweder Ihren eigenen Code schreiben, um dies mit der specification (nicht sehr schwer zu tun), oder Sie können die Minizip-Routinen in contrib/minizip directory der zlib distribution, die Funktionen zum Öffnen, Zugriff und schließen Zip-Dateien bietet.

+0

Danke. Ich habe die contrib/minizip-Header hinzugefügt und konnte Dateien aus einer Zip-Datei lesen (in einer Anwendung, die bereits zlib verwendet hat).Ich musste nur ein paar einfache Funktionen schreiben, um Aufrufe in unzip.h in die Schnittstelle zu packen –

2

Wie erwähnt, behandelt zlib nur die Komprimierung, es archiviert nicht. Wenn Sie zippen oder entzippen möchten, was Sie tun, ist das Extrahieren von Dateien aus einem Archiv, das in einem Zip-Format ist (es gibt andere Formate wie rar, 7zip usw.)

Wenn Sie Reißverschlüsse erstellen oder entpacken möchten Dateien müssen Sie mit dem Zip-Format umgehen und Minizip ist eine schöne Bibliothek, robust und ist seit langer Zeit dort.

Es gibt eine contrib für minizip https://github.com/nmoinvaz/minizip mit Beispielen auf, wie es zu benutzen. Ist nicht so schwer, und Sie können die minizip.c und miniunz.c für Code, wie Sie es verwenden. (Minizip verwendet zlib für die Kompression)

Auch ich eine Bibliothek bauen endete die minizip wickelt und fügt ein paar nette Features, um es und macht es einfacher zu bedienen und objektorientiert. Damit können Sie z. B. ganze Ordner, Streams, Vektoren usw. zippen und alles komplett im Speicher ablegen.

Repo mit Beispielen hier: https://github.com/sebastiandev/zipper

Beta Pre-Release: https://github.com/sebastiandev/zipper/releases/

-Code sieht ungefähr so ​​aus:

Zipper zipper("ziptest.zip"); 
zipper.add("somefile.txt"); 
zipper.add("myFolder"); 
zipper.close();