Delphi-PRAXiS

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.

Uwe Raabe 1. Jun 2016 19:59

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

Zitat von Der schöne Günther (Beitrag 1339315)
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.

Gibt es aber schon seit XE2:

Delphi-Quellcode:
procedure TZipFile.Open(ZipFileStream: TStream; OpenMode: TZipMode);

hoika 1. Jun 2016 21:15

AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
 
Hallo,
ich gebe mal wieder entnervt mit dem ZipMaster auf ...
Viele Stunden Freizeit umsonst verballert.

Warum kann ich nicht, ohne eine physische Zip-Datei anzugeben,
eine Zip-Datei als simplen Stream erzeugen lassen ???

Ich will einfach keine Datei-Operationen für etwas, was komplett im Speicher laufen könnte!

Ich werde mir jetzt Abbrevia ansehen, die können das vielleicht besser.

PS:
TZipMaster 1.93 kann das vielleicht ???


Heiko

mm1256 2. Jun 2016 11:35

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

Zitat von hoika (Beitrag 1339319)
Hallo,
ich gebe mal wieder entnervt mit dem ZipMaster auf ...
Viele Stunden Freizeit umsonst verballert....

Das ist - wie so oft im Programmierer-Leben - der entscheidende Punkt. Entweder man investiert Zeit oder Geld. Manchmal muss man zudem noch Zeit investieren, um nicht zu viel Geld auszugeben, oder in das richtige Produkt zu investieren. Darum habe ich mich zum Zippen für ZipForge entschieden. Das kann alles was man braucht, ich muss also nicht immer wieder mal was nachrüsten und aufwändig meinen Code ändern. Und auch am Komfort mangelt es nicht. Ich denke da z.B. an die Möglichkeit den Zip64-Mode automatisch zu aktivieren, oder über ein einfaches Boolean-Property den Zip-Vorgang komplett im Speicher (also auch ohne temporäre Datei) durchzuführen.

sh17 2. Jun 2016 11:55

AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
 
So geht es mit Abbrevia

Code:
uses AbZipper, AbArcTyp,AbZipTyp,Abutils
 
var
  Zip : TAbZipper;
begin
  Zip := TAbZipper.Create(nil);
  try
  try
    Zip.CompressionMethodToUse := smBestMethod;
    //Zip.StoreOptions := Zip.StoreOptions + [soStripPath];
    Zip.ArchiveType := atZip;
    Zip.ForceType := true;
    //Zip.OpenArchive(Zipfilename);
    Zip.Stream := MeinStream;

    Zip.AddFiles(..,0);
    zip.CloseArchive;
  except
    on E:Exception do ...
  end;
  finally
    zip.Free;
  end;

Uwe Raabe 2. Jun 2016 11:59

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

Zitat von mm1256 (Beitrag 1339369)
Entweder man investiert Zeit oder Geld. Manchmal muss man zudem noch Zeit investieren, um nicht zu viel Geld auszugeben, oder in das richtige Produkt zu investieren. Darum habe ich mich zum Zippen für ZipForge entschieden.

:thumb: für ZipForge!

Kann man ja mal nachrechnen, wieviel Zeit man für die 49,- € einspart.

mm1256 2. Jun 2016 12:51

AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
 
@Uwe Ich hab die paar Euros für den Quellcode hinzu genommen, weil ich nach Möglichkeit keine Komponenten ohne Quellcode einsetze. Der Quellcode ist einerseits (für mich) die beste Online-Hilfe und zum Anderen kann man auch schnell mal etwas erweitern. Praktisch ist beispielsweise die Möglichkeit, direkt eine StringList zippen zu können :wink:

Delphi-Quellcode:
  TZFBaseArchiver = class(TComponent)
    ...
    // adds files using the FileList...added by Otto Herdegen
    procedure AddFiles(const FileList: TStringList); overload;

Uwe Raabe 2. Jun 2016 14:12

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

Zitat von mm1256 (Beitrag 1339383)
@Uwe Ich hab die paar Euros für den Quellcode hinzu genommen, weil ich nach Möglichkeit keine Komponenten ohne Quellcode einsetze.

Das ist selbstredend der richtige Ansatz. Meine Preisangabe sollte lediglich die niedrige Einstiegshürde aufzeigen.

hoika 2. Jun 2016 16:33

AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
 
Hallo,
tja, leider ist das uralter Code, den ich weiterpflegen muss.

Ich schaue mir Abbrevia mal an (und Zipforge ;) ).

Danke an alle.


Heiko

mm1256 2. Jun 2016 18:23

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

Zitat von hoika (Beitrag 1339408)
Hallo,
tja, leider ist das uralter Code, den ich weiterpflegen muss.

Willkommen im Club :)

Umso jünger man noch ist (im Umkehrsinn also, umso mehr Jahre man noch bis zur Rente vor sich hat) umso wichtiger ist die Tatsache, dass Code den man heute schreibt irgendwann einmal ebenso uralter Code wird. D.h. man legt jeden Tag den Grundstein dafür, wie arbeitsintensiv die Pflege seines Codes in Zukunft sein wird. Ich weiß, das klingt jetzt etwas nach Klugschei... aber es ist letztendlich so. Aus diesem Grund ist die Entscheidung, welche Komponenten man einsetzt, langfristig gesehen so wichtig für Erfolg und Misserfolg eines Projektes.

Das ist dann irgendwie vergleichbar mit einem alten Auto. Irgendwann kommt der Zeitpunkt an dem sich eine Reparatur nicht mehr lohnt....:stupid:

dataspider 3. Jun 2016 09:35

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

Zitat von hoika (Beitrag 1339319)
Hallo,
ich gebe mal wieder entnervt mit dem ZipMaster auf ...
Viele Stunden Freizeit umsonst verballert.

Warum kann ich nicht, ohne eine physische Zip-Datei anzugeben,
eine Zip-Datei als simplen Stream erzeugen lassen ???

Ich will einfach keine Datei-Operationen für etwas, was komplett im Speicher laufen könnte!

Ich werde mir jetzt Abbrevia ansehen, die können das vielleicht besser.

PS:
TZipMaster 1.93 kann das vielleicht ???


Heiko

Ich hatte damals mit Delphi 7 die zlibex.pas mit TZCompressionStream verwendet.
Das hat auf jeden Fall funktioniert.

Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:22 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