- Offizieller Beitrag
Ich weiß nicht, wie es euch geht, aber ich finde einen Zugriff auf Elemente über Namen recht angenehm.
Mit der aktuellen AutoIt-Version können wir ja Inhalte von Strukturen mit Punktnotation der Feldnamen abfragen.
Somit habe ich mal eine Pfadfunktion erstellt, die einen Pfad splittet und Zugriff auf die einzelnen Elemente per Namen erlaubt. Dabei wird der Pfad auch noch in Normalform gewandelt (einheitlich Backslash, relative Adressen werden in absolute Adressen gewandelt). Es können Laufwerksbasierte absolute Pfade, relative Pfade oder UNC-Pfade angegeben werden.
_Path
$path = _Path(@ScriptFullPath)
ConsoleWrite('kpl. Pfad ' & $path.FullPath & @CRLF)
ConsoleWrite('Laufwerk ' & $path.Drive & @CRLF)
ConsoleWrite('Ordner ' & $path.Dir & @CRLF)
ConsoleWrite('Dateiname ' & $path.File & @CRLF)
ConsoleWrite('Name Erweiterung ' & $path.Ext & @CRLF)
ConsoleWrite('Datei mit Erweiterung ' & $path.FileExt & @CRLF)
; oder direkt nur ein Parameter:
ConsoleWrite('Dateiname ' & _Path(@ScriptFullPath).File & @CRLF)
;===============================================================================
; Function Name....: _Path
; Description......: Splittet eine Pfadangabe in einzelne Bestandteile
; Parameter(s).....: $sPath Pfadangabe, Lw-basiert oder UNC, absolut oder relativ - alles möglich
; .................: Pfad kann Laufwerk od. Laufwerk mit Ordner od. Lw/Ordner/Datei.suffix sein
; .................: Pfad wird nicht auf Existenz geprüft
; Return Value(s)..: Struktur mit den Feldern:
; .................: .FullPath Der kpl. Pfad in Normalform
; .................: .Drive Das Laufwerk (ohne Backslash), bei UNC-Pfad der Hostname
; .................: .Dir Das Verzeichnis (ohne endenden Backslash)
; .................: .File Der Dateiname
; .................: .Ext Der Name der Erweiterung
; .................: .FileExt Dateiname.Erweiterung
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _Path($sPath) ; relative Adressierung ('\' od. '/', '.', '..') möglich
Local $sDrive, $sDirFile, $sDir, $sFile, $sExt, $sFileExt, $sTmp
$sPath = DllCall('kernel32.dll', 'dword', 'GetFullPathNameW', 'wstr', $sPath, 'dword', 4096, 'wstr', '', 'ptr', 0)[3]
Select
Case StringLeft($sPath, 2) = '\\'
$sDrive = StringLeft($sPath, StringInStr($sPath, '\', 0, 3))
Case StringRegExp($sPath, '^[a-zA-Z]:')
$sDrive = StringLeft($sPath, 3)
EndSelect
$sDirFile = StringTrimLeft($sPath, StringLen($sDrive))
$sDir = StringLeft($sDirFile, StringInStr($sDirFile, '\', 0, -1))
$sTmp = StringTrimLeft($sDirFile, StringLen($sDir))
$sFileExt = StringInStr($sTmp, '.') ? $sTmp : ''
If $sFileExt = '' Then $sDir = $sDirFile
$sFile = ($sFileExt <> '') ? StringLeft($sFileExt, StringInStr($sFileExt, '.', 0, -1) -1) : ''
$sExt = ($sFileExt <> '') ? StringTrimLeft($sFileExt, StringLen($sFile) +1) : ''
Local $tPath, $tagPath = 'struct;' & _
'char FullPath[' & StringLen($sPath) & '];' & _
'char Drive[' & StringLen($sDrive) & '];' & _
'char Dir[' & ((StringLen($sDir) > 0) ? StringLen($sDir) : 1) & '];' & _
'char File[' & ((StringLen($sFile) > 0) ? StringLen($sFile) : 1) & '];' & _
'char Ext[' & ((StringLen($sExt) > 0) ? StringLen($sExt) : 1) & '];' & _
'char FileExt[' & ((StringLen($sExt) > 0) ? (StringLen($sFile)+StringLen($sExt)+1) : 1) & '];' & _
'endstruct'
$tPath = DllStructCreate($tagPath)
DllStructSetData($tPath, 1, StringRegExpReplace($sPath, '\\$', ''))
DllStructSetData($tPath, 2, StringRegExpReplace($sDrive, '\\$', ''))
DllStructSetData($tPath, 3, StringRegExpReplace($sDir, '\\$', ''))
DllStructSetData($tPath, 4, $sFile)
DllStructSetData($tPath, 5, $sExt)
DllStructSetData($tPath, 6, $sFileExt)
Return $tPath
EndFunc ;==>_Path
Alles anzeigen
Edit:
Eine kleine Rolle rückwärts. FileGetLongName kann ausschliesslich relative Pfade auflösen. Bei der Darstellung von UNC-Pfaden (z.B. //host/share/folder/file.ext) gehts in die Hose.
Also es bleibt dabei, _WinAPI_GetFullPathName ist notwendig. Kann man aber auch ohne Include durch direkten Aufruf der Dll abfragen.