2009-08-04 8 views
1

Ich erstelle ein C++ - Programm, das den einfachen Text einer .docx-Datei liest. Mein Angriffsplan besteht darin, die .docx als .zip umzubenennen und dann zu entpacken. Ich werde dann die XML-Datei, die den Text des Dokuments enthält, als TXT umbenennen und auslesen.Entpacken eines Verzeichnisses in C++

Gerade jetzt habe ich die Umbenennung herausgefunden, die einfach genug war. Ich kämpfe jetzt mit dem Entpacken. Ich bin sehr gut in C++, aber dies ist das erste Mal, dass ich mich auf echte Word-Anwendungen ausweite und diese über die STL-Bibliothek hinaus nutze.

Zuerst habe ich viele Wrapper für C++ aus der zlib-Bibliothek ausprobiert, konnte aber keine von ihnen zum Kompilieren oder zum ordnungsgemäßen Arbeiten bringen (möglicherweise aufgrund der Umgebung in Cygwin). Aus diesem Grund scheint es, als würde ich den unordentlichen Zlib-Code verwenden, um dies zu tun. Aber aus der ganzen Dokumentation und den Beispielen, die ich finden kann, zeigt es nur, dass zlib verwendet wird, um eine .zip zu lesen, die eine Komprimierung einer Datei ist, nicht mehrere Dateien. Ich weiß jetzt nicht, wohin ich von hier aus gehen soll, und wie ich bereits sagte, ich bin völlig neu in der Domäne außerhalb von STL. Ich fühle mich ziemlich verloren.

Jede Hilfe oder Anleitung wird sehr geschätzt!

Danke, Michael

+2

Sie müssen keine Dateien umbenennen. Wenn Sie in Ihrem Programm eine docx-Datei an eine Entpackfunktion übergeben möchten, gibt es nichts, was Sie daran hindert. –

+0

Ah, OK. Ich war mir nicht sicher, was passieren würde, also dachte ich, ich würde die Umbenennung einwerfen, nur um sicher zu gehen. Danke, dass du es aufgeräumt hast. – mcFreid

+0

Reale Wortanwendungen? Wortspiel beabsichtigt? –

Antwort

1

zlib ist für GZIP-Komprimierung, nicht ZIP-Komprimierung (see here for details).

Als Ergebnis würden Sie vielleicht besser sein, um die unzip Dienstprogramm in Cygwin zur Verfügung gestellt und für lots of platforms verfügbar.

+0

Ich bin mir nicht sicher, was Sie mit der ersten Frage meinen. Natürlich kann ich C-Code verwenden, wenn Sie das meinen. Könnten Sie mir etwas ausführlicher erklären, wie ich die ausführbare Datei "entpacken" in Cygwin verwenden würde (obwohl ich es vorziehen würde, wenn der Code portabel wäre, wenn dies nicht so wäre). Auch ich bin mir ziemlich sicher, dass zlib sowohl komprimieren/dekomprimieren als auch komprimieren kann. – mcFreid

+0

Ich habe die erste Frage geklärt und einen Link hinzugefügt, um zu zeigen, dass zlib die Zip-Komprimierung nicht verarbeiten kann. Sie müssten die mit zlib bereitgestellte Minizip-Bibliothek verwenden. –

+0

Mike, Danke für den Link. Ich habe falsch verstanden, was du meintest. Ich dachte, du sprichst von .zip-Dateien, nicht von .zip-Archiven/-Verzeichnissen. Ich habe auch Info-Zip ausprobiert und hatte Schwierigkeiten, es in Cygwin kompilieren zu lassen. Später, wenn ich zuhause bin, poste ich die Fehler, die ich bekomme. – mcFreid

1

Ich glaube nicht, zlib unterstützt Multi-Datei-Zips direkt (könnte falsch sein), so dass Sie nach Alternativen suchen sollten. Nebenbei bemerkt, sollten Sie auch erwägen, von cygwin zu MinGW zu wechseln, es sei denn, Sie benötigen wirklich die POSIX/UNIX-Kompatibilität, die cygwin bietet.

+0

Wenn mit "multi-file" zips gemeint sind zip-dateien mit mehreren dateien, dann gibt es minizip. Mir ist nicht ganz klar, wie sich Minipip auf zlib bezieht (abgesehen davon erfordert es zlib), aber es funktioniert. Siehe http://www.winimage.com/zLibDll/minizip.html. –

+0

Ich bin ein wenig verwirrt, wie man Minzip installiert. Von der Seite, die du verlinkt hast, scheint es jetzt mit zlib zu kommen, aber ich sehe es nicht. Denken Sie daran, dass ich neu bin, zusätzliche Bibliotheken mit C++ zu verwenden. – mcFreid

1

Ich habe mit einem ähnlichen Problem zu tun, aber noch nicht wirklich eine großartige Lösung.

zlib unterstützt derzeit nicht mehrere Dateien.

Siehe: C/C++ Packing and Compression

+0

Danke für die Referenz. Ich habe http://nih.at/libzip/index.html aus deiner Frage angeschaut und es scheint, dass es meine Antwort geben kann. Ich werde es so schnell wie möglich ausprobieren. – mcFreid