Hi,
ich habe vor einer Zeit mal eine UDF für mich erstellt, mit der ich alle Dateien in Unterordnern auflisten kann.
Diese habe ich nun generalüberholt.
Schaut sie euch mal an.
Was kann ich noch verbessern?
Warum ist meine UDF viel schneller als die von BugFix (teilweise bis zu 10 Mal )
Spoiler anzeigen
#include-once
#include <Array.au3>
#include <File.au3>
;*******************************************************************************************************************************************************************************************************************************************
; Funktion _ordner_rekursiv($udf_quellordner[, $udf_Ordner_Dateien[, $udf_unterordner=True[, $udf_spalte_datum=False[, $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 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)
;*******************************************************************************************************************************************************************************************************************************************
;********************************************
; Ordner rekursiv (Hauptfunktion) *
;********************************************
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
If Not IsArray($udf_quellordner) Then ;Falls der Quellordner kein Array ist, ein Array erstellen
$udf_quellordner_tmp = $udf_quellordner
Dim $udf_quellordner[2]
$udf_quellordner[0] = 1
$udf_quellordner[1] = $udf_quellordner_tmp
EndIf
For $i = 1 To UBound($udf_quellordner) - 1
If Not FileExists($udf_quellordner[$i]) Or Not StringInStr($udf_quellordner[$i], ":") Then
SetError(1) ;mindestens 1 Pfad existiert nicht
Return 0
EndIf
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
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]$zaehler_fortlaufend = 0
[/autoit] [autoit][/autoit] [autoit]If $udf_Ordner_Dateien = 1 Then ;Dateien auflisten
[/autoit] [autoit][/autoit] [autoit]If Not IsArray($verzeichnisse_alle) Then
$verzeichnisse_alle_tmp = $verzeichnisse_alle
Local $verzeichnisse_alle[2] ;Array für die Ordner
$verzeichnisse_alle[1] = $verzeichnisse_alle_tmp
EndIf
For $u = 1 To UBound($verzeichnisse_alle) - 1
$array_alle_dateien = _FileListToArray($verzeichnisse_alle[$u], "*", 1)
For $k = 1 To UBound($array_alle_dateien) - 1
$kriterien_ok = 0
If $udf_dateityp = "*" Then ;Dateityp nicht angegeben oder alle Dateien
$kriterien_ok = 1
Else ;1 oder mehrere 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
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
;Papierkorb und System Volume Information wird nicht aufgelistet
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
;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]
If $udf_spalte_datum = True Then $array_alles[$zaehler_fortlaufend][2] = FileGetTime($verzeichnisse_alle[$u] & $array_alle_dateien[$k], 0, 1)
EndIf
Next
Next
Else ;Ordner auflisten
For $i = 1 To UBound($verzeichnisse_alle) - 1
$kriterien_ok = 1
;Papierkorb und System Volume Information wird nicht aufgelistet
If StringInStr($verzeichnisse_alle[$i], 'RECYCLER') Or StringInStr($verzeichnisse_alle[$i], 'RECYCLED') _
Or StringInStr($verzeichnisse_alle[$i], 'System Volume Information') Or StringInStr($verzeichnisse_alle[$i], '$RECYCLE.BIN') Then
$kriterien_ok = 0
ExitLoop
EndIf
If $kriterien_ok = 1 Then
$zaehler_fortlaufend += 1
$array_alles[$zaehler_fortlaufend][0] = $verzeichnisse_alle[$i]
EndIf
Next
EndIf
;Leere Zeilen am Ende löschen
ReDim $array_alles[$zaehler_fortlaufend + 1][3]
;In die erste Zeile die Anzahl der Dateien schreiben
If IsArray($array_alles) Then $array_alles[0][0] = UBound($array_alles) - 1
$verzeichnisse_alle = 0 ;Array löschen
[/autoit] [autoit][/autoit] [autoit]Return $array_alles ;Array zurückgeben
EndFunc ;==>_ordner_rekursiv
;**************************************
; Unterordner durchsuchen *
;**************************************
Func _ordner_rekursiv_mit_unterordner($udf_quellordner, ByRef $verzeichnisse_alle)
$verzeichnisse = _FileListToArray($udf_quellordner, "*", 2)
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
PS: Hoffe es gefällt mein Skriptstil.
Ist denke ich nicht der beste, aber ich blick durch
Fehlerhändling ist nicht so mein Ding