File + Dir Suche

  • Hallo AutoItler :P

    Gibt es eine UDF / Funktion zum in einem Angegebenen Pfad alle dateien + pfad auszulesen?
    also die rückgabe sollte der pfad bzw unterverzeichnis + datei sein?
    könnte mir jemand eine UDF oder funktion geben
    falls keine existiert könnte mir jemand so was basteln?

    lg chris

    Einmal editiert, zuletzt von SchrotterCh (21. Juni 2010 um 11:27)

  • sowas ?

    Spoiler anzeigen
    [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)
    ;===============================================================================
    #include <Array.au3>
    $dd = _RecursiveFileListToArray(@SystemDir,"*.*",0,1)

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

    _ArrayDisplay($dd)

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

    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(1, 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

    [/autoit]
    Zitat

    Laughing Man

    "I thought, what I'd do was, I'd pretend I was one of those deaf-mutes"

  • Hi, habe mal einige Funktionen zusammengetragen

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    $pfad = @scriptdir;"c:";@WindowsDir

    [/autoit] [autoit][/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, '.pdf', 1)
    _arraydisplay($dateien3)
    $dif3 = TimerDiff($begin3)
    ConsoleWrite("Oscar" & @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

    [/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

    [/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

    [/autoit]

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (21. Juni 2010 um 13:58)

  • danke Andy werde deines nehmen also eigen das entspricht meinen voraussetzungen danke :)

  • hihi, hab mein eigenes garnicht in der Aufstellung dabeigehabt. Das benutzt die DOS-Programme DIR und FIND und schlägt selbst Tweakys Script bzgl Geschwindigkeit.
    Falls man öfter Dateien bzw Inhalte suchen sollte, bietet sich an, per Script alle paar Tage (Stunden) sämtliche Platten nach den vorhandenen Dateinamen zu scannen und diese Liste in eine Datei zu schreiben. Innerhalb dieser Liste ist eine gesuchte Datei dann wesentlich schneller gefunden, als über den Windows-Index(obwohl der genau das eigendlich machen sollte).