;**********************************************************************************************************************************************************************************************
;	Funktion        _DirFile_Rekursiv ($DirFile_Rekursiv_Pfad[, $DirFile_Rekursiv_Auslesen[, $DirFile_Rekursiv_Unterordner[, $DirFile_Rekursiv_Datum [, $DirFile_Rekursiv_Dateityp = "*"[, $DirFile_Rekursiv_Auslassen = ""]]]]])
;	Beschreibung    ermittelt alle Dateien/Ordner des angegebenen Verzeichnisses
;	Parameter
;							$DirFile_Rekursiv_Pfad:        der zu durchsuchende Ordner            (Angabe: einzelner Ordner als String     oder     mehrere Ordner im Array beginnend bei 1)
;				optional    $DirFile_Rekursiv_OrdnerDateien:    1 = Dateien auflisten (Standard)        2 = Ordner auflisten
;				optional    $DirFile_Rekursiv_Unterordner:        True = Unterordner nicht miteinbeziehen (Standard)            False = Unterordner nicht miteinbeziehen
;				optional    $DirFile_Rekursiv_SpalteDatum:        True = Änderungsdatum der Datei ermitteln        False = Änderungsdatum der Datei nicht ermitteln (Standard)
;				optional    $DirFile_Rekursiv_Dateityp:            einzuschließende Dateitypen (mehrere Typen durch | trennen)        "*" >>> alle (Standard)
;				optional    $DirFile_Rekursiv_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 (Dateipfad, Dateiname, Änderungsdatum)
;					Erfolg:		[0][0] = Anzahl [Anzahl][(0 = Dateipfad, 1 = Dateiname, 2 = Änderungsdatum)]
;					Fehler:		0 setzt @error
;								@error = 1: mindestens 1 Pfad existiert nicht
;**********************************************************************************************************************************************************************************************

#include-once
#include <Array.au3>
#include <File.au3>

;********************************************
;		Ordner rekursiv (Hauptfunktion)		*
;********************************************

Func _DirFile_Rekursiv ($DirFile_Rekursiv_Pfad, $DirFile_Rekursiv_OrdnerDateien = 1, $DirFile_Rekursiv_Unterordner = True, $DirFile_Rekursiv_SpalteDatum = False, $DirFile_Rekursiv_Dateityp = "*", $DirFile_Rekursiv_Auslassen = "")
    Local $Verzeichnis_Alle[1] ;Array für die Ordner
    Local $Array_Alle[1000000][3] ;Array für die Ordner und Dateien
    Local $szDrive, $szDir, $szFName, $szExt

    If Not IsArray($DirFile_Rekursiv_Pfad) Then
        $DirFile_Rekursiv_Pfad_tmp = $DirFile_Rekursiv_Pfad
        Dim $DirFile_Rekursiv_Pfad[2]
        $DirFile_Rekursiv_Pfad[1] = $DirFile_Rekursiv_Pfad_tmp
    EndIf

    For $i = 1 To UBound($DirFile_Rekursiv_Pfad) - 1
        If Not FileExists($DirFile_Rekursiv_Pfad[$i]) Or Not StringInStr($DirFile_Rekursiv_Pfad[$i], ":") Then
            SetError(1)
            Return 0
        EndIf

        If StringRight($DirFile_Rekursiv_Pfad[$i], 1) <> "\" Then $DirFile_Rekursiv_Pfad[$i] &= "\"

        $DirFile_Rekursiv_Pfad_einzeln = $DirFile_Rekursiv_Pfad[$i]

        If $DirFile_Rekursiv_Unterordner = True Then ;mit Unterordner
            _DirFile_Rekursiv_mit_unterordner($DirFile_Rekursiv_Pfad_einzeln, $Verzeichnis_Alle)
            _ArrayAdd($Verzeichnis_Alle, $DirFile_Rekursiv_Pfad_einzeln)
        Else ;ohne Unterordner
            $Verzeichnis_Alle = $DirFile_Rekursiv_Pfad
        EndIf
    Next

    If IsArray($Verzeichnis_Alle) Then $Verzeichnis_Alle[0] = UBound($Verzeichnis_Alle) - 1 ;In die erste Zeile die Anzahl der Dateien schreiben



    If $DirFile_Rekursiv_OrdnerDateien = 1 Then ;Dateien auflisten
        $zaehler_fortlaufend = 0

        If Not IsArray($Verzeichnis_Alle) Then
            $Verzeichnis_Alle_tmp = $Verzeichnis_Alle
            Dim $Verzeichnis_Alle[2]
            $Verzeichnis_Alle[1] = $Verzeichnis_Alle_tmp
        EndIf

        For $u = 1 To UBound($Verzeichnis_Alle) - 1
            $array_alle_dateien = _FileListToArray($Verzeichnis_Alle[$u], "*", 1)

            For $k = 1 To UBound($array_alle_dateien) - 1
                $kriterien_ok = 0

                If $DirFile_Rekursiv_Dateityp = "*" Then ;Dateityp nicht angegeben oder alle Dateien
                    $kriterien_ok = 1

                ElseIf StringInStr($DirFile_Rekursiv_Dateityp, "|") Then ;Dateitypen angegeben
                    $dateityp_split = StringSplit($DirFile_Rekursiv_Dateityp, "|")
                    $DirFile_Rekursiv_dateiendung_array = _PathSplit($array_alle_dateien[$k], $szDrive, $szDir, $szFName, $szExt)
                    $DirFile_Rekursiv_dateiendung = $DirFile_Rekursiv_dateiendung_array[4]
                    For $i = 1 To UBound($dateityp_split) - 1
                        If "." & $dateityp_split[$i] = StringRight($array_alle_dateien[$k], StringLen($DirFile_Rekursiv_dateiendung)) Then
                            $kriterien_ok = 1
                            ExitLoop
                        EndIf
                    Next
                EndIf

                If $DirFile_Rekursiv_Auslassen <> "" Then ;Wörter in dem Pfad und Datei auslassen
                    $auslassen_split = StringSplit($DirFile_Rekursiv_Auslassen, "|")
                    For $i = 1 To UBound($auslassen_split) - 1
                        If StringInStr($array_alle_dateien[$k], $auslassen_split[$i]) Or StringInStr($Verzeichnis_Alle[$u], $auslassen_split[$i]) Then
                            $kriterien_ok = 0
                            ExitLoop
                        EndIf
                    Next
                EndIf

                ;Papierkorb und System Volume Information wird nicht mitkopiert
                If StringInStr($array_alle_dateien[$k], 'RECYCLER') Or StringInStr($Verzeichnis_Alle[$u], 'RECYCLER') _
                        Or StringInStr($array_alle_dateien[$k], 'RECYCLED') Or StringInStr($Verzeichnis_Alle[$u], 'RECYCLED') _
                        Or StringInStr($array_alle_dateien[$k], 'System Volume Information') Or StringInStr($Verzeichnis_Alle[$u], 'System Volume Information') _
                        Or StringInStr($array_alle_dateien[$k], '$RECYCLE.BIN') Or StringInStr($Verzeichnis_Alle[$u], '$RECYCLE.BIN') Then
                    $kriterien_ok = 0
                    ExitLoop
                EndIf

                ;wenn der Dateityp passt und die Datei bzw. der Ordner nicht ausgelassen werden soll
                If $kriterien_ok = 1 Then
                    $zaehler_fortlaufend += 1
                    $Array_Alle[$zaehler_fortlaufend][0] = $Verzeichnis_Alle[$u]
                    $Array_Alle[$zaehler_fortlaufend][1] = $array_alle_dateien[$k]

                    If $DirFile_Rekursiv_SpalteDatum = True Then
                        $time2 = FileGetTime($Verzeichnis_Alle[$u] & "\" & $array_alle_dateien[$k], 0) ;"Datum geändert" auslesen
                        $Array_Alle[$zaehler_fortlaufend][2] = $time2[0] & $time2[1] & $time2[2] & $time2[3] & $time2[4] & $time2[5]
                    EndIf

                EndIf

            Next
        Next

    Else ;Ordner auflisten
        For $i = 1 To UBound($Verzeichnis_Alle) - 1
            $Array_Alle[$i][0] = $Verzeichnis_Alle[$i]
            $zaehler_fortlaufend = UBound($Verzeichnis_Alle) - 1
        Next
    EndIf

    ;Leere Zeilen am Ende löschen
    ReDim $Array_Alle[$zaehler_fortlaufend + 1][3]

    ;In die erste Zeile die Anzahl der Dateien schreiben
    If IsArray($Array_Alle) Then $Array_Alle[0][0] = UBound($Array_Alle) - 1

    $Verzeichnis_Alle = 0

    Return $Array_Alle
EndFunc   ;==>_DirFile_Rekursiv



;**************************************
;        Unterordner durchsuchen          *
;**************************************

Func _DirFile_Rekursiv_mit_unterordner ($DirFile_Rekursiv_Pfad, ByRef $Verzeichnis_Alle)
    $verzeichnisse = _FileListToArray ($DirFile_Rekursiv_Pfad, "*", 2)

    For $i = 1 To UBound ($verzeichnisse) - 1
        $verzeichnisse[$i] = $DirFile_Rekursiv_Pfad & $verzeichnisse[$i] & "\"
        _ArrayAdd ($Verzeichnis_Alle, $verzeichnisse[$i])
        _DirFile_Rekursiv_mit_unterordner ($verzeichnisse[$i], $Verzeichnis_Alle)
    Next
EndFunc   ;==>_DirFile_Rekursiv_mit_unterordner
