![]() |
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:
Nun möchte ich aber nur eine Bestimmte Datei aus dem Archiv entpacken, finde dazu aber nicht die richtige Funktion.
with CreateInArchive(CLSID_CFormatZip) do
begin openfile(*FILE*); createdir(*File*); Extractto(*File*); 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 |
AW: sevenzip Api
Delphi-Quellcode:
Ich habe mit der 7zip-API noch nicht gearbeitet, aber müsste die Procedure ExtractItem nicht genau das sein was du suchst?
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; |
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; |
AW: sevenzip Api
Die JCL implementiert das glaube ich.
|
AW: sevenzip Api
Ich hab es nun so versucht :
Delphi-Quellcode:
Dann kommt ein Laufzeit ERROR :
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;
Delphi-Quellcode:
Acces violation at address 0064CA88 in module test.exe'. Read of address 00000000
|
AW: sevenzip Api
Zitat:
Delphi-Quellcode:
EDIT: steht in
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;
Delphi-Quellcode:
nicht der Dateiname der zip-Datei?
openpfad
Warum willst Du also in die Zip-Datei entpacken? |
AW: sevenzip Api
Muss bei
Delphi-Quellcode:
der Archivpfad+der Dateipfad im Archiv?
fs := TFileStream.Create(openpfad+*itempfad*, fmOpenread );?
Hab ich so gemacht:
Delphi-Quellcode:
Dann kommt "Das System konnte den angegebenen Pfad nicht finden"
dateipfad := openpfad+'/'+dateilist.Items[i].subitems[0]
TFileStream.Create(dateipfad, fmOpenread ) |
AW: sevenzip Api
Zitat:
Delphi-Quellcode:
fs := TFileStream.Create( 'C:\irgendwo\irgendwas.dat', fmOpenCreate );
just my 2 cents |
AW: sevenzip Api
Ich hab es nun so gemacht
Delphi-Quellcode:
Und geht immer noch nicht
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; "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! |
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 09:19 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