Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Datei zippen/ entzippen: TZipmaster oder Abbrevia (https://www.delphipraxis.net/189328-datei-zippen-entzippen-tzipmaster-oder-abbrevia.html)

hoika 1. Jun 2016 08:09

Datei zippen/ entzippen: TZipmaster oder Abbrevia
 
Hallo,
ich suche eine Möglichkeit, ein Zip-Archiv (normales zip, kein gzip oder 7zip)
zu entpacken und wieder ein Archiv zu erzeugen.

Das ganze möglichst direkt über Streams.

Im Moment nehme ich den Zipmaster.
Nachteil ist, dass ich halt keine Streams benutzen kann.
Es läuft immer auf Dateien aus.

Abbrevia wäre die Alternative
http://tpabbrevia.sourceforge.net/

Ich versteht aber die Lizenz nicht
https://www.mozilla.org/en-US/MPL/1.1/

Darf ich denn jetzt ich kommerzielle Anwendungen damit entwickeln?


Danke

Heiko

sh17 1. Jun 2016 08:24

AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
 
evtl ist das aktueller

https://github.com/ezurschmiede/Abbrevia

Ich dachte immer Mozilla PL ist immer für kommerziell.

uligerhardt 1. Jun 2016 08:25

AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
 
Zitat:

Zitat von hoika (Beitrag 1339239)
Ich versteht aber die Lizenz nicht
https://www.mozilla.org/en-US/MPL/1.1/

Darf ich denn jetzt ich kommerzielle Anwendungen damit entwickeln?

IANAL, aber soweit ich das verstehe: Ja. Du musst nur einen Link in der AboutBox unterbringen (Vermerk im Handbuch geht glaub ich auch :mrgreen:).

nahpets 1. Jun 2016 11:03

AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
 
Zitat:

Zitat von hoika (Beitrag 1339239)
Hallo,
ich suche eine Möglichkeit, ein Zip-Archiv (normales zip, kein gzip oder 7zip)
zu entpacken und wieder ein Archiv zu erzeugen.

Das ganze möglichst direkt über Streams.

Im Moment nehme ich den Zipmaster.
Nachteil ist, dass ich halt keine Streams benutzen kann.
Es läuft immer auf Dateien aus.

Ich nehme auch immer den Zip-Master und das geht auch mit Streams.

Hier ein Auszug aus 'ner Klasse, mit der ich EPubs erstelle:
Delphi-Quellcode:
...

    // sEPubFilename ist der "Datei"-Name, unter dem der Stream im Zip-Archiv abgelegt wird.
    // Einen String, der eine vollständige Datei (HTML-Seite...) repäsentiert,
    // in die EPub-Datei übernehmen.
    function   CopyToEPub(sInhalt  : String;    sEPubFilename : String) : Boolean; overload;
    // Inhalt einer Stringliste als Datei in die EPub-Datei übernehmen.
    function   CopyToEPub(sl       : TStrings;  sEPubFilename : String) : Boolean; overload;
    // Einen Stream als Datei in die EPub-Datei übernehmen.
    // Hierbei kann es sich um alles handeln, was man in eine ZIP-Datei packen kann.
    function   CopyToEPub(st       : TMemoryStream; sEPubFilename : String) : Boolean; overload;
...


...
// Wir bekommen eine Zeichenfolge, die eine vollständige Seite enthält.
function TEPub.CopyToEPub(sInhalt : String; sEPubFilename : String) : Boolean;
var
         sl : TStringList;
         st : TMemoryStream;
begin
  sl := TStringList.Create;
  st := TMemoryStream.Create;
  try
    sl.Add(sInhalt);
    sl.SaveToStream(st);
    Result := CopyToEPub(st,sEPubFilename);
  finally
    st.Free;
    sl.Free;
  end;
end;

// Wir bekommen eine Stringliste, die eine vollständige Seite enthält.
function TEPub.CopyToEPub(sl : TStrings; sEPubFilename : String) : Boolean;
var
          st          : TMemoryStream;
begin
  st := TMemoryStream.Create;
  try
    sl.SaveToStream(st);
    Result := CopyToEPub(st,sEPubFilename);
  finally
    st.Free;
  end;
end;

// Die Übernahme in das eBook kann nur per Stream erfolgen.
// Wir bekommen hier einen Stream, der eine vollständige Seite enthält.
// Es kann sich aber auch um Bilder... handeln, halt alles, was man in ein
// Zip packen kann.
function TEPub.CopyToEPub(st : TMemoryStream; sEPubFilename : String) : Boolean;
begin
  Result := false;
  if Assigned(fOnEPubMessage) then fOnEPubMessage(Self, Format('speichere %s...',[sEPubFileName]));
  Application.ProcessMessages;
  try
    try
      st.Position := 0;
      fZip.ZipStream.LoadFromStream(st);
      fZip.AddStreamToFile(sEPubFilename,0,FILE_ATTRIBUTE_ARCHIVE);
      st.Clear;
      Result := True;
      if Assigned(fOnEPubStatus) then fOnEPubStatus(Self, Format('%s wurde gespeichert.',[sEPubFileName]));
    except
      on e : Exception do begin
        if Assigned(fOnEPubException) then fOnEPubException(Self,'CopyToEPub: ' + e.Message)
        else raise Exception.Create(e.Message) at @TEPub.CopyToEPub;
      end;
    end;
  finally
  end;
  Application.ProcessMessages;
end;
...
Oder meintest Du mit Deiner Fragestellung, dass Du die ZIP-Datei als Stream verwenden willst, also das Archiv selbst nur im Speicher existiert und nicht als Datei?

hoika 1. Jun 2016 15:53

AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
 
Hallo,
danke für das Beispiel.

Ja, ich will die Zipdatei nicht auf der Platte haben.
Die Zipdatei ist in einem Blob-Feld in der DB.

Ich habe also einen TMemoryStream, dort ist die Zipdatei drin.

Ab der 1.92 geht ja angeblich was mit ExtStream, aber irgendwie klappt das bei mir nicht,
so wie hier beschrieben.

http://www.delphizip.org/192/help/un...e_examples.htm
procedure TForm1.UnzToFile2;



Delphi-Quellcode:
var
  ZM: TZipMaster;
  MS: TMemoryStream;
begin
  ZM:= TZipMaster.Create;
  MS.Position := 0;
  ZM.ExtStream.CopyFrom(MS, 0);
Irgendwie so.

Aber du hast ja
fZip.ZipStream.LoadFromStream(st);
genommen.

Heiko

nahpets 1. Jun 2016 16:28

AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
 
Bei meinem Beispiel handelt es sich halt um eine ZIP-Datei auf der Platte, es ist für Dich, da Du das Zip ja in 'ner DB hast, nicht geeignet.

Wie man ein ZIP als Stream handhabt, weiß ich nicht, hab's noch nicht ausprobiert.

aber ich rate jetzt mal so als Idee:
Delphi-Quellcode:
procedure TForm1.CopyToZip;
var
  Idx: Integer;
  SourceStream: TStream;
  ZEntry: TZMDirEntry;
  ZM: TZipMaster;
  st: TMemoryStream;
begin
  ZM := TZipMaster.Create(nil);
  // Hierein kommt das, was ins ZIP übernommen werden soll
  st := TMemoryStream.Create;
  // st irgendwie irgendwoher befüllen
  try
    SourceStream := hier den Blobinhalt in den Stream kopieren;
    try
      ZM.ExtStream := SourceStream; // connect to ZipMaster
      if ZM.ErrCode <> 0 then
        raise Exception.Create('Invalid zip file: ' + ZM.ErrMessage);
      st.Position := 0;
      ZM.ZipStream.LoadFromStream(st);
      ZM.AddStreamToFile('Dateiname im ZIP',0,FILE_ATTRIBUTE_ARCHIVE);
      SourceStream ins Blob kopieren
    finally
      SourceStream.Free;
    end;
  finally
    st.Free;
    ZM.Free;
  end;
end;

Uwe Raabe 1. Jun 2016 16:46

AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
 
Was spricht denn gegen TZipfile aus System.Zip.pas? Das hat doch ein overload für Open, dem man auch einen TStream mitgeben kann.

nahpets 1. Jun 2016 17:02

AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1339306)
Was spricht denn gegen TZipfile aus System.Zip.pas? Das hat doch ein overload für Open, dem man auch einen TStream mitgeben kann.

Ok, gibt es seit XE2, bei meinem alten Delphi 7 nicht dabei.

Laut Doku könnte es aber zum ZIP-Master weitgehend kompatibel sein (so auf die Schnelle mal drübergeschaut) und damit der Änderungsaufwand vertretbar sein.

hoika 1. Jun 2016 18:32

AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
 
Hallo,
TZipFile kann meines Wissens keine passwortgeschützen Zips.

Das ganze hat sich glaube ich aber erledigt.

Der Link in meinem vorigen Beitrag funktioniert, k.A., was ich da falsch gemacht hatte.

Jetzt geht es weiter mit dem Zippen, mal schauen.


Danke an alle.


Heiko

Der schöne Günther 1. Jun 2016 18:50

AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
 
Ich wollte auch erst das ganz normale TZipFile vorschlagen, aber das hatte bei XE4 (das hast du angegeben) noch keinen Umgang mit Streams, erst später.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:13 Uhr.
Seite 1 von 2  1 2      

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