Prüfen ob Datei existiert?


  • Mod

    Jochen Kalmbach schrieb:

    Gästchen schrieb:

    PathFileExists

    Lt. meiner Doku testest dies *nur* den Pfad und nicht die Datei, oder?

    Nein! Das ist irreführend in der Doku. Es wird wirklich das Objekt geprüft auf den dieser Pfad zeigt. Es wird dabei aber nicht zwischen Pfad oder Datei unterschieden.

    BTW: Wenn Du das Sample Dir ansiehst ist es klar.
    http://msdn.microsoft.com/en-us/library/bb773584(VS.85).aspx
    Denn der Pfad in diesem Beispiel existiert offensichtlich für die erste Datei... 😉



  • Martin Richter schrieb:

    Nein! Das ist irreführend in der Doku.

    Hast Du schon ein Doku-Bug ausgefüllt!?


  • Mod

    Jochen Kalmbach schrieb:

    Martin Richter schrieb:

    Nein! Das ist irreführend in der Doku.

    Hast Du schon ein Doku-Bug ausgefüllt!?

    Nope!



  • Ich verstehe nicht so ganz, was hier irreführend ist:

    MSDN schrieb:

    Determines whether a path to a file system object such as a file or directory is valid.

    Von welchem Doku-Bug redet Ihr?



  • Gästchen schrieb:

    MSDN schrieb:

    Determines whether a path ... is valid.

    Von welchem Doku-Bug redet Ihr?

    Von dem fetten....

    Es wird sozusagen nru gepfürft, ob der Pfad zur Datei/Dir gültig ist... nicht aber ob die Datei selber gültig ist!

    So lese es zumindest ich...


  • Mod

    Sagen wir es mal so:
    PathFileExists gibt !=0 zurück wenn es ein Objekt mit dem Pfad pszPath gibt. Egal ob Datei oder Pfad.

    Beispiel:
    - Ein Pfad mit dem Namen C:\TEST existiert
    - sowie eine Datei mit dem Namen C:\TEST\Test.txt
    - Aber die Datei C:\TEST\Nixda.txt existiert nicht

    Dann gilt:

    ASSERT(::PathFileExists(_T("C:\\Test"));
    ASSERT(::PathFileExists(_T("C:\\Test\\Test.txt"));
    ASSERT(!::PathFileExists(_T("C:\\Test\\Nixda.txt"));
    

    Das der Teilpfad C:\Test existiert ist für PathFileExists uninteressant.



  • Nur zur Info: Intern wird nichts anderes als "GetFileAttributes" aufgerufen!
    Somit würde ich lieber direkt diese Funktion aufrufen!
    😉


  • Mod

    Jochen Kalmbach schrieb:

    Nur zur Info: Intern wird nichts anderes als "GetFileAttributes" aufgerufen!
    Somit würde ich lieber direkt diese Funktion aufrufen!
    😉

    Und warum? Ich nutze gerade diese light weight API sehr gerner.
    Ich hatte niemals Probleme mit dem Namen der Funktion 😉
    Ich meinen Augen ist das

    ASSERT(PathFileExists(pszFilename));
    

    sprechender als

    ASSERT(GetFileAttributes(pszFilename)!=INVALID_FILE_ATTRIBUTES);
    


  • Martin Richter schrieb:

    Und warum?

    Weil es eben nicht unterscheidet, ob es sich dabei um ein Verzeichnis oder eine Datei handelt. Was i.d.R. nicht ganz unerheblich ist... aber das hängt natürlich vom Anwendungsfall ab.


  • Mod

    Habe ich was nicht mitbekommen 😕 Laut GetFileAttributes Doku:

    If the function succeeds, the return value contains the attributes of the specified file or directory.

    Aber es gibt doch noch andere schöne Funktionen:

    PathIsDirctory
    PathIsExe
    PathIsRoot
    PathIsNetworkPath
    


  • Martin Richter schrieb:

    Habe ich was nicht mitbekommen 😕 Laut GetFileAttributes Doku:

    If the function succeeds, the return value contains the attributes of the specified file or directory.

    Aber es gibt doch noch andere schöne Funktionen:

    PathIsDirctory
    PathIsExe
    PathIsRoot
    PathIsNetworkPath
    

    richtig. und es gibt auch noch

    fopen
    

    😮



  • Schonmal überlegt ob so eine Abfrage überhaupt Sinn macht?



  • richtig schrieb:

    richtig. und es gibt auch noch

    fopen
    

    😮

    Dies ist aber ganz schlecht, da dadurch die Datei selbst verändert wird!

    Ein "GetFileAttributes" verändert erstens die Datei nicht und zweitesy ist es doppelt so schnell als ein "PathFileExists" + "!PathIsDirctory"!



  • flasch schrieb:

    Schonmal überlegt ob so eine Abfrage überhaupt Sinn macht?

    welche so eine, wa.
    bevor man ne datei überschreibselt, könnte sich eine abfrage lohnen, wa.



  • Jochen Kalmbach schrieb:

    richtig schrieb:

    richtig. und es gibt auch noch

    fopen
    

    😮

    Dies ist aber ganz schlecht, da dadurch die Datei selbst verändert wird!

    Verändert?! 😕



  • klatsch schrieb:

    flasch schrieb:

    Schonmal überlegt ob so eine Abfrage überhaupt Sinn macht?

    bevor man ne datei überschreibselt, könnte sich eine abfrage lohnen, wa.

    nö, wa



  • umpf! schrieb:

    Verändert?! 😕

    Ja, die "Access-Time" wird geändert.

    Das wird sie z.B. bei einem "dir" bzw. GetFileAttributes/FindFirstFile nicht... (oder täusche ich mich da?)



  • Jochen Kalmbach schrieb:

    umpf! schrieb:

    Verändert?! 😕

    Ja, die "Access-Time" wird geändert.

    Das wird sie z.B. bei einem "dir" bzw. GetFileAttributes/FindFirstFile nicht... (oder täusche ich mich da?)

    Also ein einfaches Öffnen (CreateFile) bzw. Lesen (ReadFile) ändert den Zeitstempel für den letzten Zugriff nicht.



  • Du musst ein wenig warten, bis sich diese Änderungen zeigen 😉 NTFS hat hier ein "gewissen" Delay! Starte mal den Rechner neu, dann siehst Du die Änderung.

    PS: Das wäre ja fürchterlich, wenn sich ein Öffnen nicht auswirken würde. Dann wäre ja der Zeitstempel total sinnlos.



  • Jochen Kalmbach schrieb:

    Gästchen schrieb:

    MSDN schrieb:

    Determines whether a path ... is valid.

    Von welchem Doku-Bug redet Ihr?

    Von dem fetten....

    Die Erklärung, was mit "path to a file system object" gemeint ist, folgt dem doch (a file or a directory). Man muss die Erklärung nur Lesen und nicht mitten im Satz aufhören. 😉


Anmelden zum Antworten