Auf den ersten Blick scheint das Extrahieren der Dateierweiterung (Extension) einer Datei eine klare Aufgabe zu sein: Sie suchen den ersten Punkt ab dem Ende des Dateinamens und haben damit die Erweiterung, die hinter dem Punkt beginnt. Finden Sie keinen Punkt, hat die Datei auch keine Erweiterung.
Solange es sich um einen Dateinamen ohne Pfadteile handelt, funktioniert das auch sicher. Sobald Sie es jedoch mit einem ganzen Pfad zu tun haben, ist die beschriebene Vorgehensweise nicht mehr sicher. Denn falls einer der übergeordneten Pfadbestandteile selbst eine Erweiterung hat und die Datei am Ende bzw. der letzte Pfad keine, würden Sie so den gesamten Rest ab dem gefundenen letzten Punkt erhalten, bestehend aus der Erweiterung dieses Pfadbestandteils und aus allen nachfolgenden Pfadbestandteilen. Beispiel:
c:\abc.def\ghi\jkl
ergäbe:
def\ghi\jkl
Zu einem korrekten Ergebnis gelangen Sie, wenn Sie zunächst sowohl die Position des letzten Punktes als auch die des letzten Backslashs ermitteln. Dann prüfen Sie, falls überhaupt ein Punkt gefunden wurde, ob die Position des letzten Backslash kleiner als die des letzten Punktes ist - nur dann markiert der Punkt den Beginn der Dateierweiterung des letzten Pfadbestandteils.
Ab Visual Basic 6 können Sie zur Ermittlung der jeweils letzten Positionen die Funktion InStrRev verwenden:
Private Function GetFileExtension(Path As String) As String
Dim nPosDot As Long
nPosDot = InStrRev(Path, ".")
If nPosDot Then
If InStrRev(Path, "\") < nPosDot Then
GetFileExtension = Mid$(Path, nPosDot + 1)
End If
End If
End Function
In Visual Basic 5 und früheren Versionen steht die Funktion InStrRev noch nicht zur Verfügung - Sie müssen dafür eine eigene Implementierung mit einer schnellen Suche von vorne auf der Basis der InStr-Funktion verwenden:
Private Function GetFileExtension5(Path As String) As String
Dim i As Integer
Dim nPosDot As Integer
Dim nPosBS As Integer
Dim nStart As Integer
Do
nPosDot = InStr(nStart + 1, Path, ".")
If nPosDot Then
nStart = nPosDot
Else
nPosDot = nStart
Exit Do
End If
Loop
nStart = 0
Do
nPosBS = InStr(nStart + 1, Path, "\")
If nPosBS Then
nStart = nPosBS
Else
nPosBS = nStart
Exit Do
End If
Loop
If nPosDot Then
If nPosBS < nPosDot Then
GetFileExtension5 = Mid$(Path, nPosDot + 1)
End If
End If
End Function
|