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 2  1 2      
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

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

  Alt 14. Nov 2014, 13: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
Online

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

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

  Alt 14. Nov 2014, 14: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
 
#3

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

  Alt 14. Nov 2014, 14: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
 
#4

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

  Alt 14. Nov 2014, 15: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
 
#5

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

  Alt 14. Nov 2014, 15: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 Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

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

  Alt 14. Nov 2014, 15: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
hathor
(Gast)

n/a Beiträge
 
#7

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

  Alt 14. Nov 2014, 15:44
An den TE:
Teste doch mal diesen Code aus XE2:
http://www.delphipraxis.net/1222644-post11.html
  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, 15: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 15:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

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

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

  Alt 14. Nov 2014, 15: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
jensw_2000
(Gast)

n/a Beiträge
 
#10

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

  Alt 14. Nov 2014, 22:05
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.
Genau hier liegt der Hase im Pfeffer.
Die "Root des Shares" ist der Server bzw. die "DFS Farm", da kann man nie was hinschreiben. Es ist kein Ordner.
Das Share ist die Bezeichnung hinter dem Servernamen.

Also:
\\Server\ <<--- hier schreibt keiner was hin.
FileExists und DirectoryExists müssen fehlschlagen. Es kann auch kein "\\Server\." oder "\\Server\.." geben.

\\Server\Share\ <<--- hier schon (DirectoryExists muss klappen, wenn die Berechtigungen vorhanden sind)
\\Server\Share\SubDirectory\ <<--- da auch (DirectoryExists muss klappen, wenn die Berechtigungen vorhanden sind)
\\Server\Share\File <<--- hier ebenfalls (FileExists muss klappen, wenn die Berechtigungen vorhanden sind)
\\Server\Share\SubDirectory\File <<--- genau wie dort (FileExists muss klappen, wenn die Berechtigungen vorhanden sind)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:00 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