Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi RenameFile: Fehlerbehandlung (https://www.delphipraxis.net/151679-renamefile-fehlerbehandlung.html)

juergen 27. Mai 2010 21:04


RenameFile: Fehlerbehandlung
 
Hallo zusammen,

bewußt habe ich einige Dateien schreibgeschützt. Beim Ausführen von RenameFile erscheint im Debugger auch schön folgende Meldung:
Zitat:

Erste Gelegenheit für Exception bei $75319617. Exception-Klasse EFOpenError mit Meldung 'Datei C:\_Test\Culcha Candela - Monsta.mp3 kann nicht geöffnet werden. Zugriff verweigert
'. Prozess Dateien_filtern_sortieren_suchen_abspielen_umbenne n.exe (2596)
Thread-Ende: Thread-ID: 2072. Prozess Dateien_filtern_sortieren_suchen_abspielen_umbenne n.exe (2596)
RenameFile gibt ja einen Rückgabewert ob das Umbenennen erfolgreich war oder nicht.
Einer von vielen Versuchen sieht bei mir so aus:
Delphi-Quellcode:
...
  if not RenameFile(........) then begin
    raise Exception.Create('Die Datei "Test.txt" konnte nicht umbenannt werden. Ursachen könnten Schreibschutz, Datei wird verwendet, oder fehlende Zugriffsrechte sein.');
...
Es erscheinen aber keine Fehlermeldungen aus dem Programm heraus... :gruebel:
Ich möchte, dass die Fehlermeldung wie sie im Debugger erscheint auch vom Programm erstellt wird (Zugriff verweigert).

Wo ist mein Denkfehler oder seh' ich den Wald vor lauter Bäumen nicht?

Schon mal Danke vorab!

Matze 27. Mai 2010 21:21

Re: RenameFile: Fehlerbehandlung
 
In der Online-Hilfe steht es so, wie du es hast: Delphi-Referenz durchsuchenRenameFile

Delphi-Quellcode:
if not RenameFile(SaveDialog1.FileName, BackupName) then
  raise Exception.Create('Unable to create backup file.');
Hast du vielleicht Exceptions global irgendwie unterdrückt o.ä.?

Du kannst auch mal versuchen, dass Projekt neu erzeugen zu lassen. Das hat bei mir ab und zu die merkwürdigsten Fehler beseitigt, die man sich nicht erklären konnte.

s.h.a.r.k 27. Mai 2010 21:42

Re: RenameFile: Fehlerbehandlung
 
Was bringt das Ganze aber wenn der Aufruf von RenameFile die Exception wirfst? Wäre halt noch interessant, welcher Befehl den fehl schlägt.

himitsu 27. Mai 2010 21:51

Re: RenameFile: Fehlerbehandlung
 
Eigentlich sollte doch MSDN-Library durchsuchenMoveFile (die WinAPI direkt hinter RenameFile) keine Exceptions auslösen, sondern mit SetLastError arbeiten? :shock:

juergen 27. Mai 2010 22:05

Re: RenameFile: Fehlerbehandlung
 
Hallo Matze,

danke für deine Antwort!
Bin immer noch am Suchen...
Deinen Rat das Projekt neu zu erzeugen hatte ich zuvor schon mal getan.
Ich habe auch keine Fehler unterdrückt durch Compilerschalter wenn du das meinst.
Andere Fehlermeldungen erscheinen, nur diese EFOpenError-Meldung nicht... :gruebel:
Habe zwischenzeitlich von Embar..Dingens folgendes gefunden und probiert, funktioniert aber auch nicht:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnException := AppException;
end;
 
procedure TForm1.AppException(Sender: TObject; E: Exception);
begin
  Application.ShowException(E);
  Application.Terminate;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  raise EPasswordInvalid.Create('Incorrect password entered');
end;
Ratlose Grüße.

//roter Kasten
@ s.h.a.r.k
ich lass in einer Schleife mehrere Dateien umbenennen und möchte dem Anwender auch jeweils eine Rückmeldung geben, welche Datei(en) nicht umbenant werden konnten.



Jetzt erst festgestellt, da ich das zuvor ausgeschlossen hatte:
RenameFile gibt mir True zurück! :gruebel:
Warum das denn?

// 2. roter Kasten (bin ich heute langsam)
@ himitsu,
SetLastError schau ich mir gleich mal an!

himitsu 28. Mai 2010 06:56

Re: RenameFile: Fehlerbehandlung
 
Für dich natürlich GetLastError :zwinker:

Delphi-Quellcode:
if not RenameFile(...) then
  ShowMessage(SysErrorMessage(GetLastError));
MSDN-Library durchsuchenGetLastError und eventuell noch Delphi-Referenz durchsuchenSysErrorMessage

Wie gesagt, hier kannst/muß du dich an die Fehlerbehandlung für MoveFile halten.
Delphi-Quellcode:
function RenameFile(const OldName, NewName: string): Boolean;
begin
  Result := MoveFile(PChar(OldName), PChar(NewName));
end;

juergen 28. Mai 2010 12:24

Re: RenameFile: Fehlerbehandlung
 
Hallo himitsu,

danke für deine Antwort!
Das Problem ist aber, dass mir RenmaFile() true zurück gibt, obwohl die Datei nicht umbenannt werden konnte. :gruebel:
Der Debugger zeigt die Exception aber an.

Ich werde heute Abend in einem neuen Projekt nachschauen wie sich dann dort RenameFile() verhält.

blackfin 28. Mai 2010 12:56

Re: RenameFile: Fehlerbehandlung
 
Hast du vielleicht zufällig eine Unit in den uses mit eingebunden, die eine alternative Funktion RenameFile() enthält und fehlerhafterweise auch ein true zurückgibt, wenn es fehlschlägt?
Ist zwar recht unwahrscheinlich, aber man weiss ja nie...

Probier den Aufruf doch mal mit SysUtils.RenameFile() oder check den Aufruf über CodeInsight.

Edit:

Zitat:

Du kannst auch mal versuchen, dass Projekt neu erzeugen zu lassen. Das hat bei mir ab und zu die merkwürdigsten Fehler beseitigt, die man sich nicht erklären konnte.
Bei mir wirkt auch manchmal "Projekt -> Unit-Puffer löschen" Wunder...

p80286 28. Mai 2010 16:32

Re: RenameFile: Fehlerbehandlung
 
Schreibschutz schützt vor RenameFile nicht!
zumindestens unter XP und D7!

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:54 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