RSS
StartseiteKnowledge LibraryTop 10Impressum

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