2011-01-14 31 views
7

Ho iniziato a utilizzare zlib 1.2.5 e non vedo alcuna routine da estrarre da un file zip? Ho letto di un'applicazione minizip, parte della distribuzione.zlib C++ ed estrazione di file

È così che dovrebbe essere fatto?

risposta

21

Sì, lo fa bene. (Ma se mai non ti piace il codice C, si dovrebbe guardare a 7-zip SDK che dispone di codice in C++ e C#.)

  • Tutte le funzioni per sfogliare e decomprimere i file da un archivio zip sono in : unzip.h
  • Tutte le funzioni comprimono e aggiungere i file da un archivio zip sono in: zip.h

(guardare contrib\minizip\unzip.h e contrib\minizip\zip.h)

ad esempio la decompressione: le unzOpen() funzioni del vostro file zip restituisce un unzFile

quindi utilizzare unzGoToFirstFile() e unzGoToNextFile() su questo unzFile per sfogliare tutti i file nell'archivio.

poi si ottiene informazioni file per ogni file con unzGetCurrentFileInfo(), vale a dire per le sue dimensioni,

sicuramente si dovrebbe chiamare unzOpenCurrentFile() ad un certo momento.

e chiamare unzReadCurrentFile() utilizzando la dimensione da fileinfo, recuperando il contenuto binario del file archiviato.

optionnally, v'è una struttura opaca è possibile fornire in modo da utilizzare la propria funzione di I/O, ma ovviamente c'è un'implementazione Win32 predefinito per l'accesso ai file, quindi si potrebbe anche non preoccuparsi di questo.

PS: e non dimenticate di chiamare unzCloseCurrentFile()

+1

Ok, ho trovato le funzioni e sto usando miniunzip per testare. Ho creato un file c: \ a.zip con 7zip. Contiene un file.Corro miniunzip -x c: \ a.zip -d c: \ reza e unzOpen2_64 fallisce. Sto facendo funzionare questo su Windows. Qualche idea sul perché questo è il caso? – reza

+0

Questi collegamenti sono morti. – kberson

+0

@kberson thx per l'osservazione. Ho aggiornato i collegamenti per puntare a https://github.com/madler/zlib/blob/master/contrib/minizip –

6

Da: http://www.zlib.net/zlib_faq.html#faq11: 11. Può zlib gestire gli archivi .zip?

Non da solo, no. Vedi la directory contrib/minizip nella distribuzione zlib.

Non esiste un tutorial ma il minizip zip.c source è esattamente per IO (quindi presumibilmente compressione e decompressione) sui file zip usando zlib.

E ancora nessun tutorial MA http://www.winimage.com/zLibDll/minizip.html fornisce ulteriori dettagli.

2

ho costruito un wrapper Minizip l'aggiunta di alcune caratteristiche che mi servivano e che lo rende più bello usarlo. È fa uso l'ultima C++ 11 e si sviluppa utilizzando Visual Studio 2013 (dovrebbe essere portatile, ma non ho ancora testato su Unix)

C'è una descrizione completa qui: https://github.com/sebastiandev/zipper

è possibile zip intera cartelle, flussi, vettori, ecc. Inoltre, una bella funzionalità sta facendo tutto interamente in memoria.

+0

È possibile sostituire gli elementi in una cartella zip con il wrapper? Ho un caso in cui ho bisogno di estrarre un file da un zip, apportare alcune modifiche e scriverlo nuovamente al zip (sovrascrivendo quello che c'è ora) senza sovrascrivere l'intero file zip. Sembra che potrei usare prima la classe unzipper per estrarre e modificare il file e quindi usare la funzione add nella classe zipper con lo stesso nome per sovrascriverla. – Wes

+0

minizip non ha quella funzionalità, nemmeno elimina dallo zip. Penso che lo standard zip dia la possibilità di farlo, ma prima dovrebbe essere implementato su minizip e aggiunto successivamente a questi wrapper. Questo era più focalizzato sulla compressione dei dati, specialmente nella memoria per l'uso interno di app dove il semplice compresion era l'obiettivo, ma non realmente orientato o destinato a essere usato per modificare e modificare le cerniere. – Sebastian