Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi 7-zip Entpacker einbinden (https://www.delphipraxis.net/108543-7-zip-entpacker-einbinden.html)

Motzi 2. Mär 2008 13:52

Re: 7-zip Entpacker einbinden
 
Ich musste für mein letztes Projekt auch 7zip verwenden (die DLL, nicht das Programm) und hab mir dazu die besagte SevenZip Komponente von Torry angeschaut. Allerdings ist die IMHO absolut schlecht designed und teilweise auch fehlerhaft implementiert -> meiner Ansicht nach ist sie absolut unbrauchbar.

Ich hab mir dann im Endeffekt eine eigene Implementierung geschrieben, diese beschränkt sich bis jetzt allerdings nur auf das Packen - entpacken war bei dem Projekt nicht notwendig, daher hab ich das nicht implementiert. Wenn du willst kann ich dir die Unit trotzdem geben, ich denke es ist recht gut erkennbar wie die 7zip-Dll verwendet werden muss (das herauszufinden war schon ein Abenteuer für sich - der Code der Dll und auch des 7zip-Programms sind so gut wie überhaupt nicht dokumentiert).

Gruß, Motzi

mimi 2. Mär 2008 13:57

Re: 7-zip Entpacker einbinden
 
OH ! Toll, könntest du sie für alle an dein nächsten Beitrag hängen ? ich würde sie mir gerne mal ansehen.

Evlt. kann ich sie für meine 7Zip Oberfläche verwenden das währe toll. Ich meinte einiges konnte die SevenZip Komponente leider auch nicht, darum habe ich sie nicht genommen. Aber zum nach schauen sollte das ausreichen. Gibt es denn schon eine Header Datei für "Object Pascal" von der 7z.dll/so Datei ?

xZise 2. Mär 2008 14:05

Re: 7-zip Entpacker einbinden
 
Hi Michael und Manuel,
ich habe mir mal den Universal Updater angeschaut, und habe mir dort den Code angesehen:
Delphi-Quellcode:
Zip.ExtrBaseDir := Pfad;
Zip.AddRootDir :='c:\';
Zip.SZFileName := inttostr(LatestVersion) + '.7z';
Zip.Extract();
Da die Komponente installiert war, fehlen natürlich die Initalisierungssachen.
Aber aufgrund dessen ist mir aufgefallen, dass "SZFileName" ja ein Dateiname und nicht Dateiname + Pfad haben will.
Also das geändert, und oh wunder ;) Keine OpenDialoge mehr.
Aber was ist bzw. macht "AddRootDir" und "ExtrBaseDir"?

Und Manuel, könntest du den Code mal anhängen? Im Grunde genommen möchte ich ja nur entpacken.

MfG
xZise

Motzi 2. Mär 2008 14:49

Re: 7-zip Entpacker einbinden
 
Liste der Anhänge anzeigen (Anzahl: 2)
Im Anhang sind 2 Archive, einmal eines mit den Object Pascal Versionen der Headerfiles und eines mit meiner SevenZip-Klase inkl. Zubehör. Der Code ist nur teilweise kommentiert/dokumentiert, ich hoffe ihr kommt damit zurecht.
Wie gesagt beherrscht die SevenZip-Klasse bis jetzt nur Packen - dazu bekommt sie eine TCreateArchiveParams-Instanz die alle Parameter enthält. Unter anderem eine TArchiveItemList - eine Liste mit Files die in das Archiv rein sollen. Man kann jedes Element einzeln zu dieser Liste hinzufügen, oder aber (wenn ein ganzer Ordner und evnetuell Unterordner) reinsoll, dann kann man sich mit der TFileListing-Klasse ein komplettes Listing erstellen lassen (wobei TFileArchiveItem und TFolderArchiveItem als Parameter übergeben werden müssen).

Bei Unklarheiten kann ich eventuell kann ich mal ein kleines Demo erstellen.

Edit: die SevenZip-Komponente von Torry enthält zwar teilweise auch Übersetzungen der Headerfiles, allerdings von einer älteren Version und außerdem sind sie unvollständig und teilweise fehlerhaft. Die Übersetzungen im Anhang hab ich daher selbst gemacht, ich hoffe es ist alles korrekt...

mimi 2. Mär 2008 14:50

Re: 7-zip Entpacker einbinden
 
Vielen Dank ! Werde ich mir gleich mal ansehen.

xZise 2. Mär 2008 17:35

Re: 7-zip Entpacker einbinden
 
Hmmm... Nicht gerade einfach der Code ^^

Zu der 7zVCL Komponente:
Wenn ich das wie oben mache und nur den Dateinamen setzte, dann funktionierts immer noch nicht, weil i <> 0 ist :(
Warum muss man das auch so benutzerunfreundlich machen.
Delphi-Quellcode:
[...]
updateOpenCallback := TMyArchiveOpenCallback.Create( self );
i := inA.Open( ms, nil, updateOpenCallback );

if i <> 0 then begin
  Result := -1;
  ErrCode:=FFileNotFound;                                 //FHO 21.01.2007
  if assigned( onMessage ) then
    onMessage( self,FFileNotFound, c7zipResMsg[FFileNotFound],FSevenZipFileName );
   ms.Free;                                               //FHO crash at wrong pw 25.01.2007
   Exit;
end;
[...]
(Extract-Prozedur)

MfG
xZise

Motzi 2. Mär 2008 18:45

Re: 7-zip Entpacker einbinden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, ich seh ein, dass er am Anfang nicht gerade einfach zu verstehen ist. Vor allem da es keine wirkliche Dokumentation dazu gibt. Aber wenn man ihn einmal durchschaut hat ist er sehr einfach zu verwenden und vor allem sehr flexibel (vor allem die FileListing-Unit - auf die bin ich besonders stolz! :))

Ich hab mal ein kurzes Demo zusammengeklickt, das zeigt wie man die einzelnen Klassen benutzt. Das komplette Projekt befindet sich im Anhang.

Gruß, Motzi

xZise 12. Mär 2008 18:03

Re: 7-zip Entpacker einbinden
 
Hi,
ich denke du kannst was mit dem Code anfangen, aber ich blicke da nicht irgendwie da so richtig durch.

Was macht z.B. TStreamReader? Im Endeffekt sieht es so aus, als würde sie... TStream imitieren ... oder nicht?
Und warum nicht TStream nehmen?

War wohl ein Fehler zu vermuten, dass OpenSource Systeme eher implementiert werden...

Zu 7zipVCL, sollte wirklich jemand das benutzten und wissen was er tut, wie umgeht man das Problem, dass in der .dfm der Demo ungültige Werte stehen?
Delphi-Quellcode:
sevenZip.LPPMDmem := 0;
sevenZip.LPPMDsize := 0;
MfG
xZise

Motzi 13. Mär 2008 11:06

Re: 7-zip Entpacker einbinden
 
Zitat:

Zitat von xZise
Was macht z.B. TStreamReader? Im Endeffekt sieht es so aus, als würde sie... TStream imitieren ... oder nicht?
Und warum nicht TStream nehmen?

Die 7-zip DLL arbeitet nur mit Interfaces, mit einem TStream könnte sich nichts anfangen. Deswegen hab ich die beiden Klassen TStreamReader und TStreamWriter geschrieben, die nichts anderes sind als ein Wrapper von TStream auf IInStrem+ISequentialInStream/IOutStream+ISequentialOutStream.
Man muss zuerst einmal das System der 7-zip DLL verstehen, aber leider ist das nicht so einfach da es überhaupt nicht dokumentiert ist. Ich hab auch sehr lang gebraucht bis ich es durchschaut hab.

Gruß, Motzi

xZise 14. Mär 2008 22:16

Re: 7-zip Entpacker einbinden
 
Ah okay. Ist etwas verwirrend :) Da muss man erstmal durchblicken :(
Was macht den genau TStreamReader?

Und wie würde man am besten ran gehen zu entpacken?

An alle die 7zipVCL verwenden (scheint wohl <= 0 zu sein :cry: ): Wie habt ihr es hingekriegt, etwas zu entpacken? Das es geht, sieht man ja an einem Programm was hier in der DP steht. Aber dort steht eigentlich das was ich habe :| Aber ohne Erfolg.
Ich habe erraten, dass wenn SZFilename existiert kommt der Opendialog ansonsten nicht. Wäre jetzt nur noch nett zu wissen, was ich dagegen mach muss.

MfG
xZise


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

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