2011-01-14 23 views
7

Ich habe begonnen, zlib 1.2.5 zu verwenden, und ich sehe keine Routine, um aus einer Zip-Datei zu extrahieren? Ich habe über eine Minizip-Anwendung gelesen, die Teil der Distribution ist.zlib C++ und Extrahieren von Dateien

Soll das so gemacht werden?

Antwort

21

Ja, es macht es gut. (Aber wenn jemals Sie nicht C-Code mögen, sollten Sie bei 7-Zip SDK sehen, dass Code in C haben ++ und C#.)

  • alle Funktionen, die Dateien aus einem Zip-Archiv zu durchsuchen und zu dekomprimieren sind in : unzip.h
  • Alle Funktionen komprimieren und fügen Sie Dateien in einem Zip-Archiv befinden sich in: zip.h

(Blick auf contrib\minizip\unzip.h und contrib\minizip\zip.h)

zum Beispiel Dekomprimieren: die unzOpen() Funktionen Ihrer Zip-Datei gibt ein unzFile

dann unzGoToFirstFile() und unzGoToNextFile() auf diesen unzFile verwenden, um durch alle Dateien im Archiv zu suchen.

dann bekommen Sie die Datei Informationen für die einzelnen Dateien mit unzGetCurrentFileInfo(), nämlich für seine Größe,

sicher Sie unzOpenCurrentFile() irgendwann anrufen sollte.

und rufen Sie unzReadCurrentFile() mit der Größe von fileinfo, Abrufen des binären Inhalts der archivierten Datei.

Optional gibt es eine undurchsichtige Struktur, die Sie bereitstellen können, um Ihre eigene I/O-Funktion zu verwenden, aber offensichtlich gibt es eine Win32-Standardimplementierung für den Dateizugriff, so dass Sie sich darüber keine Gedanken machen können.

PS: und vergessen Sie nicht, unzCloseCurrentFile()

+1

Ok, ich habe die Funktionen gefunden und verwende miniunzip zum testen mit. Ich habe eine Datei c: \ a.zip mit 7zip erstellt. Es enthält eine Datei.Ich führe miniunzip -x c: \ a.zip -d c: \ reza und und unzOpen2_64 schlägt fehl. Ich betreibe dies unter Windows. Irgendwelche Gedanken darüber, warum dies der Fall ist? – reza

+0

Diese Links sind tot. – kberson

+0

@ Kberson Thx für die Bemerkung. Ich habe Links aktualisiert, die auf https://github.com/madler/zlib/blob/master/contrib/minizip zeigen. –

2

ich einen Wrapper um minizip einige Features hinzugefügt gebaut aufrufen, die ich brauchte, und macht es schöner, es zu benutzen. Ist funktioniert die neueste C++ 11 verwenden und Visual Studio 2013 entwickelt wurde (sollte tragbar, aber ich habe es nicht auf Unix getestet)

Es gibt eine vollständige Beschreibung hier: https://github.com/sebastiandev/zipper

können Sie zip gesamte Ordner, Streams, Vektoren usw. Auch ein nettes Feature ist es, alles komplett im Gedächtnis zu behalten.

+0

Ist es möglich, Artikel in einem Zip-Ordner durch Ihren Wrapper zu ersetzen? Ich habe einen Fall, wo ich eine Datei aus einer Zip extrahieren muss, einige Änderungen vornehmen und sie zurück in die Zip schreiben (überschreiben, was es jetzt gibt), ohne die gesamte Zip-Datei zu überschreiben. Es sieht so aus, als könnte ich zuerst die Entpacker-Klasse verwenden, um die Datei zu extrahieren und zu modifizieren, und dann die Add-Funktion in der Reißverschluss-Klasse mit dem gleichen Dateinamen verwenden, um sie zu überschreiben. – Wes

+0

Minizip hat diese Funktionalität nicht, nicht einmal aus der Zip löschen. Ich denke, dass der ZIP-Standard die Möglichkeit bietet, dies zu tun, aber er müsste zuerst auf dem minizip implementiert und später zu diesem Wrapper hinzugefügt werden. Dies war mehr auf das Zippen von Daten ausgerichtet, speziell im Speicher für die interne Verwendung von Anwendungen, bei denen einfache Komprimierung das Ziel war, aber nicht wirklich orientiert oder beabsichtigt, um zum Bearbeiten und Ändern von Reißverschlüssen verwendet zu werden. – Sebastian