UNC Verzeichniswechsel
UNC Pfade als aktuelles Verzeichnis festlegen
Haben Sie schon mal versucht einen UNC Pfad über die ChDir Anweisung als aktuelles Verzeichnis festzulegen? Wenn ja, wird Ihnen aufgefallen sein, dass dies wenig erfolgreich ist...
Haben Sie schon mal versucht einen UNC Pfad in der Form \\Rechner\Freigabe
über die
ChDir-Anweisung als aktuelles Verzeichnis festzulegen? Wenn ja, wird Ihnen aufgefallen sein, dass sich die
CurDir$-Funktion von dieser Maßnahme ziemlich unbeeindruckt zeigt und weiterhin das vorherige
Standardverzeichnis zurückgibt bzw. das Standardverzeichnis des aktuellen Laufwerks.
Die ChDir-Anweisung arbeitet in diesem Fall völlig korrekt und führt auch einen Verzeichniswechsel durch, eine nicht vorhandene oder nicht verfügbare Freigabe wird entsprechend mit einem Fehler quittiert. Der Teufel steckt in der ChDrive-Anweisung, denn mit dieser muss man zusätzlich das aktuelle Laufwerk festlegen, bevor die CurDir$-Funktion das Standardverzeichnis dieses Laufwerks zurückgibt. Nur dumm, dass es bei UNC Pfaden keine Laufwerke gibt und folgerichtig verweigert die ChDrive-Anweisung die Arbeit, versucht man hier einen UNC Pfad anzugeben.
Die Lösung des Problems findet man, wie so oft, im Windows API. Denn nutzt man direkt die API Funktion SetCurrentDirectory, die auch der Kombination ChDrive und ChDir zugrunde liegt, kann man ohne Probleme UNC Pfade als aktuelles Verzeichnis festlegen und diese auch über die CurDir$-Funktion abfragen.
In der kapselnden Prozedur ChangeDir wird der Erfolg der Funktion ausgewertet und bei Bedarf ein Fehler ausgelöst, der mir On Error ... abgefangen werden kann. Hier kommt die Funktion ErrorDescription zum Einsatz, die den Grund für das Scheitern der Funktion in Klartext wiedergibt:
Private Declare Function SetCurrentDirectory Lib "kernel32" Alias _ "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long Public Sub ChangeDir(ByVal Path As String) If Not CBool(SetCurrentDirectory(Path)) Then Err.Raise Err.LastDllError, _ App.Title & ".ChangeDir", _ ErrorDescription(Err.LastDllError) End If End Sub
Download
- Modul modChangeDir (modchangedir.zip - 1 KB)