Es ist kaum zu glauben, dass eine Funktion zur Prüfung zur Existenz eines Pfades oder einer Datei nicht zum Grundsortiment der API- bzw. Shell-API-Funktionen gehört. Immerhin findet sich eine dementsprechende Funktion PathFileExists im "Shell Lightweight Utility API", das mit der seit Windows 98 bzw. dem Internet Explorer 4 hinzugekommenen Version 4.71 der Shlwapi.DLL zur Verfügung steht. Leider weiß sie nichts mit UNC-Pfaden nach dem Muster "\\Server\Pfad..." anzufangen. Weiterhin gibt es mehrere Workarounds, die auf Zweckentfremdung "indirekter Wahrnehmung" von Dateien, Ordnern, Laufwerken und auch Computern beruhen - etwa wie in "Sein oder nicht sein" und "Sein oder nicht sein(2)" gezeigt. Dennoch - die gesuchte Funktion gibt es tatsächlich in der Shell32.DLL. Sie ist allerdings undokumentiert und namentlich gar nicht existent, sondern nur über ihre Ordinal-Nummer erreichbar:
Private Declare Function SHPathFileExists Lib "shell32" _
Alias "#45" (ByVal szPath As String) As Long
Unter Windows 9x funktioniert sie problemlos und auf Anhieb und bestätigt die Existenz bzw. Nichtexistenz von Dateien, Ordnern, Laufwerken und Computern im Netzwerk. Unter Windows NT und Nachfolgern (2000, XP) scheint die Funktion jedoch zu streiken. Vielleicht haben Sie auch schon das bei API-Funktionen, die String-Parameter verarbeiten, oft gesehene Pendant zur Übergabe von ANSI-Strings mit dem Anhängsel "...A" vermisst. Ein Alias "#45A" dürfte jedoch wenig Sinn haben. Der Gedanke liegt nahe, dass unter einem NT-Windows ein Unicode-String übergeben werden muss, was sich mittels der VB-Funktion StrConv leicht erreichen lässt.
Existiert = SHPathFileExists(StrConv(Pfad, vbUnicode))
Doch diese Aufrufweise verhindert wiederum ein Resultat unter Windows 9x. Es bleibt also nur die Verzweigung zu zwei separaten Aufrufen. Ob sie es mit einem NT-Windows zu tun haben, können Sie anhand der Umgebungsvariablen "OS" entscheiden (siehe "Windows-Version - ganz einfach"). Fehlt sie, handelt es sich um ein Windows 9x. Ist sie vorhanden, so ist ihr Inhalt in diesem Zusammenhang bedeutungslos.
Schließlich bleibt nur noch anzumerken, dass es der Funktion nichts ausmacht, wenn die zu prüfende Pfadangabe mit Leerzeichen endet - sie werden im Gegensatz zu führenden Leerzeichen völlig ignoriert. Und damit hätten wir eine einfache Prüffunktion, die auf der gesuchten API-Funktion aufsetzt:
Public Function PathFileExists(sPath As String) As Boolean
If Len(Environ$("OS")) Then
PathFileExists = _
CBool(SHPathFileExists(StrConv(LTrim$(sPath), vbUnicode)))
Else
PathFileExists = CBool(SHPathFileExists(LTrim$(sPath)))
End If
End Function
|