Mehrere Filter bei _FileListToArray()?

  • So, da ich jetzt schon seit längerem nach diesem Thema suche und noch nichts gefunden habe,

    hab ich mal ein neues Thema eröffnet.

    Also:
    Ich möchte wissen ob man bei der Funktion _FileListToArray() mehrere Filter einstellen kann?
    Wenn ja, dann würde ich gerne wissen wie das Funktioniert.
    Und wenn nicht, dann würde ich gerne wissen ob eines eine andere Funktion gibt bei der das Funktioniert.

    Danke jetzt schon mal für eure Hilfe

    Einmal editiert, zuletzt von morfi93 (31. Januar 2008 um 19:56)

    • Offizieller Beitrag
    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ;
    ; Description: lists all or preferred files and or folders in a specified path (Similar to using Dir with the /B Switch)
    ; Syntax: _FileListToArrayEx($sPath, $sFilter = '*.*', $iFlag = 0, $sExclude = '')
    ; Parameter(s): $sPath = Path to generate filelist for
    ; $sFilter = The filter to use. Search the Autoit3 manual for the word "WildCards" For details, support now for multiple searches
    ; Example *.exe; *.txt will find all .exe and .txt files
    ; $iFlag = determines weather to return file or folders or both.
    ; $sExclude = exclude a file from the list by all or part of its name
    ; Example: Unins* will remove all files/folders that start with Unins
    ; $iFlag=0(Default) Return both files and folders
    ; $iFlag=1 Return files Only
    ; $iFlag=2 Return Folders Only
    ;
    ; Requirement(s): None
    ; Return Value(s): On Success - Returns an array containing the list of files and folders in the specified path
    ; On Failure - Returns the an empty string "" if no files are found and sets @Error on errors
    ; @Error or @extended = 1 Path not found or invalid
    ; @Error or @extended = 2 Invalid $sFilter or Invalid $sExclude
    ; @Error or @extended = 3 Invalid $iFlag
    ; @Error or @extended = 4 No File(s) Found
    ;
    ; Author(s): SmOke_N
    ; Note(s): The array returned is one-dimensional and is made up as follows:
    ; $array[0] = Number of Files\Folders returned
    ; $array[1] = 1st File\Folder
    ; $array[2] = 2nd File\Folder
    ; $array[3] = 3rd File\Folder
    ; $array[n] = nth File\Folder
    ;
    ; All files are written to a "reserved" .tmp file (Thanks to gafrost) for the example
    ; The Reserved file is then read into an array, then deleted
    ;===============================================================================
    #include<array.au3>

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

    $hFilesFolders = _FileListToArrayEx("c:\Downloads", '*.au3;*.txt', Default, "")

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

    _ArrayDisplay($hFilesFolders, 'Exe and Txt')
    Func _FileListToArrayEx($sPath, $sFilter = '*.*', $iFlag = 0, $sExclude = '')
    If Not FileExists($sPath) Then Return SetError(1, 1, '')
    If $sFilter = -1 Or $sFilter = Default Then $sFilter = '*.*'
    If $iFlag = -1 Or $iFlag = Default Then $iFlag = 0
    If $sExclude = -1 Or $sExclude = Default Then $sExclude = ''
    Local $aBadChar[6] = ['\', '/', ':', '>', '<', '|']
    For $iCC = 0 To 5
    If StringInStr($sFilter, $aBadChar[$iCC]) Or _
    StringInStr($sExclude, $aBadChar[$iCC]) Then Return SetError(2, 2, '')
    Next
    If StringStripWS($sFilter, 8) = '' Then Return SetError(2, 2, '')
    If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 3, '')
    Local $oFSO = ObjCreate("Scripting.FileSystemObject"), $sTFolder
    $sTFolder = $oFSO.GetSpecialFolder(2)
    Local $hOutFile = @TempDir & $oFSO.GetTempName
    If Not StringInStr($sFilter, ';') Then $sFilter &= ';'
    Local $aSplit = StringSplit(StringStripWS($sFilter, 8), ';'), $sRead
    For $iCC = 1 To $aSplit[0]
    If StringStripWS($aSplit[$iCC], 8) = '' Then ContinueLoop
    If StringLeft($aSplit[$iCC], 1) = '.' And _
    UBound(StringSplit($aSplit[$iCC], '.')) - 2 = 1 Then $aSplit[$iCC] = '*' & $aSplit[$iCC]
    RunWait(@ComSpec & ' /c ' & 'dir "' & $sPath & '\' & $aSplit[$iCC] _
    & '" /b /o-e /od > "' & $hOutFile & '"', '', @SW_HIDE)
    $sRead &= FileRead($hOutFile)
    If Not FileExists($hOutFile) Then Return SetError(4, 4, '')
    FileDelete($hOutFile)
    Next
    If StringStripWS($sRead, 8) = '' Then SetError(4, 4, '')
    Local $aFSplit = StringSplit(StringTrimRight(StringStripCR($sRead), 1), @LF)
    Local $sHold
    For $iCC = 1 To $aFSplit[0]
    If $sExclude And StringLeft($aFSplit[$iCC], _
    StringLen(StringReplace($sExclude, '*', ''))) = StringReplace($sExclude, '*', '') Then ContinueLoop
    Switch $iFlag
    Case 0
    $sHold &= $aFSplit[$iCC] & Chr(1)
    Case 1
    If StringInStr(FileGetAttrib($sPath & '\' & $aFSplit[$iCC]), 'd') Then ContinueLoop
    $sHold &= $aFSplit[$iCC] & Chr(1)
    Case 2
    If Not StringInStr(FileGetAttrib($sPath & '\' & $aFSplit[$iCC]), 'd') Then ContinueLoop
    $sHold &= $aFSplit[$iCC] & Chr(1)
    EndSwitch
    Next
    If StringTrimRight($sHold, 1) Then Return StringSplit(StringTrimRight($sHold, 1), Chr(1))
    Return SetError(4, 4, '')
    EndFunc

    [/autoit]

    Mega

  • thx, für die Funktion.
    kann ich gut gebrauchen, aber die von BugFix hat auch toll funktioniert.

    So jetzt will ich noch eine letzte Frage stellen,
    Und Zwar:

    Wie kann ich den Windows Media Player mit einem Array, welches die Musikdateien enthält, starten

    2 Mal editiert, zuletzt von morfi93 (31. Januar 2008 um 15:26)

  • hi,
    Ich habe bei mir in Ordner "Eigene Musik" einen Unterordner der "Musik" heißt, in diesem Ordner habe ich 610 .mp3 und .wma dateien.
    ich klicke mit der rechten Maustaste auf diesen Ordner und wähle "Mit Windows Mediaplayer wiedergeben".

    Jetzt habe ich das mit dem _FileListToArrayEx() gebraucht um die ganzen Dateien in ein Array zu kopieren, jetzt bräuchte ich nur mehr wissen wie ich diese in die Wiedergabeliste des MediaPlayers bringe.

    Ich hoffe du verstehst was ich meine. :S
    ^^

  • Erstelle einfach eine Wiedergabeliste: (m3u) und rufe dann so auf:

    Spoiler anzeigen
    [autoit]


    $mediaplayer = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MediaPlayer","Installation Directory")

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

    #cs
    PlayList im .m3u Format:
    In jeder Zeile ein Dateiname mit absolutem Pfad oder relativem Pfad oder URl

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

    Bsp:
    ----- test.m3u
    ..\Lied2.wma
    Titel 1.mp3
    Pop\Meine Auswahl\Titel 2.wav
    C:\Dokumente und Einstellungen\All Users\Dokumente\Eigene Musik\Titel 3.mp3
    http://www.seite.de/musik/titel4.mp3

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

    #ce

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

    $playlist = "D:\Dokumente\Dateien von Andreas\Eigcmdene Musik\Eigene Wiedergabelisten\test.m3u"

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

    ShellExecute('"' & $mediaplayer & 'wmplayer.exe" /prefetch:6 /Play "' & $playlist & '"')

    [/autoit]
  • Hi,
    habe auch mal so eine Funktion mit mehreren Wildcards gebraucht.
    Habe da auch die Funktion die Xeno empfohlen hat verwendet.

    Allerdings hatte ich festgestellt, dass diese langsamer war wie wenn ich mehrere Filelisttoarray-Funktionen mit verschiedenen Wildcards verwende.

    Nur mal so al Anmerkung,

    kannst ja mal testen was schneller ist :)

  • danke für deine Antwort,
    ich habe das jetzt schon gelöst mit der Hilfe von Xenos Funktion.

    bei mir fällt das wahrscheinlich nicht wirklich auf, da ich nur 2 Arrays habe die ca. 300 elemente enthalten.

    Ich habe es auch geschafft das ich den Windows Media Player mit der Liste starte zusammengebracht.

    Hier mal mein code:

    Spoiler anzeigen
    [autoit]


    #include <File.au3>
    #include <process.au3>
    #include <"C:\Users\Michael\AutoIt\MyUDF.au3">
    $file_dir = "C:\Users\Michael\Music\Musik\"
    $file_m3u = $file_dir & "Musik.m3u"
    $musik_dateien_mp3 = _FileListToArrayEx($file_dir, "*.mp3;*.wma")
    If FileExists($file_m3u) and FileGetSize($file_m3u)>0 Then
    FileDelete($file_m3u)
    $file = FileOpen($file_m3u, 9)
    Else
    $file = FileOpen($file_m3u, 9)
    EndIf
    FileWrite($file, "")
    For $i = 1 To $musik_dateien_mp3[0]
    FileWriteLine($file, $file_dir & $musik_dateien_mp3[$i]&@CRLF)
    Next

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

    FileClose($file)

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

    ShellExecute("wmplayer.exe", $file_m3u)

    [/autoit]

    Und jetzt hätte ich noch eine letzte frage:

    Funktioniert es, dass man mit Autoit die Wiedergabeliste im Windows Media Player automatisch sortiert nach titel?

  • man, ich bin so dumm, warum bin ich nicht auf die Idee gekommen
    ^^

    //EDIT: habe es mal ausprobiert, doch das hat nicht so funktioniert, wie es eigentlich sollte,
    denn wenn ich _ArraySort() hinzufüge, dann startet der Windows Media Player, aber danach passiert nichts mehr, er lädt nicht mal die Playlist rein

    Einmal editiert, zuletzt von morfi93 (2. Februar 2008 um 16:08)

  • Bei der Funktion ArraySort() musst du beim 3. Parameter ($Base) eine 1 eintragen - das heißt das erst ab diesem Element (dem 2.) sortiert wird.
    Bei deinem Array hat das erste Element ja eine Sonderfunktion, nämlich die Anzahl der Dateien anzugeben.
    Dieses wurde dann aber mit sortiert und mit großer Wahrscheinlichkeit rückte an erste Stelle nun irgendein String welcher als Zahlenwert 0 entspricht.
    Das heißt deine For - Schleife geht dann von $i=1 bis 0 - also wird gar nicht erst ausgeführt.
    Also wie gesagt: 3. Parameter muss 1 sein.

  • ok, thx für deine Hilfe,
    ich werde es sofort ausprobieren

    //EDIT: THX, hat funktioniert, nur es ist ein anderer Fehler aufgetreten.
    Im Windows Media Player werden ja nicht die Dateinamen angezeigt sondern der wirkliche titel des liedes
    und durch das Array sortieren werden die Lieder ja nur nach dem Dateinamen sortiert.
    Dadurch ist die Playlist nicht so sortiert wie ich mir das vorgestellt habe.

    Aber ich glaube es ist auch nicht anderst zu lösen oder?
    Wenn jemand vielleicht etwas rausfindet, dann bitte schreiben.
    Und sonst bedanke ich recht recht herzlichst für eure Antworten.
    Ihr habt mir wirklich sehr weitergeholfen.
    THX :thumbup: :)

    Einmal editiert, zuletzt von morfi93 (2. Februar 2008 um 16:49)

  • thx für eure hilfe.

    Hab wieder einmal ein kleines problem:
    hier zuerst einmal mein code:

    Spoiler anzeigen
    [autoit]

    #include <C:\Users\Michael\Autoit\MyUDF.au3>
    #include <File.au3>
    #include <process.au3>
    #include <Array.au3>
    _DLLstartUp()
    $file_dir = "C:\Users\Michael\Music\Musik\"
    $file_m3u = $file_dir & "Musik.m3u"
    $musik_dateien = _FileListToArrayEx($file_dir, "*.mp3;*.wma")
    If FileExists($file_m3u) and FileGetSize($file_m3u)>0 Then
    FileDelete($file_m3u)
    $file = FileOpen($file_m3u, 9)
    Else
    $file = FileOpen($file_m3u, 9)
    EndIf

    For $i = 1 To $musik_dateien[0]
    $musik_dateien[$i] = _getID3Tag($musik_dateien)
    Next

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

    _ArraySort($musik_dateien, 0, 1)

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

    For $i = 1 To $musik_dateien[0]
    FileWriteLine($file, $file_dir & $musik_dateien[$i]&@CRLF)
    Next
    FileClose($file)
    _DLLshutdown()
    ShellExecute("wmplayer.exe", $file_m3u)

    [/autoit]

    also:
    Das problem ist hier, dass ich in die m3u datei dann die Titelnamen speichere, und die datei dann mit dem Windows Media Player wiedergebe.
    Jetzt kann er die Lieder natürlich nicht öffnen, da nur in der datei nur die Titeln enthalten sind.
    Also funktioniert das irgendwie nicht, oder ich bin zu blöd dafür ^^ sorry

  • Aber ist egal, ich bin so schon zufrieden.
    ich wollte nur mal wissen ob das funktioniert.

    nochmal ein riesen THX für jeden der mir hier geholfen hat!!!

    THX THX THX