Aus Dateipfad, Ordnerpfad machen

  • Hi zusammen

    Ich habe in einer variablen einen Pfad zu einer Datei.
    Jetzt brauche ich für die Weiterverarbeitung aber nur den Pfad zum Ordner.
    Ich habs zwar hinbekommen, aber ich kann es nicht glauben das es nicht einfacher geht...
    Gibt es keinen direkten befehl wie 'lösche alle Zeichen von rechts bis zum \'?

    Hier was ich gebastelt habe.

    [autoit]

    #include <Constants.au3>
    #include <String.au3>
    $pfadimg='D:\TEMP\abc\xyz\IMG.jpg'
    $ordner=StringTrimRight($pfadimg,StringInStr(_StringReverse($pfadimg),'\')-1)
    ConsoleWrite($ordner); Die Ausgabe ist genau was ich brauche: D:\TEMP\abc\xyz\

    [/autoit]


    Edit, so ist es ein bischen verständlicher:

    [autoit]

    #include <Constants.au3>
    #include <String.au3>
    $pfadimg='D:\TEMP\abc\xyz\IMG.jpg'
    $temp1=StringInStr(_StringReverse($pfadimg),'\')
    $temp2=StringTrimRight($pfadimg,$temp-1)
    ConsoleWrite($temp2)

    [/autoit]

    4 Mal editiert, zuletzt von Sayen (27. März 2009 um 16:59)

  • Perfekt :rock:

    Wusste nicht dass man bei StringInString von rechts aus suchen konnte.
    Es ist so zwar nur ein biischen kürzer, aber cool das ich was neues weis :D

    Vielen Dank :thumbup:

  • Es ginge auch noch mit StringRegExpReplace:

    [autoit]


    $pfad='D:\TEMP\abc\xyz\IMG.jpg'
    $pfad = StringRegExpReplace($pfad, '(.*\\).*\..*', '$1')
    MsgBox(0,0, $pfad)

    [/autoit]

    Boa, der ist noch geiler, aber ich versteh den einfach nicht ?(

  • Es ginge auch noch mit StringRegExpReplace:

    [autoit]


    $pfad='D:\TEMP\abc\xyz\IMG.jpg'
    $pfad = StringRegExpReplace($pfad, '(.*\\).*\..*', '$1')
    MsgBox(0,0, $pfad)

    [/autoit]


    Passiert für $pfad= "C:\Programme\Toller.Ordner\ABC.txt" nicht folgendes:
    "C:\Programme":?:
    Da scheint mir die vorige Lösung sicherer (und leichter zu durchschauen...;))

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

    • Offizieller Beitrag

    Hier mal mit Kommentar:

    [autoit]


    $pfad='D:\TEMP\abc\xyz\IMG.jpg'
    $pfad = StringRegExpReplace($pfad, '(.*\\).*\..*', '$1')
    ; der . steht für ein beliebiges Zeichen
    ; der * dahinter bedeutet: 0 bis x mal, also beliebig oft
    ; dann folgt ein Backslash, der hat bei StringRegExp aber eine besondere Bedeutung,
    ; muss also maskiert werden (das geschieht mit einem Backslash) ergibt \\
    ; diese Gruppe ist in Klammern eingeschlossen, dass bedeutet, das man darauf verweisen kann (mit dem '$1' im Ersetzen-Parameter)
    ; danach folgt wieder .* was wieder für beliebig viele Zeichen steht
    ; dann folgt ein maskierter Punkt \. damit wird nach einem Punkt in der Zeichenkette gesucht
    ; und nach dem Punkt dürfen dann wieder beliebig viele Zeichen stehen .*
    ;
    ; wenn man der ersten Gruppe (.*\\) kein Fragezeichen ? hinzufügt, dann verhält sich StringRegExp
    ; sehr "gefrässig", schnappt sich also alles vom ersten Zeichen bis zum letzten Backslash
    ; das ist hier so gewollt, deshalb kein Fragezeichen
    ; anders wäre es, wenn man das so schreibt: (.*?\\)
    ; dann würde nur der Teil bis zum ersten Backslash ausgewählt werden.
    MsgBox(0,0, $pfad)

    [/autoit]
  • denke das passt grad hier^

    Wie bekommt man den "Namen" einer datei von heraus?

    Beispiel: D:\TEMP\abc\xyz\Name1.jpg
    =Name1

    mir fällt jetzt nur Stringleft ein^^ aber wie gehts dann weiter?

    bb team2way

  • nachdem mir persönlich der Vorschlag von Xeno am Besten gefallen hat würde ich das so machen:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    Dim $szDrive, $szDir, $szFName, $szExt
    $path = _PathSplit("D:\TEMP\abc\xyz\Name1.jpg", $szDrive, $szDir, $szFName, $szExt)
    MsgBox(0, '', $path[3])

    [/autoit]

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • [autoit]


    $path = "D:\TEMP\abc\xyz\Name1.jpg"
    $string = stringsplit($path, "\")
    $string2 = stringsplit($string[UBound($string)-1], ".")
    MsgBox(1, "", $string2[1])

    [/autoit]

    So gehts ohne #include.
    Keine Ahnung wie sinnvoll das ist - hab grad langeweile :D

  • Ich hab es mir noch ein wenig genauer angeschaut.

    Um einfach den Ordnerpfad rauszukriegen interessiert mich ja eigentlich der letzte Punkt, bzw. der Dateiname nicht.
    Also müsste ich doch einfach nur bis zum letzten backslash suchen oder?
    Also sollte das reichen?:

    [autoit]

    $pfad='D:\TEMP\a.b c\xyz\I M.G.jpg'
    $pfad = StringRegExpReplace($pfad, '(.*\\).*', '$1')
    MsgBox(0,0, $pfad)

    [/autoit]

    und um nur den Dateinamen rauszukriegen?:

    [autoit]

    $pfad='D:\TEMP\a.b c\xyz\I M.G.jpg'
    $pfad = StringRegExpReplace($pfad, '.*\\', '')
    MsgBox(0,0, $pfad)

    [/autoit]

    Es geht mir jetzt nicht drum es noch ein paar zeichen kürzer zu machen, sondern damit ich es besser verstehe ;)