zip dateien laden
-
wie lade ich *.zip dateien?
hat jemand informationen zum aufbau des formats?
-
ich habe eben 2 minuten google bemüht und einiges an infos gefunden.
das wäre zuerst auch deine aufgabe gewese...viel spaß!mfg,
julian
-
mittlerweile hab ich auch genug informationen zu dem thema gefunden, nur schaffe ich es einfach nicht den header richtig einzulesen.
bis compressionmethod passt noch alles aber ab dem datadescriptor sind die daten seltsamerweise nicht mehr zu gebrauchen.
meine klassen sehen wie folgt aus:/* u32 = unsigned int u16 = unsigned short int */ class FileDataDescriptor { public: u32 crc32; u32 compressedsize; u32 uncompressedsize; }; class FileHeader { public: u32 signature; u16 version; u16 bitflag; u16 compressionmethod; u16 lastmodtime; u16 lastmoddate; FileDataDescriptor datadescriptor; u16 lenfilename; u16 lenextrafield; /* char *filename; char *extrafield; */ };zum laden des headers verwende ich nur folgenden code:
FileHeader *header = (FileHeader *)&fileptr[0];ich habe es mit zip archiven der version 1.0 und 2.0 probiert.
kann es manchmal sein, dass der header dort anders aufgebaut ist?
hab nix dazu gefunden.
-
*push
hat denn von euch noch niemand so ein zip-archiv geladen bzw. irgendeine idee?
hab nun bald alles durch aber ich finde den fehler nicht
-
IIRC gibts sogar RFCs zu den ZIP-Files, vielleicht gibts da ja Beispielimplementationen? Wenn nicht, dann hat z. B. wxWidgets IIRC einen Zip-Stream, dessen Source du dir anschauen koenntest, oder Java, oder....
Detail am Rande: wenn du alles public machst, ist es in C++ eigentlich ueblicher, structs zu verwenden.

-
Schau dir mal http://www.tntnet.org/. Da gibt es eine C++-Klasse tnt::unzipFile, welches ein Zipfile lesen kann. Dazu gibt es eine Klasse tnt::unzipFileStream, welches ein std::istream auf eine Datei in einem Zip-File implementiert. Das funktioniert dann so:
#include <tnt/unzipfile.h> void f() { // zip-Datei öffnen tnt::unzipFile z("meineZipDatei.zip"); // Stream auf eine Datei im Zip-file legen tnt::unzipFileStream s(z, "dateiname.txt"); // std::istream lesen und auf std::cout ausgeben: std::cout << s.rdbuf() << std::flush; }Im Fehlerfall wird eine Exception geworfen.
Tntnet