Entwickler-Ecke

Dateizugriff - ZLib, mehrere Dateien mit Zlib packen


LokutusvB - Mi 22.09.10 09:08
Titel: ZLib, mehrere Dateien mit Zlib packen
Hallo,

wenn man hier im Forum nach Zlib sucht, findet man fast nur Beiträge mit Antworten wie "Forumsuche" benutzen. Allerdings konnte ich in keinem der Beiteäge eine Lösung finden, wie ich mehrere Dateien mit Zlib in ein Archiv packen kann.

Im Netz konnte ich folgendes finden:
http://www.swissdelphicenter.ch/de/showcode.php?id=1617

Allerdings kann ich in Files angeben, was immer ich möchte, er packt mir immer den ganzen Ordner in die zip-Datei.

Quelltext
1:
2:
3:
4:
tmp := TStringList.Create;
tmp.Add('D:\Delphi\Test\text1.cfg');
tmp.Add('D:\Delphi\Test\text2.cfg');
CompressFiles(tmp, 'test.zip');
.
Trotzdem packt er mir den vollständigen Test-Ordner in die test.zip-Datei. Liegt der Fehlmer bei mir oder bei der Compress-Files-Prozedur?


LokutusvB - Do 23.09.10 10:15

Ich bin ein Stück weiter gekommen. Die beiden verlinkten Proceduren funktionieren soweit. Ich kann Dateien in ein Archiv "Packen" und wieder "Entpacken". Allerdings sind diese Archive nicht 7Zip-kompatibel. Die Windows-Datei-Anzeige wirft direkt die Fehlermeldung, die zip-Komprimierte Datei ist beschädigt. Was ist zu tun, das diese erstellte Archiv-Datei über CompressFiles(...) auch mit z.B. 7Zip oder der Windows-Anzeige geöffnet werden kann? Was müßte ich zusätzlich abändern, um damit auch Zip-Archive auslesen zu können? Oder ist das damit grundsätzlich nicht möglich?


Delete - Do 23.09.10 10:39

Da wird wohl der passende Dateiheader fehlen.


LokutusvB - Do 23.09.10 10:42

Dateiheader? Oh, ich sehe schon, da ist noch Forschung angesagt. Jedenfalls Danke für den Tip.

Ich konnte folgenden Beitrag finden:
http://www.delphi-forum.de/viewtopic.php?t=19076&highlight=dateiheader


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
type
  TFileHeader = packed record                // Datei-Header
    UnzipVersion :Word;
    Flags        :Word;
    CompressType :Word;
    Date         :Word;
    Time         :Word;
    CRC32        :LongInt;
    CompSize     :LongInt;
    UnCompSize   :LongInt;
    FileNameLen  :Word;
    ExtraLen     :Word;
  end;

scheint genau das zu sein, was ich setzen muß. Mir ist allerdings unklar, wie ich all die Informationen zusammensuchen soll und wie ich diese in die Datei bekomme.


Delete - Do 23.09.10 12:18

Einfach mit einem Stream vor weg in die Dateischreiben. Aber du musst auch den richtigen Zip-Header setzte. Und ich weiß nicht, ob er das ist, was du da gefunden hast.


LokutusvB - Do 23.09.10 14:24

Geht das auch noch nachträglich? der Header sollte der richtige sein. Zumindest geht es in der verlinkten Diskussion um das Auslesen von Zip-Dateien. Allerdings, wenn möglich, würde ich den Header gern nach dem Compress schreiben. Geht das? oder muß das zwangsweise als erster Schritt erfolgen?


Sinspin - Do 23.09.10 15:10

Dir bleibt garnichts anderes übrig als den Header hinterher zu erstellen da dir ja am Anfang Informationen fehlen.
Aber um danach nicht die Datei nochmal umkopieren zu müssen würde ich erstmal einen "leeren" Header an den Anfang der Datei schreiben. Und dann, wenn du alles beisammen hast, die Werte an den richtigen Stellen ändern. Aber dafür solltest du schon eine Variante von CompressFiles verwenden die in einen Stream schreibt.
Es sei denn es gibt beim schreiben in eine Datei die Möglichkeit an eine bestehende Datei hinten was anzuhängen. Hängt halt von den Einstellungen in zlib ab. Ich kenne das nicht wirklich. Aber bei der Suche nach Informationen zum ZIP Format kannst du auch mal die 7-Zip SDK Sachen durchschauen, ich dächte da schon was zu gelesen zu haben.


LokutusvB - Di 28.09.10 09:40

Wieso gibt es hier im Forum und im Netz so wenig Informationen? Oder suche ich nur mit den falschen Stichpunkten (Header)?

Da wird es sicher einfacher sein, nach einer fertigen Komponente für Delphi 5 zu suchen, mit deren Hilfe man Zip-Dateien packen und entpacken kann.


Sinspin - Di 28.09.10 10:41

Manchmal ist einfach ein bisschen der Wurm drin und man kommt nicht drauf, aber dafür gibt es ja uns 8)
Schau mal hier http://www.wotsit.org/list.asp?al=Z gibt es sogar verschiedene Spezifikationen.