Path UDF - Funktionen spezialisiert auf Pfad- und Dateiangaben (FINAL)

  • Ich habe zwar nur schnell drüber geschaut, aber diese zwei Funktionen sind mit Hilfe von RegExp 2 bis 3 mal schneller:

    [autoit]

    Func _GetFileExtension($sPath)
    Local $a = StringRegExp($sPath, '[^\*\?\<\>\|"]+\\[^\/\:\*\?\<\>\|\"\\]+\.([^\/\:\*\?\<\>\|\"\\\.]+)\\?\Z', 3)
    If IsArray($a) Then Return $a[0] ; by Christoph54
    EndFunc ;==>_GetFileExtension

    [/autoit][autoit][/autoit][autoit]

    Func _GetFileName($sPath)
    Local $a = StringRegExp($sPath, '[^\*\?\<\>\|"]+\\([^\/\:\*\?\<\>\|\"\\]+)\\?\Z', 3)
    If IsArray($a) Then Return $a[0] ; by Christoph54
    EndFunc ;==>_GetFileName

    [/autoit]

    (Ich weiß es sieht grauenvoll aus, aber das liegt daran, dass ich die Zeichen auf die beschränkt habe die auch in Dateinamen vorkommen dürfen. Und vielleicht liegt es auch ein bisschen daran, dass ich gerade erst mit StringRegExp anfange... ^^ )

    LG
    Christoph :)

    Einmal editiert, zuletzt von BinDannMalWeg (22. Oktober 2012 um 20:41)

  • @Cyrox
    Sehr schöne UDF. Vor allem schön übersichtlich da du dich an die ganzen Konventionen gehalten hast.
    Ein paar Funktionen lassen sich allerdings auch schon mit Autoit alleine ganz gut lösen.
    Hier mal ein paar Alternativen:

    • _ConvertEnvPath - Opt("ExpandEnvStrings", 1):[autoit]Opt("ExpandEnvStrings", 1)
      $String = "C:\Users\%USERNAME%\Desktop"
      ConsoleWrite($String & @CRLF)[/autoit]
    • _CorrectPath - FileGetLongName:[autoit]ConsoleWrite(_CorrectPath("C:\Windows\\System32\\\") & @CRLF)
      ConsoleWrite(FileGetLongName("C:\Windows\\System32\\\", 1) & @CRLF)[/autoit]

    Deine _GetFileExtension hat noch ein kleines Problem wenn im Dateinamen mehrere Punkte vorkommen (was erlaubt ist).
    Aber keine Angst mit solch obskuren regulären Ausdrücken brauchst du dich nicht herumzuschlagen da die Stringfunktionen für diesen Fall immer noch schneller sind als Christoph RegEx-Lösung:

    [autoit]

    Func _GetFileExtension(Const $sPath)
    Return StringTrimLeft($sPath, StringInStr($sPath, '.', 1, -1))
    EndFunc

    [/autoit]

    Wie gesagt, die UDF finde ich dennoch sehr gelungen :thumbup:

    BinDannMalWeg
    Wo hast du denn diese beeindruckenden RegEx-Konstrukte aufgetrieben? :)
    Dennoch als Vorschlag wie man das vielleicht etwas übersichtlicher und schneller machen kann:

    [autoit]

    Func _GetFileExtension(Const $sPath)
    Local $a = StringRegExp($sPath, '(?m)([^\.]+?)$', 3)
    If @error Then Return SetError(1, @error, "")
    If $a[0] = $sPath Then Return SetError(2, 0, "")
    Return $a[0]
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func _GetFileName($sPath)
    Local $a = StringRegExp($sPath, '(?m)([^\\]+?)$', 3)
    If @error Then Return SetError(1, @error, "")
    If $a[0] = $sPath Then Return SetError(2, 0, "")
    Return $a[0]
    EndFunc

    [/autoit]