Delphi-PRAXiS
Seite 1 von 3  1 23      

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)

xZise 15. Feb 2008 16:17


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

mimi 15. Feb 2008 16:39

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:
http://www.7-zip.org/sdk.html und
http://www.birtles.org.uk/programming/

und eine Komponente:
http://www.torry.net/quicksearchd.ph...nzip&Title=Yes
dort musst du nach SevenZipVCL_074 suchen.

xZise 26. Feb 2008 14:29

Re: 7-zip Entpacker einbinden
 
Also ich habe mich mal dran versucht, und bin dran gescheitert :(

Und zwar habe ich folgendes Problem:
Delphi-Quellcode:
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;
Wenn ich nun ".Extract" oder ".List" aufrufe, zeigt er einen OpenDialog an. kA warum?!

MfG
xZise

mimi 26. Feb 2008 17:11

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.

xZise 26. Feb 2008 18:13

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

mimi 26. Feb 2008 18:36

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

xZise 26. Feb 2008 18:43

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:
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 );
  [...]
Bei inA.Open zeigt er dann das Fenster an.
Was genau er da macht ist ziemlich verwirrend dann ;)

MfG
xZise

mimi 26. Feb 2008 18:57

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:
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;
so machen die das im demoe... fürs Entpacken. Evlt. musst du erst eine liste mit Dateien füllen die du Entpacken möchtest !

xZise 2. Mär 2008 12:53

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

mimi 2. Mär 2008 13:14

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 www.lazarusforum.de meine 7Zip Oberfläche anschauen.

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 08:51 Uhr.
Seite 1 von 3  1 23      

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