![]() |
TMemoryStream mit Abbrevia entzippen
Hallo,
Ich habe einen gezippten TMemoryStream den ich nun mit den Abbrevia-Komponenten entpacken will. Im Forum habe ich das hier ![]() Allerdings können mein Compiler und ich mit "TAbZLStreamHelper" nix anfangen... Ich habe mir den ABUnZipper mal angesehen, aber der kann nur in einen Stream entpacken, nicht von einem... |
Re: TMemoryStream mit Abbrevia entzippen
Zitat:
|
Re: TMemoryStream mit Abbrevia entzippen
Ich habe jetzt ganz dreißt einfach mal die Unit "AbZLTyp.pas" in die UsesList geschrieben.
Mein Code sieht an der Stelle nun so aus:
Delphi-Quellcode:
var streams : array of TMemoryStream;
... for i:=0 to cache.Count-1 do begin StreamOut := TFileStream.Create(Cache.Strings[i], fmCreate); GzHelp := TAbZLStreamHelper.Create(Streams[i]); try GzHelp.ReadHeader; //Hier bleibt er stehen! GzHelp.ExtractItemData(StreamOut); GzHelp.ReadTail; finally GzHelp.Free; Streams[i].Free; StreamOut.Free; end; Jetzt kriege ich aber eine Hübsche "Exception der Klasse EAbInternalInflateError mit der Meldung 'no more compressed data in Stream [TAbDfInBitStream.ReadBit]'"...!? |
Re: TMemoryStream mit Abbrevia entzippen
Das kann doch nicht so schwierig sein...
Ich habe doch nur einen gezippten Stream und will die enthaltenen Dateinen entpacken. Ich könnte den Stream einfach als "irgendwas.zip" speichern und mit folgendem Code entpacken
Delphi-Quellcode:
Jetzt will ich den Stream aber nicht erst auf Platte schreiben um ihn dann wiweder zu laden, das ist hässlich!
ABUnZipper1.OpenArchive('D:\Eigene Dateien\Borland Studio-Projekte\irgendwas.zip');
ABUnZipper1.BaseDirectory :='D:\Eigene Dateien\Borland Studio-Projekte'; ABUnZipper1.ExtractFiles( '*.*' ); Alles was ich brauche ist doch blos eine Funktion/Prozedur, die mir aus dem Stream ein TAbArchive macht, dann kann ich wie gewohnt entpacken.
Delphi-Quellcode:
ABUnZipper1.ZipArchive:=???
ABUnZipper1.BaseDirectory :='D:\Eigene Dateien\Borland Studio-Projekte'; ABUnZipper1.ExtractFiles( '*.*' ); |
Re: TMemoryStream mit Abbrevia entzippen
Zitat:
|
Re: TMemoryStream mit Abbrevia entzippen
Das passt garnicht...
Ich habe Streams[i] jetzt zum test mal auf Position:=0 gesetzt. Jezt läuft er ohne Fehlermeldung durch. Aber der Code kann eigentlich nicht funktionieren, da der OutStream eine einzige Datei ist. Was ist wenn ich in dem Zip-Packet mehrere Dateien habe? Von daher würde ich lieber auf die Idee, die ich in meinem letzten Post beschrieben habe, zurückgreifen: TMemoryStream -> TAbArchive |
Re: TMemoryStream mit Abbrevia entzippen
Also, da ich bis jetzt anders nicht weiter gekommen bin versuche ich es noch mal so:
Delphi-Quellcode:
"Streams" ist ein Array of TMemoryStream. Die Position jedes Streams ist "0". In "Streams[i]" befindet sich nichts anderes als ein Zip-Packet (unbeschädigt!).
for i:=0 to cache.Count-1 do
begin GzHelp := TAbZLStreamHelper.Create(Streams[i]); GzHelp.ReadHeader; if GzHelp.FindFirstItem then repeat StreamOut := TFileStream.Create(GzHelp.Item.FileName, fmCreate); //Hier ist der Fehler! GzHelp.ExtractItemData(StreamOut); StreamOut.Free; until GzHelp.FindNextItem=false; GzHelp.ReadTail; GzHelp.Free; Streams[i].Free; ... end; Folgende Fehlermeldung: 'Datei "" kann nicht erstellt werden' Warum? Er findet ein Item, wäre das nicht der Fall würde er ja garnicht in die Schleife gehen. Wenn er ein Item gefunden hat, hat er doch eine Datei innerhalb des Zip-Packets (Streams[i]) gefunden, oder verstehe ich das falsch? |
Re: TMemoryStream mit Abbrevia entzippen
Es muss doch eine Möglichkeit geben dieser blöden Abbrevia-Komponente die Zip-Datei per Stream zu überreichen. Es kann doch nicht sein, dass ich den stream erst auf die Festplatte speichern muss, um ihn dann wieder mit der Abbrevia-Komponente zu öffnen...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz