Entwickler-Ecke

Dateizugriff - DFunrar Problem


Blamaster - Fr 03.10.08 19:45
Titel: DFunrar Problem
Hi,

ich habe momentan ein Problem mit der DFunrar Komponente.

Ich möchte gernen ein kleines Entpack Tool programmieren, welches eine Passwortliste mit den Passwörtern abarbeitet die ich am häufigsten benutze, bzw. bekomme.

Nun hab ich mich als an der Kompo versucht:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.FormCreate(Sender: TObject);
begin
  I := -1;
  Liste := Tstringlist.Create;
  Liste.Add('test');
  Liste.Add('test1');
  Liste.Add('test2');
  Liste.Add('test3');
  Liste.Add('test4');
  Liste.Add('test5');
end;



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Unrar;
begin
  dfUnRar1.FileList.Clear;
  dfUnRar1.FileName := DateiPfad; //Quellverzeichnis
// dfUnRar1.FileList.Add('');   //zu entpackende Datei
  dfUnRar1.OverrideEvent := OR_ALWAYS;
  dfUnRar1.Directory := SpeicherPfad + '\'//Zielverzeichnis
  dfUnRar1.Mode := DFRAR_EXTRACT;
  dfUnRar1.Extract;
end;



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.DFUnRar1Password(Sender: TObject; var Password: string);
begin
  if Edit1.Text = '' then
  begin
    Inc(I);
    Password := Liste.Strings[I];
  end
  else
    Password := Edit1.Text;
end;



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.DFUnRar1Error(Sender: TObject; Messagestring;
  MessageID: Integer);
begin
  ShowMessage(Message);
  StatusBar1.SetTextBuf(Pchar(Message));
  DfUnrar1.StopProcessing := true;
  if ((Message = 'Fehlerhafte Daten'or (Message = 'Datei-Header defekt')) and (Edit1.Text = ''then
  begin
    Unrar;
  end;
end;


Das Tool funktioniert soweit auch ganz gut, jendenfalls solange man das Passwort per Hand eingibt. Wenn er nun aber die Liste durcharbeiten soll und an die Stelle mit dem richtigen Passwort kommt, gibt es beim entpacken eine Zugriffsverletzung in der Unrar.dll.
Die Datein sind allerdings danach trotzdem entpackt.

Nun würde mich interessieren woher der Fehler kommt, ich vermute mal durch die Tstringlist kann mir aber nicht erklären warum.

Ich hoffe mir kann jemand helfen :wink:

(Im anhang mal mein Code inkl einer gerarten Textdatei mit dem Passwort "test3" (DfUnrar Komponente wird benötigt!))

mfg Blamaster


jaenicke - So 05.10.08 18:13

Das dürfte an deiner seltsamen Konstruktion liegen in OnError statt nur einen Fehler anzuzeigen erneut einen Unrar-Vorgang zu starten. So wird das Arschiv mehrfach versucht zu schließen...

Denn du stößt in OnError, das ja noch während der Operation angestoßen wird, einen weiteren Entpackvorgang an. Am Ende dieses Vorgangs wird dann das Archiv auch geschlossen, nach dem Abschluss der OnError-Ereignisbehandlung innerhalb der vorhergehenden Entpackvorgänge passiert das aber erneut...

OnError ist eben nur zur Fehleranzeige und -auswertung da. Du wirst dein Konzept überdenken müssen.