![]() |
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 ![]() Ich versteht aber die Lizenz nicht ![]() Darf ich denn jetzt ich kommerzielle Anwendungen damit entwickeln? Danke Heiko |
AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
evtl ist das aktueller
![]() Ich dachte immer Mozilla PL ist immer für kommerziell. |
AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
Zitat:
|
AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
Zitat:
Hier ein Auszug aus 'ner Klasse, mit der ich EPubs erstelle:
Delphi-Quellcode:
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?
...
// 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; ... |
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. ![]() procedure TForm1.UnzToFile2;
Delphi-Quellcode:
Irgendwie so.
var
ZM: TZipMaster; MS: TMemoryStream; begin ZM:= TZipMaster.Create; MS.Position := 0; ZM.ExtStream.CopyFrom(MS, 0); Aber du hast ja fZip.ZipStream.LoadFromStream(st); genommen. Heiko |
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; |
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.
|
AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
Zitat:
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. |
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 |
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.
|
AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
Zitat:
Delphi-Quellcode:
procedure TZipFile.Open(ZipFileStream: TStream; OpenMode: TZipMode);
|
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 |
AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
Zitat:
|
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; |
AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
Zitat:
Kann man ja mal nachrechnen, wieviel Zeit man für die 49,- € einspart. |
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; |
AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
Zitat:
|
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 |
AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
Zitat:
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: |
AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia
Zitat:
Das hat auf jeden Fall funktioniert. Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 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