Es ist einfach nicht sinnvoll, dort GetLastError
anzurufen. Sie mischen zwei verschiedene Fehlerbehandlungsmodelle.
Rufen Sie GetLastError
sofort nach einem API-Aufruf fehl, wenn die Dokumentation dazu sagt. Wenn Sie es aufrufen, könnte eine andere Funktion SetLastError
aufgerufen haben und den Wert zurücksetzen.
Es ist also falsch, GetLastError
aufzurufen, da Sie keine Win32-Funktionen verwenden und den Anruf zu GetLastError
entfernen sollten. Der Code sollte sein:
procedure TForm1.Button1Click(Sender: TObject);
var
Stream: TStream;
begin
Stream := TFileStream.Create('d:\toto.docx', fmOpenRead);
try
// ....
finally
Stream.Free;
end;
end;
Wenn ein Fehler auftritt, wird eine Ausnahme ausgelöst werden, die von den obersten Ebene Exception-Handler gemeldet werden.
Laufzeitpakete sollten keinen Einfluss darauf haben, wie dieser Code ausgeführt wird.
Mögliche Ursachen für einen Fehler sind, dass die Datei nicht existiert oder dass sie gesperrt ist.
Sie schrieb:
if Assigned(Stream) then
Stream.Free;
, die immer sinnlos ist, da die Free
Verfahren prüft auch, ob die Objektreferenz nil
zu sein. In der Tat ist der Code entspricht:
if Assigned(Stream) then
if Assigned(Stream) then
Stream.Destroy;
So ist es sauberer auf Test verlassen innen Free
und einfach schreiben:
Stream.Free;
In den Kommentaren erklären Sie, dass Sie tatsächlich testen möchten ob die Datei gesperrt ist oder nicht Verwenden Sie keinen Dateistream dafür. Stattdessen gehen Sie wie folgt vor:
- Anruf
CreateFile
die Datei zu öffnen.
- Überprüfen Sie das zurückgegebene Handle gegen
INVALID_HANDLE_VALUE
, um Fehler zu erkennen.
- Verwenden Sie im Fehlerfall
GetLastError
, um die Fehlerursache herauszufinden.
- Andernfalls den Griff mit
CloseHandle
schließen.
Dies ist jedoch nicht zu empfehlen. Sie können diesen Ansatz verwenden, um festzustellen, dass die Datei nicht gesperrt ist, aber zu dem Zeitpunkt, zu dem Sie versuchen, sie zu lesen, wurde sie gesperrt. Es gibt eine inhärente Wettlaufbedingung.
Als eine allgemeine Richtlinie ist es besser, Vergebung als Erlaubnis zu bitten.
Ok, aber ich schreibe diesen Code, um ein gesperrtes Dokument zu erkennen. Der getLastError ohne das Runtime-Paket hatte den Code 32. Was ist der beste Weg, um zu erkennen, dass die Datei gesperrt ist? – Joc02
Siehe meine letzte Änderung –