AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Fehleranfääliges DirectoryExists auch in Delphi > XE 1?
Thema durchsuchen
Ansicht
Themen-Optionen

Fehleranfääliges DirectoryExists auch in Delphi > XE 1?

Ein Thema von CCRDude · begonnen am 14. Nov 2014 · letzter Beitrag vom 17. Nov 2014
Antwort Antwort
Seite 1 von 3  1 23      
CCRDude

Registriert seit: 9. Jun 2011
678 Beiträge
 
FreePascal / Lazarus
 
#1

Fehleranfääliges DirectoryExists auch in Delphi > XE 1?

  Alt 14. Nov 2014, 13:26
Delphi-Version: XE
Unter Delphi XE finde ich in der SysUtils.pas:

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;
    Result := (LastError <> ERROR_FILE_NOT_FOUND) and
      (LastError <> ERROR_PATH_NOT_FOUND) and
      (LastError <> ERROR_INVALID_NAME);
  end;
end;
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.

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.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Fehleranfääliges DirectoryExists auch in Delphi > XE 1?

  Alt 14. Nov 2014, 13:56
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
Windows Vista - Eine neue Erfahrung in Fehlern.
  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
 
#3

AW: Fehleranfääliges DirectoryExists auch in Delphi > XE 1?

  Alt 14. Nov 2014, 14:57
Mal anders gefragt:

In welchen Situationen kann es dazu kommen, dass GetFileAttributes(PChar(Directory)) = INVALID_FILE_ATTRIBUTES und es trotzdem um ein existierendes Verzeichnis handelt?

Ich hätte jetzt mal pauschal vermutet: keine.

Also könnte der Code wie folgt 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
    Result := False;
{
    LastError := GetLastError;
    Result := (LastError <> ERROR_FILE_NOT_FOUND) and
      (LastError <> ERROR_PATH_NOT_FOUND) and
      (LastError <> ERROR_INVALID_NAME);
}

  end;
end;
ansonsten sollten die den Rückgabewert ändern auf TDirectoryExistsResult = ( True, False, KnownByVulture );
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)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#4

AW: Fehleranfääliges DirectoryExists auch in Delphi > XE 1?

  Alt 14. Nov 2014, 15:14
Mal anders gefragt:

In welchen Situationen kann es dazu kommen, dass GetFileAttributes(PChar(Directory)) = INVALID_FILE_ATTRIBUTES und es trotzdem um ein existierendes Verzeichnis handelt?

Ich hätte jetzt mal pauschal vermutet: keine.
Nicht ganz:

Zitat:
If you call GetFileAttributes for a network share, the function fails, and GetLastError returns ERROR_BAD_NETPATH. You must specify a path to a subfolder on that share.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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
 
#5

AW: Fehleranfääliges DirectoryExists auch in Delphi > XE 1?

  Alt 14. Nov 2014, 15:43
Mal anders gefragt:

In welchen Situationen kann es dazu kommen, dass GetFileAttributes(PChar(Directory)) = INVALID_FILE_ATTRIBUTES und es trotzdem um ein existierendes Verzeichnis handelt?

Ich hätte jetzt mal pauschal vermutet: keine.
Nicht ganz:

Zitat:
If you call GetFileAttributes for a network share, the function fails, and GetLastError returns ERROR_BAD_NETPATH. You must specify a path to a subfolder on that share.
Soso, und wenn dieser Fehler da ist, dann ist es trotzdem ein existierendes Verzeichnis und der Rückgabewert muss true sein?

Kann ich nicht so wirklich glauben, denn
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
Aha, also ergibt das auch false ...

Also bei welcher Gelegenheit muss DirectoryExists ein true zurückliefern trotz dass wir bei GetFileAttributes(PChar(Directory)) aks Rückgabe ein INVALID_FILE_ATTRIBUTES bekommen?
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)
  Mit Zitat antworten Zitat
pelzig
(Gast)

n/a Beiträge
 
#6

AW: Fehleranfääliges DirectoryExists auch in Delphi > XE 1?

  Alt 14. Nov 2014, 16:18
Mal ganz extrem dumm gefragt:

Wat gibbes rück?

Ist das letzte Zeichen des Rückgabewertes etwa ein Backslash?

MfG
  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
 
#7

AW: Fehleranfääliges DirectoryExists auch in Delphi > XE 1?

  Alt 14. Nov 2014, 16:27
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;
System Error Codes (0-499)

Bei einem ERROR_TOO_MANY_OPEN_FILES 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.
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 (14. Nov 2014 um 16:31 Uhr)
  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
 
#8

AW: Fehleranfääliges DirectoryExists auch in Delphi > XE 1?

  Alt 14. Nov 2014, 16:30
Mal ganz extrem dumm gefragt:

Wat gibbes rück?

Ist das letzte Zeichen des Rückgabewertes etwa ein Backslash?

MfG
Ja mit einer hübschen Schleife drumherum

Rückgabewert von DirectoryExists BOOLEAN
Rückgabewert von GetFileAttributes Cardinal
Rückgabewert von GetLastError Cardinal

Da ist nicht viel Raum für ein Backslash
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)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#9

AW: Fehleranfääliges DirectoryExists auch in Delphi > XE 1?

  Alt 14. Nov 2014, 16:32
Soso, und wenn dieser Fehler da ist, dann ist es trotzdem ein existierendes Verzeichnis und der Rückgabewert muss true sein?
Ich meine schon. Schließlich existiert ja die Root des Share. Ob ich da reinschreiben kann ist wieder eine andere Frage.

Kann ich nicht so wirklich glauben, denn
...
Aha, also ergibt das auch false
Ich habe ja nicht behauptet, daß die Implementation korrekt ist

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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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
 
#10

AW: Fehleranfääliges DirectoryExists auch in Delphi > XE 1?

  Alt 14. Nov 2014, 16:36
Hier mal die Rückgabewerte und den entsprechenden LastError
DirectoryResultLastError
\\FalseERROR_INVALID_NAME
\\serverFalseERROR_BAD_PATHNAME
\\server\FalseERROR_BAD_PATHNAME
\\server\notexistingFalseERROR_BAD_PATHNAME
\\server\existingTrue 
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)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 07:45 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