|
Auch wenn sich die verkürzten Formen kurzer Pfad- und Dateinamen im 8+3-Format mit ihrem typischen Erscheinungsbild ("C:\Progra~1") seit dem Erscheinen von Windows XP eigentlich erledigt haben sollten, werden Ihnen Namen in diesem Format natürlich noch auf unbestimmte Zeit hin begegnen. Ihre Anwendungen sollten daher in der Lage sein, mit solcherart verkürzten Namen umgehen zu können.
Die Ermittlung eines kurzen Dateipfades aus einem gegebenen langen Dateipfad ist einfach. Die API-Funktion GetShortPathName liefert ihn ohne größeren Aufwand. Es sind lediglich die "üblichen" C-typischen Gegebenheiten des Funktionsaufrufs zu berücksichtigen, die die folgende Funktion ShortPath für Sie kapselt:
Private Declare Function GetShortPathName Lib "kernel32" _
Alias "GetShortPathNameA" (ByVal LongPath As String, _
ByVal ShortPath As String, ByVal BufferSize As Long) As Long
Public Function ShortPath(Path As String) As String
Dim nSize As Long
ShortPath = Space$(256)
nSize = GetShortPathName(Path, ShortPath, 255)
ShortPath = Left$(ShortPath, nSize)
End Function
Für die Umkehrung gibt es eine solche direkte und daher einfach handzuhabende API-Unterstützung erst ab Windows 98 und Windows 2000 mit der API-Funktion GetLongPathName. Ihr Aufruf erfolgt nach dem gleichen Schema - die Verpackung in die Funktion LongPath sieht daher nahezu identisch aus.
Private Declare Function GetLongPathName Lib "kernel32" _
Alias "GetShortPathNameA" (ByVal ShortPath As String, _
ByVal LongPath As String, ByVal BufferSize As Long) As Long
Public Function LongPath(Path As String) As String
Dim nSize As Long
LongPath = Space$(256)
nSize = GetLongPathName(Path, LongPath, 255)
LongPath = Left$(LongPath, nSize)
End Function
Eines ist allerdings zu beachten: Während die API-Funktion GetShortPathName keine Schwierigkeiten mit Netzwerkpfaden (UNC-Pfade wie "\\Computername\Pfad\...") zu haben scheint und zu solchen Pfaden anstandslos gegebenenfalls die Kurzform liefert, gibt GetLongPathName den übergebenen Pfad unverändert zurück und wandelt darin enthaltene Kurzformbestandteile nicht in ihre lange Form um.
Wenn Sie für Ihre Anwendungen auch Windows 95 und Windows NT als Plattformen zulassen wollen, brauchen Sie einen Ersatz für GetLongPathName. Die (MSDN-)Dokumentation zu GetShortPathName schlägt vor, für jeden einzelnen Bestandteil (Ordner und schließlich Datei) des gesamten Pfades die API-Funktion FindFirstFile aufzurufen, um so den langen Namen für eben diesen jeweiligen Bestandteil zu erhalten. Der gesamte Pfad in Langform muss anschließend aus den einzeln umgesetzten Bestandteilen wieder zusammengesetzt werden. Da die VB-Funktion Dir$ genau das gleiche leistet (einschließlich der Weigerung, UNC-Pfade zu verarbeiten), können Sie bequem in "reinem" VB-Code verbleiben und die Dir$-Funktion verwenden. Die folgende Funktion LongPath2 erledigt für Sie das Umsetzen der einzelnen Bestandteile und das anschließende Zusammenfügen des gesamten Pfades. Wird ein UNC-Pfad übergeben, bleibt der übergebene Pfad unverändert.
Public Function LongPath2(ByVal Path As String) As String
Dim nParts() As String
Dim i As Integer
Dim nLongPath As String
Dim nPath As String
Dim nTestPath As String
If Left$(Path, 2) = "\\" Then
LongPath2 = Path
Else
nParts = Split(Path, "\")
If UBound(nParts) > 0 Then
If Len(nParts(1)) Then
nLongPath = nParts(0)
nTestPath = nLongPath
For i = 1 To UBound(nParts)
nTestPath = nTestPath & "\" & nParts(i)
nPath = Dir$(nTestPath, vbDirectory Or vbHidden _
Or vbReadOnly Or vbSystem)
If Len(nPath) Then
nLongPath = nLongPath & "\" & nPath
Else
Exit Function
End If
Next 'i
LongPath2 = nLongPath
Else
LongPath2 = Path
End If
End If
End If
End Function
|