Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TMemoryStream mit Abbrevia entzippen (https://www.delphipraxis.net/60622-tmemorystream-mit-abbrevia-entzippen.html)

Patrick 10. Jan 2006 09:35


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 hier gefunden.

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...

kalmi01 10. Jan 2006 12:35

Re: TMemoryStream mit Abbrevia entzippen
 
Zitat:

Allerdings können mein Compiler und ich mit "TAbZLStreamHelper" nix anfangen...
Ist eine Klasse in AbZLTyp.pas

Patrick 10. Jan 2006 13:24

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]'"...!?

Patrick 11. Jan 2006 09:40

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:
  ABUnZipper1.OpenArchive('D:\Eigene Dateien\Borland Studio-Projekte\irgendwas.zip');
  ABUnZipper1.BaseDirectory :='D:\Eigene Dateien\Borland Studio-Projekte';
  ABUnZipper1.ExtractFiles( '*.*' );
Jetzt will ich den Stream aber nicht erst auf Platte schreiben um ihn dann wiweder zu laden, das ist hässlich!
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( '*.*' );

Khabarakh 11. Jan 2006 11:25

Re: TMemoryStream mit Abbrevia entzippen
 
Zitat:

Zitat von Patrick
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;

Wie sieht der Code davor aus (Streams)? Sind die Streamzeiger möglicherweise am Ende statt am Anfang des Streams?

Patrick 11. Jan 2006 16:07

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

Patrick 12. Jan 2006 10:06

Re: TMemoryStream mit Abbrevia entzippen
 
Also, da ich bis jetzt anders nicht weiter gekommen bin versuche ich es noch mal so:
Delphi-Quellcode:
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;
"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!).

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?

Patrick 16. Jan 2006 16:16

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