Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi sevenzip Api (https://www.delphipraxis.net/155753-sevenzip-api.html)

-Phantom- 6. Nov 2010 13:20

sevenzip Api
 
Hallo Leute,

ich weiß nun nicht ob das die richtige Schublade ist, falls nicht bitte ich um Entschuldigung.

Zu meinem Problem: Ich möchte mit der Sevenzip.pas ein Archiv entpacken. Klappt auch wunderbar.
Delphi-Quellcode:
with CreateInArchive(CLSID_CFormatZip) do
begin
openfile(*FILE*);
createdir(*File*);
Extractto(*File*);
Nun möchte ich aber nur eine Bestimmte Datei aus dem Archiv entpacken, finde dazu aber nicht die richtige Funktion.
Stelle mir das so wie
Extractitem[i].to(*File*) ( oder so ähnlich )
Ich hab auch schon die Sevenzip.pas durchsucht aber finde nichts passendes.

Hoffe ihr könnt mir helfen

ringli 6. Nov 2010 13:26

AW: sevenzip Api
 
Delphi-Quellcode:
  I7zInArchive = interface
  ['{022CF785-3ECE-46EF-9755-291FA84CC6C9}']
    procedure OpenFile(const filename: string); stdcall;
    procedure OpenStream(stream: IInStream); stdcall;
    procedure Close; stdcall;
    function GetNumberOfItems: Cardinal; stdcall;
    function GetItemPath(const index: integer): UnicodeString; stdcall;
    function GetItemName(const index: integer): UnicodeString; stdcall;
    function GetItemSize(const index: integer): Cardinal; stdcall;
    function GetItemIsFolder(const index: integer): boolean; stdcall;
    function GetInArchive: IInArchive;
--> procedure ExtractItem(const item: Cardinal; Stream: TStream; test: longbool); stdcall;
    procedure ExtractItems(items: PCardArray; count: cardinal; test: longbool;
      sender: pointer; callback: T7zGetStreamCallBack); stdcall;
    procedure ExtractAll(test: longbool; sender: pointer; callback: T7zGetStreamCallBack); stdcall;
    procedure ExtractTo(const path: string); stdcall;
    procedure SetPasswordCallback(sender: Pointer; callback: T7zPasswordCallback); stdcall;
    procedure SetPassword(const password: UnicodeString); stdcall;
    procedure SetProgressCallback(sender: Pointer; callback: T7zProgressCallback); stdcall;
    procedure SetClassId(const classid: TGUID);
    function GetClassId: TGUID;
    property ClassId: TGUID read GetClassId write SetClassId;
    property NumberOfItems: Cardinal read GetNumberOfItems;
    property ItemPath[const index: integer]: UnicodeString read GetItemPath;
    property ItemName[const index: integer]: UnicodeString read GetItemName;
    property ItemSize[const index: integer]: Cardinal read GetItemSize;
    property ItemIsFolder[const index: integer]: boolean read GetItemIsFolder;
    property InArchive: IInArchive read GetInArchive;
  end;
Ich habe mit der 7zip-API noch nicht gearbeitet, aber müsste die Procedure ExtractItem nicht genau das sein was du suchst?

-Phantom- 6. Nov 2010 13:57

AW: sevenzip Api
 
Müsste eigentlich schon das richtige sein.

Nun ist die frage wie mache ich das?!

Denn " procedure ExtractItem(const item: Cardinal; Stream: TStream; test: longbool); stdcall;" erfordert ja einen Stream.

Mein Ansatz
Delphi-Quellcode:
var
i : Integer;
begin
with CreateInArchive(CLSID_CFormatZip) do
begin
  openfile(openpfad);
  for i := 0 to dateilist.Items.Count - 1 do begin
    if dateilist.Items[i].Selected then begin
      extractitem(i,*was hier hin*,true);
    end;
  end;

Dezipaitor 6. Nov 2010 13:58

AW: sevenzip Api
 
Die JCL implementiert das glaube ich.

-Phantom- 6. Nov 2010 14:17

AW: sevenzip Api
 
Ich hab es nun so versucht :
Delphi-Quellcode:
var
i : Integer;
datei : TStream;
begin

with CreateInArchive(CLSID_CFormatZip) do
begin

datei := TFileStream.Create(openpfad, fmOpenRead);
  for i := 0 to dateilist.Items.Count - 1 do begin
    if dateilist.Items[i].Selected then begin
      extractitem(i,datei,true);
    end;


  end;

end;
end;
Dann kommt ein Laufzeit ERROR :
Delphi-Quellcode:
Acces violation at address 0064CA88 in module test.exe'. Read of address 00000000

Sir Rufo 6. Nov 2010 14:19

AW: sevenzip Api
 
Zitat:

Zitat von -Phantom- (Beitrag 1060040)
Müsste eigentlich schon das richtige sein.

Nun ist die frage wie mache ich das?!

Denn " procedure ExtractItem(const item: Cardinal; Stream: TStream; test: longbool); stdcall;" erfordert ja einen Stream.

Mein Ansatz

mal erweitert
Delphi-Quellcode:
var
i : Integer;
fs : TFileStream;
begin
with CreateInArchive(CLSID_CFormatZip) do
begin
  openfile(openpfad);
  for i := 0 to dateilist.Items.Count - 1 do begin
    if dateilist.Items[i].Selected then
    begin
      // !! ACHTUNG !!
      // Den Dateinamen + Verzeichnis aus dem Archiv auslesen
      // Im Archiv sollten sich die relativen Pfade befinden
      // oder sogar in dateilist.items ???
      fs := TFileStream.Create( 'C:\irgendwo\irgendwas.dat', fmOpenCreate );
      try
        extractitem(i, fs ,true);
      finally
        fs.Free;
      end;
    end;
  end;
EDIT: steht in
Delphi-Quellcode:
openpfad
nicht der Dateiname der zip-Datei?
Warum willst Du also in die Zip-Datei entpacken?

-Phantom- 6. Nov 2010 14:46

AW: sevenzip Api
 
Muss bei
Delphi-Quellcode:
fs := TFileStream.Create(openpfad+*itempfad*, fmOpenread );?
der Archivpfad+der Dateipfad im Archiv?

Hab ich so gemacht:
Delphi-Quellcode:
dateipfad := openpfad+'/'+dateilist.Items[i].subitems[0]
TFileStream.Create(dateipfad, fmOpenread )
Dann kommt "Das System konnte den angegebenen Pfad nicht finden"

aurikel_Max 6. Nov 2010 14:53

AW: sevenzip Api
 
Zitat:

Zitat von -Phantom- (Beitrag 1060060)
Muss bei
Delphi-Quellcode:
fs := TFileStream.Create(openpfad+*itempfad*, fmOpenread );?
der Archivpfad+der Dateipfad im Archiv?

Bezieht sich der FileStream nicht auf die auszugebende Datei? Deswegen benutzt doch SirRufo
Delphi-Quellcode:
       fs := TFileStream.Create( 'C:\irgendwo\irgendwas.dat', fmOpenCreate );

just my 2 cents

-Phantom- 6. Nov 2010 15:04

AW: sevenzip Api
 
Ich hab es nun so gemacht
Delphi-Quellcode:
var
i : Integer;
datei : TfileStream;
dateiname : String;
begin

with CreateInArchive(CLSID_CFormatZip) do
begin
 openfile(openpfad);
  for i := 0 to dateilist.Items.Count - 1 do begin
    if dateilist.Items[i].Selected then begin
    dateiname := dateilist.Items[i].Caption;
     datei := TFileStream.Create('C:\Users\Administrator\Desktop\Test\'+dateiname, fmOpenread );
     try
        extractitem(i, datei ,true);
      finally
        datei.Free;
    end;
  end;
end;
end;
end;
Und geht immer noch nicht
"System konnte den angegebenen Pfad nicht finden"

@Sir RuFo
Du hast "fmOpenCreate" geschrieben , dass geht bei mir nicht.


// Ich hab es einfach "fmcreate" und schon klappt es nicht ganz, denn die Dateien die erstellt werden ist leer!

implementation 6. Nov 2010 15:20

AW: sevenzip Api
 
Wenn die Datei noch nicht existiert, kann sie auch nicht gefunden werden.
Deshalb hat Sir Rufo ja auch fmOpenCreate benutzt, weil dabei die Datei neu erstellt würde, falls sie noch nicht existiert. Nur scheint er sich da vertan zu haben, dann die Konstante gibt es in SysUtils nicht, nur fmOpenRead, fmOpenWrite und fmOpenReadWrite.
Demnach musst du imho selbst dafür sorgen, dass die Datei erstellt wird.
Mit fmOpenRead kann es überhaupt nicht klappen, weil du damit die Datei nur zum Lesen öffnest, du benötigst aber Schreibkontext, um dorthinein zu entpacken: also fmOpenWrite oder fmOpenReadWrite.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:41 Uhr.
Seite 1 von 2  1 2      

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