AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

sevenzip Api

Ein Thema von -Phantom- · begonnen am 6. Nov 2010 · letzter Beitrag vom 7. Nov 2010
Antwort Antwort
Seite 1 von 2  1 2      
-Phantom-

Registriert seit: 26. Nov 2009
Ort: Bockhorst
319 Beiträge
 
Delphi 7 Enterprise
 
#1

sevenzip Api

  Alt 6. Nov 2010, 14:20
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
Mathias Jansen
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
509 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: sevenzip Api

  Alt 6. Nov 2010, 14:26
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?
  Mit Zitat antworten Zitat
-Phantom-

Registriert seit: 26. Nov 2009
Ort: Bockhorst
319 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: sevenzip Api

  Alt 6. Nov 2010, 14:57
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;
Mathias Jansen
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#4

AW: sevenzip Api

  Alt 6. Nov 2010, 14:58
Die JCL implementiert das glaube ich.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
-Phantom-

Registriert seit: 26. Nov 2009
Ort: Bockhorst
319 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: sevenzip Api

  Alt 6. Nov 2010, 15:17
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 :
Acces violation at address 0064CA88 in module test.exe'. Read of address 00000000
Mathias Jansen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: sevenzip Api

  Alt 6. Nov 2010, 15:19
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 inopenpfad nicht der Dateiname der zip-Datei?
Warum willst Du also in die Zip-Datei entpacken?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 6. Nov 2010 um 15:25 Uhr)
  Mit Zitat antworten Zitat
-Phantom-

Registriert seit: 26. Nov 2009
Ort: Bockhorst
319 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: sevenzip Api

  Alt 6. Nov 2010, 15:46
Muss bei
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"
Mathias Jansen
  Mit Zitat antworten Zitat
aurikel_Max

Registriert seit: 9. Okt 2009
86 Beiträge
 
#8

AW: sevenzip Api

  Alt 6. Nov 2010, 15:53
Muss bei
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
       fs := TFileStream.Create( 'C:\irgendwo\irgendwas.dat', fmOpenCreate );
just my 2 cents
Max
  Mit Zitat antworten Zitat
-Phantom-

Registriert seit: 26. Nov 2009
Ort: Bockhorst
319 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: sevenzip Api

  Alt 6. Nov 2010, 16:04
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!
Mathias Jansen

Geändert von -Phantom- ( 6. Nov 2010 um 16:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#10

AW: sevenzip Api

  Alt 6. Nov 2010, 16:20
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.

Geändert von implementation ( 6. Nov 2010 um 16:24 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:15 Uhr.
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