![]() |
Delphi-Version: XE
Fehleranfääliges DirectoryExists auch in Delphi > XE 1?
Unter Delphi XE finde ich in der SysUtils.pas:
Delphi-Quellcode:
Leider ist das fehleranfällig - es gibt Situationen, in denen GetLastError bei nicht existierenden Pfaden ungleich einer der drei Fehlermeldungen ist und damit die Existenz eines nicht existierenden Verzeichnisses angenommen wird. So erlebt unter Windows PE (Vista, Win7, Win 8 AIK/ADK-Versionen), allerdings nicht generell. Welcher Fehler dort gemeldet wird, habe ich noch nicht rausgefunden, da er nur bei Kunden auftritt, und ich ihn meist schon umschifft habe, indem ich Verzeichnisse mit FindFirst suche.
function DirectoryExists(const Directory: string; FollowLink: Boolean = True): Boolean;
var Code: Cardinal; Handle: THandle; LastError: Cardinal; begin Result := False; Code := GetFileAttributes(PChar(Directory)); if Code <> INVALID_FILE_ATTRIBUTES then begin [...] end else begin LastError := GetLastError; Result := (LastError <> ERROR_FILE_NOT_FOUND) and (LastError <> ERROR_PATH_NOT_FOUND) and (LastError <> ERROR_INVALID_NAME); end; end; Generell ist es natürlich fehleranfällig, Erfolg anzunehmen, nur weil drei bestimmte Fehler nicht aufgetreten sind. Daher meine Frage: ist dies in neueren Delphi-Versionen besser gelöst, kann da jemand mal in die SysUtils.pas / System.SysUtils.pas schauen bitte? Kann das selber nicht nachschauen, die Trial hat scheinbar keine Sourcen dabei. |
AW: Fehleranfääliges DirectoryExists auch in Delphi > XE 1?
In XE wird gegen folgende Fehlercodes geprüft:
ERROR_FILE_NOT_FOUND ERROR_PATH_NOT_FOUND ERROR_BAD_PATHNAME ERROR_INVALID_NAME ERROR_BAD_NETPATH ERROR_NOT_READY ERROR_BAD_NET_NAME |
AW: Fehleranfääliges DirectoryExists auch in Delphi > XE 1?
Mal anders gefragt:
In welchen Situationen kann es dazu kommen, dass
Delphi-Quellcode:
und es trotzdem um ein existierendes Verzeichnis handelt?
GetFileAttributes(PChar(Directory)) = INVALID_FILE_ATTRIBUTES
Ich hätte jetzt mal pauschal vermutet: keine. Also könnte der Code wie folgt lauten
Delphi-Quellcode:
ansonsten sollten die den Rückgabewert ändern auf
function DirectoryExists(const Directory: string; FollowLink: Boolean = True): Boolean;
var Code: Cardinal; Handle: THandle; LastError: Cardinal; begin Result := False; Code := GetFileAttributes(PChar(Directory)); if Code <> INVALID_FILE_ATTRIBUTES then begin [...] end else begin Result := False; { LastError := GetLastError; Result := (LastError <> ERROR_FILE_NOT_FOUND) and (LastError <> ERROR_PATH_NOT_FOUND) and (LastError <> ERROR_INVALID_NAME); } end; end;
Delphi-Quellcode:
:mrgreen:
TDirectoryExistsResult = ( True, False, KnownByVulture );
|
AW: Fehleranfääliges DirectoryExists auch in Delphi > XE 1?
Zitat:
Zitat:
|
AW: Fehleranfääliges DirectoryExists auch in Delphi > XE 1?
Zitat:
Delphi-Quellcode:
sein?
true
Kann ich nicht so wirklich glauben, denn Zitat:
Delphi-Quellcode:
...
false
Also bei welcher Gelegenheit muss
Delphi-Quellcode:
ein
DirectoryExists
Delphi-Quellcode:
zurückliefern trotz dass wir bei
true
Delphi-Quellcode:
aks Rückgabe ein
GetFileAttributes(PChar(Directory))
Delphi-Quellcode:
bekommen?
INVALID_FILE_ATTRIBUTES
|
AW: Fehleranfääliges DirectoryExists auch in Delphi > XE 1?
Mal ganz extrem dumm gefragt:
Wat gibbes rück? Ist das letzte Zeichen des Rückgabewertes etwa ein Backslash? MfG |
AW: Fehleranfääliges DirectoryExists auch in Delphi > XE 1?
Ok, die wirklich korrekte Umsetzung der Funktion müsste so lauten:
Delphi-Quellcode:
function DirectoryExists(const Directory: string; FollowLink: Boolean = True): Boolean;
var Code: Cardinal; Handle: THandle; LastError: Cardinal; begin Result := False; Code := GetFileAttributes(PChar(Directory)); if Code <> INVALID_FILE_ATTRIBUTES then begin [...] end else begin LastError := GetLastError; if (LastError <> ERROR_FILE_NOT_FOUND) and (LastError <> ERROR_PATH_NOT_FOUND) and (LastError <> ERROR_BAD_PATHNAME) and (LastError <> ERROR_INVALID_NAME) and (LastError <> ERROR_BAD_NETPATH) and (LastError <> ERROR_BAD_NET_NAME) then // Wir können keine Aussage darüber treffen, daher RaiseLastOSError( LastError ); end; end; ![]() Bei einem
Delphi-Quellcode:
kann man einfach keine Aussage darüber treffen, ob das Verzeichnis existiert oder nicht. Also entweder einen TriState (Ja, Nein, WeissDerGeier) zurückliefern oder eine Exception werfen.
ERROR_TOO_MANY_OPEN_FILES
|
AW: Fehleranfääliges DirectoryExists auch in Delphi > XE 1?
Zitat:
Rückgabewert von
Delphi-Quellcode:
BOOLEAN
DirectoryExists
Rückgabewert von
Delphi-Quellcode:
Cardinal
GetFileAttributes
Rückgabewert von
Delphi-Quellcode:
Cardinal
GetLastError
Da ist nicht viel Raum für ein Backslash |
AW: Fehleranfääliges DirectoryExists auch in Delphi > XE 1?
Zitat:
Zitat:
Sinnigerweise verhält sich Windows (zumindest 8.1) in diesem Punkt gar nicht nach der Dokumentation. Auch mit einem Network-Share kommt kein INVALID_FILE_ATTRIBUTES zurück, so daß dieses Argument wohl nicht zieht. Aber vom Prinzip hat der OT schon Recht: es ist einfach ungeschickt, auf die möglichen Fehler abzuprüfen, anstatt auf die möglichen Ausnahmen von den Fehlern. Die Exception bei einem unerwarteten Rückgabewert gehört natürlich auch zum guten Standard. |
AW: Fehleranfääliges DirectoryExists auch in Delphi > XE 1?
Hier mal die Rückgabewerte und den entsprechenden LastError
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:04 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