2009-02-03 13 views
8

Sto lavorando a un progetto usando C++, Boost e Qt. Capisco come comprimere singoli file e bytest usando, ad esempio, la funzione qCompress() in Qt.Come faccio a comprimere una directory di file usando C++?

Come si comprime una directory di più file, comprese le sottodirectory? Sto cercando una soluzione multipiattaforma (Mac, Win, Linux); Preferirei non licenziare un sacco di nuovi processi.

C'è un modo standard per combinare i bytestreams da più file in un archivio zippato, o forse c'è una funzione o un metodo di convenienza che sarebbe disponibile nella libreria iostream di Boost?

Mille grazie per l'assistenza.

Aggiornamento: la libreria QuaZip sembra davvero eccezionale. C'è un esempio nel pacchetto di download (nella directory "tests") che mostra molto chiaramente come comprimere una directory di file.

Aggiornamento 2: Dopo aver completato questa attività sul mio ambiente di build Linux, ho scoperto che QuaZip non funziona affatto con il compilatore di Visual Studio. Potrebbe essere possibile affrontare tutti quegli errori del compilatore, ma una parola di cautela per chiunque guardi in questa direzione.

risposta

9

Ho trovato le seguenti due librerie:

  • ZipIOS++. Sembra essere "puro" C++. Non elencano Windows esplicitamente come piattaforma supportata. Quindi penso che dovresti tentare la fortuna da solo.
  • QuaZIP. Basato su Qt4. In realtà sembra carino. Elenca Windows esplicitamente (usando mingw). Apparentemente, è un wrapper C++ per [questa] libreria.

Ah, e naturalmente, ho strappato quei siti da this Qt Mailinglist domanda su Zipping/decompressione delle directory :)

+0

I secondo QuaZIP. –

+0

QuaZip sembra la strada da percorrere. Grazie! – martian

+0

ZipIOS ++ ha file di progetto MSVC 6. Tuttavia, prende in prestito un po 'di codice da Boost.Filesystem (a partire dal 2001!), Che non viene compilato correttamente, almeno nel mio ambiente VS2008. Quindi suppongo che dovrò anche guardare QuaZIP, o semplicemente zlib ... – Reunanen

-1
system("zip myarchive.zip *"); 
+0

Ha detto che non vuole licenziare nuovi processi. – PolyThinker

+0

Questo è solo un processo in più e è molto più rapido da implementare rispetto all'uso di una libreria di terze parti. Ma, non conosco le ragioni per non voler avviare un altro processo, forse l'OP ha una memoria molto limitata o vuole un maggiore controllo su ZIP poiché è in esecuzione, ma è così che lo farei. –

+1

non si tratta di generare nuovi processi. questa risposta è semplicemente ignorante. cosa succede se "zip" non è installato, che dire di altre piattaforme quindi unix? –

1
+0

Per quanto ne so, zlib supporta solo file .gz e non .zip. –

+0

Sì, sto cercando .zip. La libreria di minizip collegata dal sito zlib.net potrebbe essere in grado di aiutare, ma ho bisogno di approfondire un po 'di più ... Se qualcuno ne sa di più su questa libreria, mi farebbe piacere sentirlo. – martian

+0

Puoi effettivamente comprimere intere directory con zlib? O solo singoli file? – Frank

1

Solo per la cronaca ...

Oggi, avevo bisogno di fare qualcosa di molto simile in Visual C++. (Anche se desiderava mantenere la possibilità di compilare il progetto su altre piattaforme, tuttavia preferiva non adottare Qt solo per questo scopo.)

Terminato utilizzando la libreria . È scritto in plain C, ma inventare un semplice wrapper in C++ è stato un gioco da ragazzi, e il risultato finale funziona alla grande, almeno per i miei scopi.

0

Ho provato QuaZIP 0.4.3 su Windows con VisualStudio 2010 - ci sono ancora problemi, ma possono essere risolti facilmente.

di costruire con VS:

  1. Usa CMake per configurare e generare soluzioni VS QuaZIP.
  2. Open soltion con VS e build: noterete per prima cosa che non riesce a trovare "zlib.h".
  3. Apri le preferenze per il progetto quazip e aggiungi il percorso alla copia Qt di Zlib in C/C++ -> Generale-> Directory di inclusione aggiuntive: $ (QTDIR)/src/3rdparty/zlib.
  4. Ricompila nuovamente e riceverai molti avvisi e un errore C2491: problema statico di dllimport su QuaZipFile :: staticMetaObject.
  5. Questo perché QuaZipFile è dichiarato come "classe QUAZIP_EXPORT QuaZipFile" e QUAZIP_EXPORT deve risolvere per Q_DECL_EXPORT per dll e Q_DECL_IMPORT per l'applicazione, in base al fatto QUAZIP_BUILD è definita o no. Quando si costruisce QuaZIP QUAZIP_BUILD deve essere definito ma non lo è - il processo di configurazione definisce invece un errore completamente inutile "quazip_EXPORTS".
  6. Per risolvere, basta rimuovere "quazip_EXPORTS" da tutte le configurazioni di build e aggiungere QUAZIP_BUILD invece - QuaZIP ora andrà bene.
0

Ho costruito un wrapper attorno a minizip aggiungendo alcune funzionalità di cui avevo bisogno e rendendolo più piacevole da usare. È utilizza l'ultimo C++ 11 e viene sviluppato utilizzando Visual Studio 2013, quindi dovrebbe funzionare immediatamente.

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

è possibile comprimere intere cartelle, ruscelli, vettori, ecc anche una bella caratteristica sta facendo tutto interamente in memoria.