AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TMemoryStream mit Abbrevia entzippen

Ein Thema von Patrick · begonnen am 10. Jan 2006 · letzter Beitrag vom 16. Jan 2006
Antwort Antwort
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#1

TMemoryStream mit Abbrevia entzippen

  Alt 10. Jan 2006, 10:35
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...
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
kalmi01
(Gast)

n/a Beiträge
 
#2

Re: TMemoryStream mit Abbrevia entzippen

  Alt 10. Jan 2006, 13:35
Zitat:
Allerdings können mein Compiler und ich mit "TAbZLStreamHelper" nix anfangen...
Ist eine Klasse in AbZLTyp.pas
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#3

Re: TMemoryStream mit Abbrevia entzippen

  Alt 10. Jan 2006, 14:24
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]'"...!?
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#4

Re: TMemoryStream mit Abbrevia entzippen

  Alt 11. Jan 2006, 10:40
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( '*.*' );
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#5

Re: TMemoryStream mit Abbrevia entzippen

  Alt 11. Jan 2006, 12:25
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?
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#6

Re: TMemoryStream mit Abbrevia entzippen

  Alt 11. Jan 2006, 17:07
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
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#7

Re: TMemoryStream mit Abbrevia entzippen

  Alt 12. Jan 2006, 11:06
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?
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#8

Re: TMemoryStream mit Abbrevia entzippen

  Alt 16. Jan 2006, 17:16
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...
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz