![]() |
7-zip Entpacker einbinden
Moin DP,
ich habe eine Frage zu 7-zip: Bisher habe ich nur exen gefunden, welche Entpacken, aber ich würde gerne das als Delphi Komponente haben, so dass ich einen Fortschrittsbalken anzeigen kann. Dabei muss diese Komponente mind. 7z, rar und zip entpacken können. MfG xZise |
Re: 7-zip Entpacker einbinden
Bei Meiner 7Zip Oberfläche die ich mit Lazarus erstellt habe, mache ich das einfach so:
Ich rufe zur Laufzeit einfach die Anwendung 7Z auf und Parse dann die Programm Ausgabe. Und das mache ich in einem Extra Thread... Hier sind einige Links für dich: ![]() ![]() und eine Komponente: ![]() dort musst du nach SevenZipVCL_074 suchen. |
Re: 7-zip Entpacker einbinden
Also ich habe mich mal dran versucht, und bin dran gescheitert :(
Und zwar habe ich folgendes Problem:
Delphi-Quellcode:
Wenn ich nun ".Extract" oder ".List" aufrufe, zeigt er einen OpenDialog an. kA warum?!
sevenZip := TSevenZip.Create(self);
try sevenZip.SFXCreate := False; sevenZip.SFXModule := '7z.sfx'; sevenZip.AddOptions := [AddRecurseDirs]; sevenZip.ExtractOptions := []; sevenZip.LZMACompressType := LZMA; sevenZip.LZMACompressStrength := NORMAL; sevenZip.LZMAStrength := 0; sevenZip.ExtrBaseDir := bufferPath; //sevenZip.LPPMDmem := 0; //sevenZip.LPPMDsize := 0; sevenZip.NumberOfFiles := -1; sevenZip.VolumeSize := 1000000; sevenZip.OnProgress := SevenZipProgress; sevenZip.SZFileName := FUpdateInformation[FArchiveIdx * 3]; sevenZip.Extract; finally FreeAndNil(sevenZip); end; MfG xZise |
Re: 7-zip Entpacker einbinden
ich habe damit nie was gemacht da es für Delphi ist....
Aber schau doch mal nach was sevenZip.SZFileName macht. Ich wette das ist eine Eigenschaft ein Property. Ich könnte mir vorstellen das er den Dateinamen nicht findet oder so. |
Re: 7-zip Entpacker einbinden
Hi mimi
Naja: Ich habe den Wert des Ausdrucks kopiert und im Windows Explorer kopiert, welcher das öffnen konnte. MfG xZise |
Re: 7-zip Entpacker einbinden
Also geht die Datei oder wie ? Also das Archiv was du entpacken möchtest ?
ich dachte an: sevenZip.SZFileName := FUpdateInformation[FArchiveIdx * 3]; evlt. musst du ganze Pfad angaben machen. lasse dir mal ausgeben was in FUpdateInformation[FArchiveIdx * 3] drin steht.... ob da eine ganze Pfad Angebe drin steht also: c:\testdir\testfile.txt |
Re: 7-zip Entpacker einbinden
Also darin steht genau die Datei die ich entpacken möchte.
Nun habe ich den Code debuggt, und komme da an diese Stelle:
Delphi-Quellcode:
Bei inA.Open zeigt er dann das Fenster an.
function TSevenZip.Extract( TestArchive:Boolean=False ): Integer;
var updateCallback: TMyArchiveExtractCallback; updateOpenCallback: TmyArchiveOpenCallback; ms: TMyStreamReader; filesDW: array of DWORD; Filestoex,w: DWORD; i,j,n: Integer; FMaxProgress:int64; size: PROPVARIANT; // fnameprop: PROPVARIANT; // fileInArchive, fileToExtract: WideString; begin try // 24.08.06 - Matteo Riso - Status: experimental // 25.08.06 Modified by rg // // If we loaded an .EXE file, we could start reading from offset 132096. // Also supported by newerdll // if FIsSFX then ms.Seek( FSFXOffset,0,@FSFXOffset ); // End - MR modification // Shadow 28.11.2006 if UppercaseW_( ExtractFileExtW( FSevenZipFileName ) ) = '.EXE' then begin if not SFXCheck( FSevenZipFileName ) then begin Result := -1; ErrCode:=FNoSFXarchive; //FHO 21.01.2007 if assigned( onMessage ) then onMessage( self, FNoSFXarchive, c7zipResMsg[FNoSFXarchive], Fsevenzipfilename ); Exit; end; end; ms := TMyStreamReader.Create( Self, FSevenZipFileName, TRUE ); inA.Close; updateOpenCallback := TMyArchiveOpenCallback.Create( self ); i := inA.Open( ms, nil, updateOpenCallback ); [...] Was genau er da macht ist ziemlich verwirrend dann ;) MfG xZise |
Re: 7-zip Entpacker einbinden
anscheind nimmst du die Falsche Methode. Das sieht für mich so aus als ob da so ein Open Dialog kommen soll. das ist also vorgesehen von den Entwicklern. Aber welche Funktion du noch nehmen kannst weiß ich nicht. es gibt noch noch extract Optionen hast du die schon probiert ?
schau doch mal nach was inA: IInArchive; Geanu IInArchive ist. könnte ein Interface sein. Ich habe auf meiner Platte auch noch SevenZip. Also ich weiß im Moment nicht weiter. edit
Delphi-Quellcode:
so machen die das im demoe... fürs Entpacken. Evlt. musst du erst eine liste mit Dateien füllen die du Entpacken möchtest !
procedure TForm1.extractarchiveClick(Sender: TObject);
var i : integer; begin //select extract dir sevenzip1.ExtrBaseDir := 'c:\7ztest'; //Overwrite existing files during extrect ? sevenzip1.ExtractOptions := sevenzip1.ExtractOptions + [ExtractOverwrite]; //Clear Extractlist - for all files do nothing else sevenzip1.Files.clear; if listview1.SelCount > 0 then for i := 0 to listview1.Items.Count -1 do if listview1.Items[i].Selected then sevenzip1.Files.AddString(listview1.Items[i].SubItems[6]); //extract files i := sevenzip1.Extract; // Show result label1.caption := inttostr(i); end; |
Re: 7-zip Entpacker einbinden
Naja, ich habe mir mal die Demo angesehen, und irgendwie ist diese Komponente so arg statisch!
Und zwar, wenn man ein Archiv öffnen möchte, muss man auf "List Archive" klicken. Diese ruft aber wiederrum ".List" auf, welche wiederrum einen OpenDialog anzeigt?! Und mithilfe von ".List" wird das Ereigniss "ListProgress" oder so aufgrufen, wo dann endlich die FileIndexes stehen, welche ich dann der FilesListe hinzufügen könnte. MfG xZise |
Re: 7-zip Entpacker einbinden
Dann bleibt dir nur eine Möglichkeit übrig: Du musst das Programm 7z mit Parametern Starten.
Ich meine für Windows sollte es auch eine Kommandozeilen Anwendung da sein. Dazu könntest du dir unter ![]() Evlt. Hilft das ja. Ist zwar nicht die schöne art, aber es geht und unter Linux habe ich gehört ist das die gäng ste "sache" einfach auf externe Programm zu zurückzugreifen. Für Windows zwar nicht, sollte aber auch gehen. Wenn du dort nicht angemeldet bist kann ich dir mein Projekt auch gerne per PM senden oder an mein nächsten Beitrag hängen. Es ist aber nur für Lazarus. Sollte aber Trotzdem zum nach schauen Hilfreich sein. Wenn du möchtest könnte ich auch draus ein Klasse erstellen, die auf das 7Z Programm zu zurückgreift. Ich hoffe du weißt wie ich das meine. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:18 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