Dateinamen und Dateiendung voneinander trennen?

  • Hallo,
    ich schreibe ein kleines Skript, in dem ich von einem Ordner alle Dateien mit einer bestimmten endung einlese.

    Spoiler anzeigen
    [autoit]


    $Dateien = _FileListToArray($Ordner, ".online")

    [/autoit]

    Jetzt wollte ich wissen, wie ich dann im selben Array($Dateien) nur mehr die ganzen Dateinamen ohne Dateiendung speichern kann?
    Und dann will ich das Array in eine Listbox einfügen.
    Hoffentlich versteht ihr mich und ihr könnt mir helfen.

  • Hi,
    ich hab mich mal Probiert, ...

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>

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

    $Dateien = _FileListToArray($ordner, "*.online")

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

    for $i = 1 to UBound($Dateien)-1
    $Dateien[$i] = StringLEFT($Dateien[$i], StringLen($Dateien[$i]) - 7)
    Next
    _ArrayDisplay($Dateien)

    [/autoit]
  • Ich würde die Dateiendungen mit

    [autoit]


    StringSplit ( $Dateien[$i] , "." )

    [/autoit]

    abeschneiden.
    Das ganze inne Forschleife damit das ganze Array gesplittet wird.

    • Offizieller Beitrag

    Es können aber auch Punkte im Dateinamen vorkommen ;)
    Also am letzten Punkt trennen:

    Spoiler anzeigen
    [autoit]

    $filename = 'C:\abc\hjk.lll\t.e.s.t.txt'
    $ar = _StringSplitOnce($filename, '\', -1)
    $path = $ar[0]
    $ar = _StringSplitOnce($ar[1], '.', -1)
    MsgBox(0, '', 'Pfad: ' & $path & @LF & 'Dateiname: ' & $ar[0] & @LF & 'Endung: ' & $ar[1])
    ;===============================================================================
    ;
    ; Function Name: _StringSplitOnce($STRING, $DELIM [, $OCCURENCE=1])
    ; Description: Splits a string on given occurence of delimiter
    ; Parameter(s): $STRING String to split
    ; $DELIM Delimiter
    ; $OCCURENCE Occurence of Delimiter ('-' starts from the right side, Default=1)
    ; Requirement(s):
    ; Return Value(s): Succes Array[0]=left side / Array[1]=right side of splittet string
    ; Failure Set error
    ; @error = 1 No string given
    ; @error = 2 No delimiter given
    ; @error = 3 Delimiter not in string
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;
    ;===============================================================================
    Func _StringSplitOnce($STRING, $DELIM, $OCCURENCE=1)
    If $STRING = '' Then Return SetError(1)
    If $DELIM = '' Then Return SetError(2)
    Local $Out[2]
    Local $len = StringLen($STRING)
    Local $pos = StringInStr($STRING, $DELIM, 1, $OCCURENCE)
    If @error Then Return SetError(3)
    $Out[0] = StringLeft($STRING, $pos-1)
    $Out[1] = StringRight($STRING, $len-$pos)
    Return $Out
    EndFunc ;==>_StringSplitOnce

    [/autoit]
  • :rofl:
    Warum sich Arbeit machen, wenn es schon andere für einen getan haben.
    Siehe _PathSplit

    PS: Habe ich übrigens entdeckt, als ich beim übersetzen der englischen Hilfe war :thumbup:
    Ist also doch für etwas gut :D

    • Offizieller Beitrag
    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ; Function Name: _PathSplit1()
    ; Description: Split the path to 8 elements.
    ; Parameter(s): $sPath - Path to split.
    ; Requirement(s): AutoIt 3.2.2.0.
    ; Return Value(s): On seccess - Array $RetArray that contain 8 elements:
    ; $RetArray[0] = Full path ($sPath)
    ; $RetArray[1] = Drive letter
    ; $RetArray[2] = Path without FileName and extension
    ; $RetArray[3] = Full path without File Extension
    ; $RetArray[4] = Full path without drive letter
    ; $RetArray[5] = FileName and extension
    ; $RetArray[6] = Just Filename
    ; $RetArray[7] = Just Extension of a file
    ;
    ; On failure - If $sPath not include correct path (the path is not splitable),
    ; then $sPath returned.
    ; If $sPath not include needed delimiters, or it's emty,
    ; then @error set to 1, and returned -1.
    ;
    ; Note(s): The path can include backslash as well (exmp: C:/test/test.zip).
    ;
    ; Author(s): G.Sandler a.k.a CreatoR (MsCreatoR) - Thanks to amel27 for help with RegExp
    ;===============================================================================
    Global $text = ''
    $a = _PathSplit1(@ScriptFullPath)
    For $i = 0 To UBound($a) - 1
    $text &= $a[$i] & @CRLF
    Next
    MsgBox(0, "", $text)

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

    Func _PathSplit1($sPath)
    If $sPath = "" Or StringRegExp($sPath, ('.*\\.*\/')) Then Return SetError(1, 0, -1)
    Local $RetArray[8], $pDelim = ""
    If StringRegExp($sPath, '^(?i)([A-Z]:|\\)(\\[^\\]+)+$') Then $pDelim = "\"
    If StringRegExp($sPath, '(?i)(^.*:/)(/[^/]+)+$') Then $pDelim = "//"
    If $pDelim = "" Then $pDelim = "/"
    If Not StringInStr($sPath, $pDelim) Then Return $sPath
    If $pDelim = "\" Then $pDelim &= "\"
    $RetArray[0] = $sPath
    $RetArray[1] = StringRegExpReplace($sPath, $pDelim & '.*', $pDelim)
    $RetArray[2] = StringRegExpReplace($sPath, $pDelim & '[^' & $pDelim & ']*$', '')
    $RetArray[3] = StringRegExpReplace($sPath, '\.[^.]*$', '')
    $RetArray[4] = StringRegExpReplace($sPath, '(?i)([A-Z]:' & $pDelim & ')', '')
    $RetArray[5] = StringRegExpReplace($sPath, '^.*' & $pDelim, '')
    $RetArray[6] = StringRegExpReplace($RetArray[5], '\.[^.]*$', '')
    $RetArray[7] = StringRegExpReplace($sPath, '^.*\.', '')
    Return $RetArray
    EndFunc ;==>_PathSplit1

    [/autoit]
  • Hey,
    riesen THX an alle, die mir geholfen haben.
    Habe es jetzt so gmeacht wie Anno geschrieben hat.
    Trotzdem riesen THX an alle.
    :thumbup::thumbup:

    • Offizieller Beitrag

    Hab noch eine Variante, ähnlich wie _PathSplit(), auf Objektbasis:

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ; Function Name: _GetPathDetail($FILEPATH)
    ; Description: get's path/file details for a given filepath
    ; Parameter(s): $FILEPATH given file
    ; Return Value(s): $array with: Absolute Path Name
    ; Drive Name
    ; Parent Folder Name
    ; File Name
    ; Base Name
    ; Extension Name
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _GetPathDetail($FILEPATH)
    If Not FileExists($FILEPATH) Then Return SetError(1,0,1)
    Local $objFSO = ObjCreate("Scripting.FileSystemObject")
    Local $objFile = $objFSO.GetFile($FILEPATH)
    Local $aOut[6] = [$objFSO.GetAbsolutePathName($objFile), _
    $objFSO.GetDriveName($objFile), _
    $objFSO.GetParentFolderName($objFile), _
    $objFSO.GetFileName($objFile), _
    $objFSO.GetBaseName($objFile), _
    $objFSO.GetExtensionName($objFile)]
    Return $aOut
    EndFunc ;==>_GetPathDetail

    [/autoit]
  • BugFix : Das ist echt eine super Idee. Mit der UDF bekommt man mehr Infos über die Datei als mit den vorhandenen Funktionen

    • Offizieller Beitrag

    Die Funktion _PathSplit() hat einen entscheidenden Handlingnachteil:
    Obwohl die ermittelten Details in einem Array zurückgegeben werden, muß zusätzlich für jedes Detail eine Variable vorab deklariert und als Referenz beim Funktionsaufruf übergeben werden. Man erspart sich damit zwar die Zuweisung eines Details aus dem Array heraus, muß aber alles deklarieren, selbst wenn nur ein Detail genutzt werden soll. - Sehr unkomfortabel.
    Zudem stellt sich die Frage, warum wird ein Array zurückgegeben, wenn alle Details perse schon in separaten Variablen abgelegt sind?