Alle Dateien auslesen

  • hey leute...
    wie kann man alle dateien, die sich auf einem usb-stick oder ordner befinden, auslesen? sowas in der art geht soviel ich weiß mit

    [autoit]

    _FileListToArray()

    [/autoit]

    das suche ich allerdings nicht da hier nur die "haupt"dateinen bzw "haupt"ordner ausgelesen werden :) die dateien die sich in den "haupt"ordner befinden werden nicht angezeigt :( ich suche also eine möglichkeit alle dateien auszulesen...egal hinter wie vielen ordner die sich befinden ;) (ich hoffe es ist verständlich geworden :))

  • die Daten ändern sich oder? Also mal sind es mehr unterordner, mal weniger.
    wenn nicht ist es einfach

    mfg Yellow

    §1 Ich kann nicht für meine scripts inhaftiert werden, auch wenn bereits 3 Menschen erblindeten an den Folgen der Korrekturlesung.  8o

  • Klick mich, ich bin ein Link!
    und noch einer....

    Wenn dir das nicht reicht, hast du jedenfalls genug Vorlagen, um dir was eigenes zu stricken....

  • Warum nicht einfach die Scripting.FileSystemObject-Klasse aus der Microsoft Scripting Runtime-Komponete (scrrun.dll) verwenden?

    [autoit]

    #include <String.au3>
    AutoItSetOption('MustDeclareVars', 1)
    Global Const $FOLDER_PATH = 'c:\'
    If FileExists($FOLDER_PATH) Then
    ConsoleWrite(StringFormat('Inhalt von %s\n', $FOLDER_PATH))
    _listFolder($FOLDER_PATH)
    EndIf

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

    Func _listFolder($p_sFolderPath, $p_iLevel = 0)
    Local $oFSO = ObjCreate('Scripting.FileSystemObject')
    Local $oFolder = $oFSO.GetFolder($p_sFolderPath)
    Local $sMyTab = _StringRepeat(' ', $p_iLevel)
    For $oFile In $oFolder.Files
    ConsoleWrite(StringFormat('%i %s%s\n', $p_iLevel, $sMyTab, $oFile.Name))
    Next ; $oFile
    For $oSubFolder In $oFolder.SubFolders
    ConsoleWrite(StringFormat('%i %s%s\n', $p_iLevel, $sMyTab, $oSubFolder.Name))
    _listFolder($oSubFolder.Path, $p_iLevel + 1)
    Next ; $oSubFolder
    EndFunc ;==>_listFolder

    [/autoit]
  • Cool Sache - das FileSystem-Dingens.

    Der Source ist um einiges einfacher und kürzer als der Code von Shadowigor. Danke _mk_ ich werde Dein Beispiel mal für mich missbrauchen. :D

  • Zitat

    Gerade bei vielen Daten relativ langsam im Vergleich zu anderen Methoden.

    relativ ist relativ :rolleyes:
    In dem von mir geposteten Link werden die gängigen Methoden verglichen.
    BugFix benutzt dabei das Scripting.FileSystemObject und ist nur halb so schnell wie Oscars Lösung

    $path=@windowsdir

    Code
    BugFix	                      33.1 Sekunden                  71420
    Oscar	                      14.8 Sekunden                  71420
    _FileListToArrayEx	      14.8 Sekunden                  71420
  • Kannst ja mal spaßeshalber noch 2 Funktionen mit zu deinem Vergleich hinzufügen:

    Speedvergleich &quot;Alle Dateien in Unterordner auflisten&quot;
    [autoit]

    #include <Array.au3>
    $pfad = @WindowsDir

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

    $begin1 = TimerInit()
    $dateien1 = _ordner_rekursiv($pfad, 1)
    $dif1 = TimerDiff($begin1)
    ConsoleWrite("tweaky" & @TAB & Round($dif1 / 1000, 2) & " Sekunden" & @TAB & UBound($dateien1) - 1 & @CRLF)

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

    $begin2 = TimerInit()
    $dateien2 = _GetFilesFolder_Rekursiv($pfad, '*', 0)
    $dif2 = TimerDiff($begin2)
    ConsoleWrite("BugFix" & @TAB & Round($dif2 / 1000, 2) & " Sekunden" & @TAB & UBound($dateien2) - 1 & @CRLF)

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

    $begin3 = TimerInit()
    $dateien3 = _RecursiveFileListToArray($pfad, '', 1)
    $dif3 = TimerDiff($begin3)
    ConsoleWrite("Oscar" & @TAB & Round($dif3 / 1000, 2) & " Sekunden" & @TAB & UBound($dateien3) - 1 & @CRLF)

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

    $begin3 = TimerInit()
    $dateien3 = _FileListToArrayEx($pfad, '*.*', 1)
    $dif3 = TimerDiff($begin3)
    ConsoleWrite("amiforum" & @TAB & Round($dif3 / 1000, 2) & " Sekunden" & @TAB & UBound($dateien3) - 1 & @CRLF)

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

    $begin3 = TimerInit()
    $dateien3 = FLwStr($pfad, '', 1)
    $dif3 = TimerDiff($begin3)
    ConsoleWrite("FlwStr" & @TAB & Round($dif3 / 1000, 2) & " Sekunden" & @TAB & UBound($dateien3) - 1 & @CRLF)

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

    $begin3 = TimerInit()
    $dateien3 = FlwStrRek($pfad, '', 1)
    $dif3 = TimerDiff($begin3)
    ConsoleWrite("FlwStrRek" & @TAB & Round($dif3 / 1000, 2) & " Sekunden" & @TAB & UBound($dateien3) - 1 & @CRLF)

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

    ;===============================================================================
    ; Function Name: _RecursiveFileListToArray($sPath, $sPattern, $iFlag = 0, $iFormat = 1, $sDelim = @CRLF)
    ; Description:: gibt Verzeichnisse und/oder Dateien (rekursiv) zurück, die
    ; einem RegExp-Pattern entsprechen
    ; Parameter(s): $sPath = Startverzeichnis
    ; $sPattern = ein beliebiges RexExp-Pattern für die Auswahl
    ; $iFlag = Auswahl
    ; 0 = Dateien & Verzeichnisse
    ; 1 = nur Dateien
    ; 2 = nur Verzeichnisse
    ; $iFormat = Rückgabeformat
    ; 0 = String
    ; 1 = Array mit [0] = Anzahl
    ; 2 = Nullbasiertes Array
    ; $sDelim = Trennzeichen für die String-Rückgabe
    ; Requirement(s): AutoIt 3.3.0.0
    ; Return Value(s): Array/String mit den gefundenen Dateien/Verzeichnissen
    ; Author(s): Oscar (http://www.autoit.de)
    ; Anregungen von: bernd670 (http://www.autoit.de)
    ;===============================================================================
    Func _RecursiveFileListToArray($sPath, $sPattern, $iFlag = 0, $iFormat = 1, $sDelim = @CRLF)
    Local $hSearch, $sFile, $sReturn = ''
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $hSearch = FileFindFirstFile($sPath & '*.*')
    If @error Or $hSearch = -1 Then Return SetError(0, 0, $sReturn)
    While True
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If StringInStr(FileGetAttrib($sPath & $sFile), 'D') Then
    If StringRegExp($sPath & $sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 2) Then $sReturn &= $sPath & $sFile & '\' & $sDelim
    $sReturn &= _RecursiveFileListToArray($sPath & $sFile & '\', $sPattern, $iFlag, 0)
    ContinueLoop
    EndIf
    If StringRegExp($sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 1) Then $sReturn &= $sPath & $sFile & $sDelim
    WEnd
    FileClose($hSearch)
    If $iFormat Then Return StringSplit(StringTrimRight($sReturn, StringLen($sDelim)), $sDelim, $iFormat)
    Return $sReturn
    EndFunc ;==>_RecursiveFileListToArray

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

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

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

    ;*******************************************************************************************************************************************************************************************************************************************
    ; Funktion _ordner_rekursiv($udf_quellordner[, $udf_Ordner_Dateien[, $udf_unterordner=False[, $udf_spalte_datum [, $udf_dateityp = "*"[, $udf_auslassen = ""]]]]])
    ; Beschreibung ermittelt alle Dateien/Ordner des angegebenen Verzeichnisses
    ; Parameter $udf_quellordner: der zu durchsuchende Ordner (Angabe: einzelner Ordner als String oder mehrere Ordner im Array beginnend bei 1)
    ; optional $udf_Ordner_Dateien: 1 = Dateien auflisten (Standard) 2 = Ordner auflisten
    ; optional $udf_unterordner: True = Unterordner nicht miteinbeziehen (Standard) False = Unterordner nicht miteinbeziehen
    ; optional $udf_spalte_datum: True = Änderungsdatum der Datei ermitteln False = Änderungsdatum der Datei nicht ermitteln (Standard)
    ; optional $udf_dateityp: einzuschließende Dateitypen (mehrere Typen durch | trennen) "*" >>> alle (Standard)
    ; optional $udf_auslassen: Wörter, die im Pfad oder Dateinamen vorkommen, auslassen (mehrere durch | trennen) "" <<< Standard
    ; Rückgabewert Erfolg: Gibt ein Array mit 3 Spalten zurück (Dateiname, Dateipfad, Änderungsdatum)
    ; Fehler: 0 setzt @error
    ; @error = 1 mindestens 1 Pfad existiert nicht
    ; Autor Tweaky (http://www.autoit.de)
    ;*******************************************************************************************************************************************************************************************************************************************

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

    ;********************************************
    ; Ordner rekursiv (Hauptfunktion) *
    ;********************************************

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

    Func _ordner_rekursiv($udf_quellordner, $udf_Ordner_Dateien = 1, $udf_unterordner = True, $udf_spalte_datum = False, $udf_dateityp = "*", $udf_auslassen = "")
    Local $verzeichnisse_alle[1] ;Array für die Ordner
    Local $array_alles[1000000][3] ;Array für die Ordner und Dateien
    Local $szDrive, $szDir, $szFName, $szExt

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

    If Not IsArray($udf_quellordner) Then
    $udf_quellordner_tmp = $udf_quellordner
    Dim $udf_quellordner[2]
    $udf_quellordner[1] = $udf_quellordner_tmp
    EndIf

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

    For $i = 1 To UBound($udf_quellordner) - 1
    If Not FileExists($udf_quellordner[$i]) Or Not StringInStr($udf_quellordner[$i], ":") Then
    SetError(1)
    Return 0
    EndIf

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

    If StringRight($udf_quellordner[$i], 1) <> "\" Then $udf_quellordner[$i] &= "\"

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

    $udf_quellordner_einzeln = $udf_quellordner[$i]

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

    If $udf_unterordner = True Then ;mit Unterordner
    _ordner_rekursiv_mit_unterordner($udf_quellordner_einzeln, $verzeichnisse_alle)
    _ArrayAdd($verzeichnisse_alle, $udf_quellordner_einzeln)
    Else ;ohne Unterordner
    $verzeichnisse_alle = $udf_quellordner
    EndIf
    Next

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

    If IsArray($verzeichnisse_alle) Then $verzeichnisse_alle[0] = UBound($verzeichnisse_alle) - 1 ;In die erste Zeile die Anzahl der Dateien schreiben

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

    If $udf_Ordner_Dateien = 1 Then ;Dateien auflisten
    $zaehler_fortlaufend = 0

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

    If Not IsArray($verzeichnisse_alle) Then
    $verzeichnisse_alle_tmp = $verzeichnisse_alle
    Dim $verzeichnisse_alle[2]
    $verzeichnisse_alle[1] = $verzeichnisse_alle_tmp
    EndIf

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

    For $u = 1 To UBound($verzeichnisse_alle) - 1
    $array_alle_dateien = _FileListToArray($verzeichnisse_alle[$u], "*", 1)

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

    For $k = 1 To UBound($array_alle_dateien) - 1
    $kriterien_ok = 0

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

    If $udf_dateityp = "*" Then ;Dateityp nicht angegeben oder alle Dateien
    $kriterien_ok = 1

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

    ElseIf StringInStr($udf_dateityp, "|") Then ;Dateitypen angegeben
    $dateityp_split = StringSplit($udf_dateityp, "|")
    $udf_dateiendung_array = _PathSplit($array_alle_dateien[$k], $szDrive, $szDir, $szFName, $szExt)
    $udf_dateiendung = $udf_dateiendung_array[4]
    For $i = 1 To UBound($dateityp_split) - 1
    If "." & $dateityp_split[$i] = StringRight($array_alle_dateien[$k], StringLen($udf_dateiendung)) Then
    $kriterien_ok = 1
    ExitLoop
    EndIf
    Next
    EndIf

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

    If $udf_auslassen <> "" Then ;Wörter in dem Pfad und Datei auslassen
    $auslassen_split = StringSplit($udf_auslassen, "|")
    For $i = 1 To UBound($auslassen_split) - 1
    If StringInStr($array_alle_dateien[$k], $auslassen_split[$i]) Or StringInStr($verzeichnisse_alle[$u], $auslassen_split[$i]) Then
    $kriterien_ok = 0
    ExitLoop
    EndIf
    Next
    EndIf

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

    ;Papierkorb und System Volume Information wird nicht mitkopiert
    If StringInStr($array_alle_dateien[$k], 'RECYCLER') Or StringInStr($verzeichnisse_alle[$u], 'RECYCLER') _
    Or StringInStr($array_alle_dateien[$k], 'RECYCLED') Or StringInStr($verzeichnisse_alle[$u], 'RECYCLED') _
    Or StringInStr($array_alle_dateien[$k], 'System Volume Information') Or StringInStr($verzeichnisse_alle[$u], 'System Volume Information') _
    Or StringInStr($array_alle_dateien[$k], '$RECYCLE.BIN') Or StringInStr($verzeichnisse_alle[$u], '$RECYCLE.BIN') Then
    $kriterien_ok = 0
    ExitLoop
    EndIf

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

    ;wenn der Dateityp passt und die Datei bzw. der Ordner nicht ausgelassen werden soll
    If $kriterien_ok = 1 Then
    $zaehler_fortlaufend += 1
    $array_alles[$zaehler_fortlaufend][0] = $verzeichnisse_alle[$u]
    $array_alles[$zaehler_fortlaufend][1] = $array_alle_dateien[$k]

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

    If $udf_spalte_datum = True Then
    $time2 = FileGetTime($verzeichnisse_alle[$u] & "\" & $array_alle_dateien[$k], 0) ;"Datum geändert" auslesen
    $array_alles[$zaehler_fortlaufend][2] = $time2[0] & $time2[1] & $time2[2] & $time2[3] & $time2[4] & $time2[5]
    EndIf

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

    EndIf

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

    Next
    Next

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

    Else ;Ordner auflisten
    For $i = 1 To UBound($verzeichnisse_alle) - 1
    $array_alles[$i][0] = $verzeichnisse_alle[$i]
    $zaehler_fortlaufend = UBound($verzeichnisse_alle) - 1
    Next
    EndIf

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

    ;Leere Zeilen am Ende löschen
    ReDim $array_alles[$zaehler_fortlaufend + 1][3]

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

    ;In die erste Zeile die Anzahl der Dateien schreiben
    If IsArray($array_alles) Then $array_alles[0][0] = UBound($array_alles) - 1

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

    $verzeichnisse_alle = 0

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

    Return $array_alles
    EndFunc ;==>_ordner_rekursiv

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

    ;**************************************
    ; Unterordner durchsuchen *
    ;**************************************

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

    Func _ordner_rekursiv_mit_unterordner($udf_quellordner, ByRef $verzeichnisse_alle)
    $verzeichnisse = _FileListToArray($udf_quellordner, "*", 2)

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

    For $i = 1 To UBound($verzeichnisse) - 1
    $verzeichnisse[$i] = $udf_quellordner & $verzeichnisse[$i] & "\"
    _ArrayAdd($verzeichnisse_alle, $verzeichnisse[$i])
    _ordner_rekursiv_mit_unterordner($verzeichnisse[$i], $verzeichnisse_alle)
    Next
    EndFunc ;==>_ordner_rekursiv_mit_unterordner

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

    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
    ; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
    ; optional: $iRetType 0 gibt Array, 1 gibt String zurück
    ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
    ; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
    ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
    ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt = '*', $iDir = -1, $iRetType = 0, $sDelim = '0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    Case '3'
    $sDelim = ';'
    Case '4'
    $sDelim = '|'
    Case Else
    $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath), $sExt, $iDir, $sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
    EndFunc ;==>_GetFilesFolder_Rekursiv

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

    Func _ShowSubFolders($Folder, $Ext = '*', $Dir = -1, $Delim = @CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc ;==>_ShowSubFolders

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

    Func _FileListToArrayEx($s_path, $s_mask, $i_flag = 0, $s_exclude = -1, $f_recurse = True, $f_full_path = True)

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

    If FileExists($s_path) = 0 Then Return SetError(1, 1, 0)

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

    ; Strip trailing backslash, and add one after to make sure there's only one
    $s_path = StringRegExpReplace($s_path, "[\\/]+\z", "") & "\"

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

    ; Set all defaults
    If $s_mask = -1 Or $s_mask = Default Then $s_mask = "*.*"
    If $i_flag = -1 Or $i_flag = Default Then $i_flag = 0
    If $s_exclude = -1 Or $s_exclude = Default Then $s_exclude = ""

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

    ; Look for bad chars
    If StringRegExp($s_mask, "[\\/:><\|]") Or StringRegExp($s_exclude, "[\\/:><\|]") Then
    Return SetError(2, 2, 0)
    EndIf

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

    ; Strip leading spaces between semi colon delimiter
    $s_mask = StringRegExpReplace($s_mask, "\s*;\s*", ";")
    If $s_exclude Then $s_exclude = StringRegExpReplace($s_exclude, "\s*;\s*", ";")

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

    ; Confirm mask has something in it
    If StringStripWS($s_mask, 8) = "" Then Return SetError(2, 2, 0)
    If $i_flag < 0 Or $i_flag > 2 Then Return SetError(3, 3, 0)

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

    ; Validate and create path + mask params
    Local $a_split = StringSplit($s_mask, ";"), $s_hold_split = ""
    For $i = 1 To $a_split[0]
    If StringStripWS($a_split[$i], 8) = "" Then ContinueLoop
    If StringRegExp($a_split[$i], "^\..*?\..*?\z") Then
    $a_split[$i] &= "*" & $a_split[$i]
    EndIf
    $s_hold_split &= '"' & $s_path & $a_split[$i] & '" '
    Next
    $s_hold_split = StringTrimRight($s_hold_split, 1)
    If $s_hold_split = "" Then $s_hold_split = '"' & $s_path & '*.*"'

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

    Local $i_pid, $s_stdout, $s_hold_out, $s_dir_file_only = "", $s_recurse = "/s "
    If $i_flag = 1 Then $s_dir_file_only = ":-d"
    If $i_flag = 2 Then $s_dir_file_only = ":d"
    If Not $f_recurse Then $s_recurse = ""

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

    Local $i_buffer, $t_input, $t_output, $s_hold_binary

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

    $i_pid = Run(@ComSpec & " /u /c dir /b " & _
    $s_recurse & "/a" & $s_dir_file_only & " " & _
    $s_hold_split, "", @SW_HIDE, 4 + 2)

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

    ; Collect data from std i/o stream
    While 1
    $s_stdout = StdoutRead($i_pid, False, True)
    If @error Then ExitLoop
    $i_buffer = BinaryLen($s_stdout)
    $t_input = DllStructCreate("byte[" & $i_buffer & "]")
    $t_output = DllStructCreate("char[" & $i_buffer & "]")

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

    DllStructSetData($t_input, 1, $s_stdout)
    DllCall("kernel32.dll", "int", "WideCharToMultiByte", _
    "int", 0, "int", 0, "ptr", DllStructGetPtr($t_input), _
    "int", $i_buffer / 2, "ptr", DllStructGetPtr($t_output), _
    "int", $i_buffer, "int", 0, "int", 0)

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

    $s_hold_out &= StringRegExpReplace(DllStructGetData($t_output, 1), "(?i)(?:\A|\v)(?:(0+\v+)|(0+))|(\v*0+\z)", "")
    $t_input = 0
    $t_output = 0
    WEnd

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

    ; Replace any extending verticle spaces from the end of the string
    $s_hold_out = StringRegExpReplace($s_hold_out, "\v+\z", "")
    If Not $s_hold_out Then Return SetError(5, 5, 0)

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

    ; Parse data and find matches based on flags
    Local $a_fsplit = StringSplit(StringStripCR($s_hold_out), @LF), $s_hold_ret
    $s_hold_out = ""

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

    If $s_exclude Then $s_exclude = StringReplace(StringReplace($s_exclude, "*", ".*?"), ";", "|")
    Local $i_path_len = BinaryLen($s_path)

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

    For $i = 1 To $a_fsplit[0]
    If $s_exclude And StringRegExp(StringRegExpReplace( _
    $a_fsplit[$i], "(.*?[\\/]+)*(.*?\z)", "\2"), "(?i)" & $s_exclude) Then ContinueLoop
    If StringRegExp($a_fsplit[$i], "^\w:[\\/]+") = 0 Then $a_fsplit[$i] = $s_path & $a_fsplit[$i]
    If $f_full_path Then
    $s_hold_ret &= $a_fsplit[$i] & Chr(1)
    Else
    $s_hold_ret &= StringTrimLeft($a_fsplit[$i], $i_path_len) & Chr(1)
    EndIf
    Next

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

    $s_hold_ret = StringTrimRight($s_hold_ret, 1)
    If $s_hold_ret = "" Then Return SetError(6, 6, 0)

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

    Return StringSplit($s_hold_ret, Chr(1))
    EndFunc ;==>_FileListToArrayEx

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

    ; #FUNCTION# ======================================================================================
    ; Name ..........: FLwStr()
    ; Description ...: Findet Dateien und/oder Ordner in einem Verzeichnisbaum
    ; Syntax ........: FLwStr($sSD, Const[ $sPat = '', Const[ $iF = 3]])
    ; Parameters ....: $sSD - Suchort (mehrere Suchorte durch | trennen)
    ; Const $sPat - [optional] regulärer Ausdruck für zu findende Datei/Ordnernamen (default:'')
    ; Const $iF - [optional] 1=nur Dateien, 2=nur Ordner, 3=Dateien+Ordner (default:3)
    ; Const $iSSFlag - [optional] 0=Rückgabearray mit Anzahl Elemente in $Array0, 2=Rückgabearray ohne Anzahl Elemente
    ; Return values .: Success - Return Array with Matches with $Array[0] = Count
    ; Failure - Return "" and set @error
    ; Author ........: AspirinJunkie
    ; Remarks .......: Funktionsweise ist iterativ - nicht rekursiv
    ; Example .......: Yes
    ; #include <Array.au3>
    ; $aTmp = FLwStr(@WindowsDir & '|' & @ProgramFilesDir, "^Temp$", 2)
    ; _ArrayDisplay($aTmp)
    ; =================================================================================================
    Func FLwStr($sSD, Const $sPat = '', Const $iF = 3, Const $iSSFlag = 1)
    ;by AspirinJunkie
    Local $sRet = "", $sSubD = ""
    For $i In StringSplit($sSD, '|', 2)
    If StringRight($i, 1) = '\' Then $i = StringTrimRight($i, 1)
    If Not FileExists($i) Then Return SetError(2, 0, "")
    $sSubD &= '|' & $i
    Next
    Local $FFFF, $FFNF, $sDir, $iC
    Local $aD, $hDLL = DllOpen('kernel32.dll')
    If Not ($iF = 3 Or $iF = 1 Or $iF = 2) Then Return SetError(3, 0, "")
    Do
    $iC = StringInStr($sSubD, '|', 2, -1)
    If @error Or $iC = 0 Then ExitLoop
    $iC = StringLen($sSubD) - $iC
    $sDir = StringRight($sSubD, $iC)
    $sSubD = StringTrimRight($sSubD, $iC + 1)
    $FFFF = FileFindFirstFile($sDir & '\*')
    If $FFFF <> -1 Then
    Do
    $FFNF = FileFindNextFile($FFFF)
    If @error Then ExitLoop
    If @extended Then
    If BitAND(StringRegExp($FFNF, $sPat) * 2, $iF) Then $sRet &= $sDir & '\' & $FFNF & '\|'
    $aD = DllCall($hDLL, 'dword', 'GetFileAttributesW', 'wstr', $sDir & '\' & $FFNF)
    If @error Or BitAND($aD[0], 0x400) Then ContinueLoop
    $sSubD &= '|' & $sDir & '\' & $FFNF
    ElseIf BitAND(StringRegExp($FFNF, $sPat), $iF) Then
    $sRet &= $sDir & '\' & $FFNF & '|'
    EndIf
    Until 0
    FileClose($FFFF)
    EndIf
    Until 0
    DllClose($hDLL)
    Return StringSplit(StringTrimRight($sRet, 1), '|', $iSSFlag)
    EndFunc ;==>FLwStr

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: FLwStrRek
    ; Description ...: Gibt ein Array mit Dateien bzw. Unterordnern im gesamten Verzeichnisbaum zurück
    ; Syntax.........: FLwStrRek($sSD, [$sPat = '', [$iF = 0]])
    ; Parameters ....: $sSD - Startverzeichnis (mehrere Verzeichnisse durch | trennen)
    ; $sPat - Optional: Pattern zur Filterung mit regulären Ausdrücken
    ; $iF - Optional: Flag ob nur Dateien, Ordner oder beides gesucht werden sollen
    ; |$iF=3(Default) Gibt beides zurück
    ; |$iF=1 Gibt nur Dateien zurück
    ; |$iF=2 Gibt nur Ordner zurück
    ; $flgSS - Art der Rückgabe (Siehe StringSplit()-Funktion)
    ; $bS - interner Rekursionsparameter - nicht verändern!
    ; Return values .: @Error: 1 = Startverzeichnis existiert nicht.
    ; |2 = ungültiger Wert für $iF
    ; Author ........: AspirinJunkie
    ; Modified.......: 12.04.2010
    ; Remarks .......:
    ; Related .......:
    ; Link ..........:
    ; Example .......: No
    ; Note ..........: basiert auf einem rekursiven Ansatz
    ; ===============================================================================================================================
    Func FlwStrRek($sSD, Const $sPat = '', Const $iF = 3, Const $flgSS = 1, Const $bS = True)
    ; By AspirinJunkie
    Local $FFFF, $FFNF, $aD
    Local Static $sRet, $hDLL
    If $bS Then
    $hDLL = DllOpen("kernel32.dll")
    If NOT ($iF = 3 Or $iF = 1 Or $iF = 2) Then Return SetError(1, DllClose($hDLL), "")
    EndIf
    For $i In StringSplit($sSD, "|", 2)
    If StringRight($i, 1) = "\" Then $i = StringTrimRight($i, 1)
    If Not FileExists($i) Then ContinueLoop
    $FFFF = FileFindFirstFile($i & "\*")
    If $FFFF <> -1 Then
    Do
    $FFNF = FileFindNextFile($FFFF)
    If @error Then ExitLoop
    If @extended Then
    If BitAND(StringRegExp($FFNF, $sPat) * 2, $iF) Then $sRet &= $i & "\" & $FFNF & "\|"
    $aD = DllCall($hDLL, "dword", "GetFileAttributesW", "wstr", $i & "\" & $FFNF)
    If @error Or BitAND($aD[0], 0x400) Then ContinueLoop
    FlwStrRek($i & "\" & $FFNF, $sPat, $iF, 2, False)
    ElseIf BitAND(StringRegExp($FFNF, $sPat), $iF) Then
    $sRet &= $i & "\" & $FFNF & "|"
    EndIf
    Until 0
    FileClose($FFFF)
    EndIf
    Next
    If $bS Then
    DllClose($hDLL)
    Local $aRet = StringSplit(StringTrimRight($sRet, 1), "|", $flgSS)
    $sRet = ""
    Return $aRet
    EndIf
    EndFunc ;==>FlwStrRek

    [/autoit]
  • Sehr nice :thumbup:
    aber per DeviceIOControl() gehts noch ca. 10x schneller über direktes Lesen aus der MFT. Ich finde leider das Script nicht mehr :(...muss in irgendeinem Backup verschollen sein...
    Die MFT auszulesen bzw zu verändern führt bei unsachgemässem Gebrauch schnell mal zu einer komplett zu formatierenden Platte :D , daher hab ich das Script damals nicht gepostet.

  • aber per DeviceIOControl() gehts noch ca. 10x schneller über direktes Lesen aus der MFT. Ich finde leider das Script nicht mehr ...muss in irgendeinem Backup verschollen sein...

    Oh das würde mich aber doch sehr interessieren.
    Wenn du's findest wärs schön wenn du das posten könntest. :)

    Die beiden Funktionen sind ja auch noch lange nicht am Speedlimit.
    Das sind ja meine beiden Allrounder. Man kann ja gleicher mehrere verschiedene Verzeichnisse angeben, man kann die Dateien über reguläre Ausdrücke statt Wildcards filtern und die Reparse-Points werden mit beachtet.
    Wenn man das alles nicht braucht und weglässt kann man noch mehr heraus holen.
    Aber mir reicht es bisher so und ich bin damit denke ich sehr flexibel.