Dateien und Ordner/Dateien rekursive auflisten

  • Abend,

    ich suche jemanden, der mir ein Skript schreibt, welches die Dateien im derzeitigen Ordner in eine Textdatei schreibt und auch die Dateien, die sich wiederum in einem Ordner befinden.

    Das ganze sollte dann ca. so aussehen , wenn sich test1.txt im derzeitigen Ordner befindet, Test2.txt und Test3.txt sich in dem Unterordner " Testordner " befinden :

    Code
    test1.txt 
    TestOrdner/Test2.txt
    TestOrdner/Test3.txt

    Danke im voraus.

    Mit freundlichen Grüßen,

    Netterwurm8

  • selfmade und schon für tausende daten verwendet worden:

    [autoit]

    #include <File.au3>
    #include-once
    ;This function uses recursion, but there is no risk.
    Func FileCollect($path, $mask)
    Global $filecollectar[1]
    $filecollectar[0] = 0
    $filecollectar = FileCollectFolders($filecollectar, $path, $mask)
    Return $filecollectar
    EndFunc
    Func FileCollectFolders($ary, $path, $mask)
    $ar0 = _FileListToArray($path, "*", 2)
    If not @error Then
    For $c = 1 To $ar0[0]
    $ary = FileCollectFolders($ary, $path&"/"&$ar0[$c], $mask)
    Next
    EndIf
    $ar0 = _FileListToArray($path, $mask, 1)
    If Not @error Then
    ReDim $ary[$ary[0]+$ar0[0]+1]
    For $c = 1 To $ar0[0]
    $ary[$ary[0]+$c] = $path&"/"&$ar0[$c]
    Next
    $ary[0] += $ar0[0]
    EndIf
    Return $ary
    EndFunc

    [/autoit]


    die differenz zu dem was du willst ist, das hier gibt ein array, du musst
    For $c = 0 To $array[0]
    Filewrite("output.txt", $array[$c]&@CRLF)
    Next
    machen. in etwa ^^

    Dies ist ein Arzeneimittel.
    Bei Risiken und Haluzinationen fressen sie die Packungsbeilage und schlagen Sie ihren Arzt oder Apotheker.
    Jede Haftung wird abgelent.

    Vielen Dank für Ihre Kundentreue.
    mfg. TimBlo

    Aperture Science

    http://www.youtube.com/watch?v=Y6ljFaKRTrI

  • Kannst mir dies mal bitte als Beispiel mit einem Ordner machen? Ich verstehe nicht ganz, wofür dieses $ary und $mask sein soll

  • Habe ich auch schon gesehen, aber irgendwie bin ich zu dumm das dann zu spliten, sodass es so, wie ich es mir wünsche angezeigt wird.
    Könnte mir mal bitte jemand das Script schreiben?

  • Hab ich auch schon mal geschrieben Hier

    Spoiler anzeigen
    [autoit]

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

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

    #cs
    ===========================================================================================================================================

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

    _GetFiles
    ---------

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

    Version: 1.0

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

    Autor: Shadowigor

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

    Funktion: Gibt die Dateistruktur eines Pfades an (mit Filter)

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

    Parameter: $sPathFull Der zu durchsuchende Pfad (z.B C:\Users\Benutzer\*.* oder C:\Users\Benutzer\*.jpg)
    $fFlag 0 > Wird in Files.txt geschrieben
    1 > Gibt es als Array zurück
    2 > Gibt es als String zurück

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

    Bemerkung: Setzt @error und gibt "Nothing Found!" zurück (bzw. schreibt es in die Datei) wenn nichts gefunden wurde
    Gezielte Dateisuche wird noch nicht unterstützt.

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

    ===========================================================================================================================================
    #ce

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

    Func _GetFiles($sPathFull, $fFlag = 0)

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

    Local $aSubdirTmp[1], $aSubdir[1], $iLengh, $sPath, $sFile, $aFileList[1], $i, $sFileList, $sSubPath, $aFiles[1]

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

    $iLengh = StringInStr($sPathFull, "\", 0, -1)
    $sPath = StringLeft($sPathFull, $iLengh)
    $sFile = StringTrimLeft($sPathFull, $iLengh + 1)
    $iLengh = StringLen($sFile)

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

    If Not FileExists($sPath) Then
    If $fFlag = 0 Then
    $hFileWrite = FileOpen(@ScriptDir & "\Files.txt", 2)
    FileWrite($hFileWrite, "Nothing Found!")
    FileClose($hFileWrite)
    Return SetError(1)
    EndIf
    SetError(1)
    Return "Nothing Found!"
    EndIf

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

    $aFileList = _FileListToArray($sPath)

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

    For $i = 1 To $aFileList[0]
    If StringInStr(FileGetAttrib($sPath & $aFileList[$i]), "D") <> 0 Then
    _ArrayAdd($aSubdirTmp, $sPath & $aFileList[$i])
    _ArrayAdd($aFiles, $sPath & $aFileList[$i])
    ElseIf ($sFile = ".*") Or (StringRight($aFileList[$i], $iLengh) = $sFile) Then
    _ArrayAdd($aFiles, $sPath & $aFileList[$i])
    EndIf
    Next

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

    While UBound($aSubdirTmp) > 1
    $sSubPath = $aSubdirTmp[UBound($aSubdirTmp) - 1]
    $aFileList = _FileListToArray(_ArrayPop($aSubdirTmp))
    If IsArray($aFileList) Then
    For $i = 1 To $aFileList[0]
    If StringInStr(FileGetAttrib($sSubPath & "\" & $aFileList[$i]), "D") <> 0 Then
    _ArrayInsert($aSubdirTmp, 1, $sSubPath & "\" & $aFileList[$i])
    If $sFile = ".*" Then _ArrayInsert($aFiles, 1, $sSubPath & "\" & $aFileList[$i])
    ElseIf ($sFile = ".*") Or (StringRight($aFileList[$i], $iLengh) = $sFile) Then
    _ArrayInsert($aFiles, 1, $sSubPath & "\" & $aFileList[$i])
    EndIf
    Next
    EndIf
    WEnd

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

    If $fFlag = 1 Then Return $aFiles
    $sFileList = _ArrayToString($aFiles, @CRLF)
    If $fFlag = 2 Then Return $sFileList
    $hFileWrite = FileOpen(@ScriptDir & "\Files.txt", 2)
    FileWrite($hFileWrite, $sFileList)
    FileClose($hFileWrite)

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

    EndFunc ;==>_GetFiles

    [/autoit]

    Gruss Shadowigor

  • so?

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

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

    $pfad=@windowsdir
    $dateien = _RecursiveFileListToArray($pfad, '', 1)
    _arraydisplay($dateien)

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

    ;===============================================================================
    ; 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][/autoit]
  • Zitat

    Kannst mir dies mal bitte als Beispiel mit einem Ordner machen? Ich verstehe nicht ganz, wofür dieses $ary und $mask sein soll


    $ary und $ar0 sind nur zwischenspeicher.
    $mask filtert das ganze noch. kannste "*" rein packen dann kommt alles raus.

    Dies ist ein Arzeneimittel.
    Bei Risiken und Haluzinationen fressen sie die Packungsbeilage und schlagen Sie ihren Arzt oder Apotheker.
    Jede Haftung wird abgelent.

    Vielen Dank für Ihre Kundentreue.
    mfg. TimBlo

    Aperture Science

    http://www.youtube.com/watch?v=Y6ljFaKRTrI

  • Tut mir leid, aber das Script von Andy funktioniert nicht und die eine UDF funktioniert nicht ganz. ;(

  • Zitat von Julien

    Tut mir leid, aber das Script von Andy funktioniert nicht


    WAS funktioniert nicht?
    Bei mir wird nach ca 5-6 Sekunden ein Arraydisplay-Fenster geöffnet mit ca. 36000 Dateien, sortiert nach Namen + Ordnern, XP32

  • Sorry, habe vergessen, dass es länger dauert und es kam bei mir nach ca. 10 Sekunden noch nichts, weil mein Pc zugemüllt ist.
    Dein Skript funktioniert , nur schreibe ich dies gesplittet in die Textdatei "Files.txt", sodass es wie von mir oben geschrieben, aufgelistet wird?

  • habe es nocheinmal selber mit dem Splitten versucht, aber irgendwas läuft da schief.
    Kann mir da mal bitte jemand helfen?
    Script :

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    $pfad= 'C:\Users\User\Desktop\Get Word\Wordlist\noma'
    $FileList = _RecursiveFileListToArray($pfad, '', 1)
    For $i = 1 To UBound($FileList) -1
    $FileList[$i] = $FileList[0] & "\" & $FileList[$i]
    Next
    $Open = FileOpen("FileList.txt",2)
    FileWrite($Open,$FileList[$i] & @CRLF)

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

    ;===============================================================================
    ; 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]
  • Spoiler anzeigen
    [autoit]

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

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

    $pfad=@windowsdir
    $dateien = _RecursiveFileListToArray($pfad, '', 1)
    _arraydisplay($dateien)

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

    Local $hFile = FileOpen("Dateien.txt", 2) ; 2 = erase
    _FileWriteFromArray($hFile, $dateien, 1)
    FileClose($hFile)
    run("notepad.exe "&@scriptdir&"\Dateien.txt")

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

    ;===============================================================================
    ; 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]
  • Das ganze sollte dann ca. so aussehen , wenn sich test1.txt im derzeitigen Ordner befindet, Test2.txt und Test3.txt sich in dem Unterordner " Testordner " befinden :

    Spoiler anzeigen
    [autoit]

    test1.txt
    TestOrdner/Test2.txt
    TestOrdner/Test3.txt

    [/autoit]

    Er soll es so splitten und dann erst in ein Notepad oder in eine Textdatei schreiben.

    • Offizieller Beitrag

    Das heißt, Du möchtest nicht die absoluten Pfade, sondern nur die relativen.
    Das kann man recht einfach lösen:

    Spoiler anzeigen
    [autoit]


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

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

    $pfad = @WindowsDir & '\'
    ToolTip('Bitte warten...')
    $dateien = _RecursiveFileListToArray($pfad, '', 1, 0)
    $dateien = StringReplace($dateien, $pfad, '')
    $dateien = StringSplit($dateien, @CRLF, 1)
    ToolTip('')
    _ArrayDisplay($dateien)

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

    Local $hFile = FileOpen("Dateien.txt", 2) ; 2 = erase
    _FileWriteFromArray($hFile, $dateien, 1)
    FileClose($hFile)
    Run("notepad.exe " & @ScriptDir & "\Dateien.txt")

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

    ;===============================================================================
    ; 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]