Ordnerinhalte auflisten

  • Ich versuche zurzeit hinzukriegen, dass wenn man einen Ordner auswählt mit "FileSelectFolder", dass dann alle darin enthalteten Ordner und Dateien mit Pfad+Dateiname in einer MsgBox aufgelistet werden.

    Soweit bin ich bisjetzt:

    Spoiler anzeigen
    [autoit]

    #Include <File.au3>

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

    Global $file[25900], $var = ""

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

    $path = FileSelectFolder("Ordner wählen", "")

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

    $search = FileFindFirstFile($path & "\*.*")

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

    For $i = 0 To 2000
    $file[$i] = FileFindNextFile($search)
    $Daten = ""
    _FileReadToArray($path & $file[$i], $Daten)
    If Not $file[$i] = "" Then
    $var = $var & @CRLF & $file[$i]
    EndIf
    Next
    MsgBox(64, "", $var)

    [/autoit]

    Hat vielleicht jemand eine Idee wie ich es hinkriege, dass alle Ordner und deren enthaltenden Dateien + Pfad mit aufliste?

  • name22 danke, hab was gefunden^^

    Und zwar das hier:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3> ; nur für die Beispiele erforderlich
    If @AutoItVersion < "3.3.0.0" Then Exit MsgBox(16, "Fehler", "Funktioniert erst ab AutoIt-Version 3.3.0.0")

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

    ; Beispiele
    $path = FileSelectFolder("Ordner wählen", "")

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

    $aReturn = _RecursiveFileListToArray($path, "", 0, 1, 0) ; Alle Verzeichnisse und Dateien
    _ArrayDisplay($aReturn, "Alle Verzeichnisse und Dateien:")

    [/autoit] [autoit][/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(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]

    Allerdings kam ein neues Problem dazu. Ich hab nachgeschaut in wie weit es Ordner auflistet.
    Hier mal der Screen:

    Spoiler anzeigen


    Wie man sehen kann, hat es die Unterordner und die Dateien darin alles zusammen in eine Variable Datei gepackt. Es sollte aber pro Datei/Ordner immer nur 1 Array benutzen und wenn mal ein Ordner einen inhalt hat, sollte der Ordnerpfad nicht noch extra aufgelistet werden, sondern der Pfad zu den Inhalten in dem Ordner.

    So sollte es eigtl aussehen:

    Spoiler anzeigen


    C:\Users\Sora\Desktop\okay\juju\das geht ab xD\
    C:\Users\Sora\Desktop\okay\juju\wtf.txt
    C:\Users\Sora\Desktop\okay\lol\
    C:\Users\Sora\Desktop\okay\Neues Textdokument (2).txt
    C:\Users\Sora\Desktop\okay\Neues Textdokument (3).txt
    C:\Users\Sora\Desktop\okay\Neues Textdokument.txt

    Dabei sollte dieser Pfad hier "C:\Users\Sora\Desktop\okay\juju\" nicht alleine stehen, da er einen Inhalt hat.

    Ich weiss jetzt allerdings nicht wie genau das geht >-< Kann mir da vielleicht jemand weiterhelfen?

  • Hmm... Ich bin mir nicht sicher, ob ich dich richtig verstanden habe. Ich hab mal diese Funktion gemacht, vielleicht funktioniert die ja besser.

    Spoiler anzeigen
    [autoit]

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

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

    $aFile = _FileListToArrayRecursiv(@UserProfileDir, "*", 0)
    _ArrayDisplay($aFile)

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

    ; #FUNCTION# ======================================================================================
    ; Name ..........: _FileListToArrayRecursiv()
    ; Description ...: Findet Dateien in einem Verzeichnis und allen Unterverzeichnissen
    ; Syntax ........: _FileListToArrayRecursiv($sPath, [$sFilter = "*"])
    ; Parameters ....: $sPath - Verzeichnispfad in dem gesucht werden soll.
    ; $sFilter - [optional] Dateinamenfilter (z.B. "*.mp3"). Wildcards werden unterstützt.
    ; $iFlag - [optional] 0 = Dateien und Ordner auflisten.
    ; 1 = Nur Dateien auflisten.
    ; 2 = Nur Ordner auflisten.
    ; Return values .: Success - Return Array with Files ($Array[0] = Count)
    ; Failure - Return 0
    ; Author ........: name22 (autoit.de)
    ; Remarks .......: Benötigt #include <File.au3>
    ; =================================================================================================
    Func _FileListToArrayRecursiv($sPath, $sFilter = "*", $iFlag = 0)
    Local $aFiles = _FileListToArray($sPath, $sFilter, $iFlag)
    If Not IsArray($aFiles) Then
    Local $aFiles[1]
    $aFiles[0] = 0
    EndIf

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

    Local $aFolders = _FileListToArray($sPath, "*", 2)
    If Not IsArray($aFolders) Then
    If $aFiles[0] = 0 Then Return 0
    Else
    $bResult = False
    For $i = 1 To $aFolders[0]
    $aSearchTmp = _FileListToArrayRecursiv($sPath & "\" & $aFolders[$i], $sFilter, $iFlag)
    If IsArray($aSearchTmp) Then
    $bResult = True
    ReDim $aFiles[$aFiles[0] + $aSearchTmp[0] + 1]
    For $j = 1 To $aSearchTmp[0]
    $aFiles[$aFiles[0] + $j] = $aFolders[$i] & "\" & $aSearchTmp[$j]
    Next
    $aFiles[0] += $aSearchTmp[0]
    EndIf
    Next
    EndIf

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

    Return $aFiles
    EndFunc

    [/autoit]
  • Sry für den Doppelpost, aber jetzt mal zum Verständnis:

    Du überprüfst einen Ordner (in diesem Fall "Test"), der folgende Dateien, Ordner, Unterordner und Unterdateien enthält:

    Spoiler anzeigen

    X:\...\Test\Datei1.x
    X:\...\Test\Datei2.x
    X:\...\Test\Ordner1\
    X:\...\Test\Ordner2\Datei1.x
    X:\...\Test\Ordner2\Datei2.x
    X:\...\Test\Ordner2\Ordner3\
    X:\...\Test\Ordner2\Ordner4\Datei1.x
    X:\...\Test\Ordner2\Ordner4\Datei2.x
    X:\...\Test\Ordner2\Ordner4\Ordner5


    Was soll im Endeffekt alles im Array stehen?

  • Im Endeffekt sollen in den Arrays eben genau diese Pfad drin stehen. Pro Pfad ein Array. Ich habe vor, es alles in eine Listview einzutragen.
    Noch genauer ist es jetzt in diesem Thread beschrieben.

  • Zitat

    Pro Pfad ein Array.


    :?: ... Meinst du nicht eher pro Pfad ein Element? Oder sprichst du von einem mehrdimensionalen Array? ?(
    Falls du für jedes Element ein Element haben willst, dann sollte mein Funktion eigentlich funktionieren. Probier mal ob es mit meiner Funktion das selbe Problem für dich gibt.

  • hab auch eine geschrieben - denke das was du suchst
    ist _FileListToArray
    damit bekommste es in einem Verzeichnis
    recursiv kannste mit
    dir PFAD /b /s

    suchen (in der cmd ausgabe in datei umleiten auf cmd prozess warten und dann datei lesen)


    MFg

    -

  • Nachid es wurden längst rekursive Alternativ Funktionen zu _filelisttoarray() gepostet. Es macht keinen Sinn dafür den "dir"-Befehl auszupacken und umständliche Umwege über Textdateien zu gehen erst recht nicht.

  • [autoit]

    $i = 1

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

    Do
    If StringInStr(FileGetAttrib($filelist[$i]),"D") Then
    $dump = _FileListToArray($filelist[$i])
    If Not @error Then
    For $x=1 to UBound($dump,1)-1 Step +1
    _ArrayAdd($filelist,$filelist[$i]&"\"&$dump[$x])
    Next
    EndIf
    EndIf
    $i = $i +1
    GUICtrlSetData($gefunden,"Gefunden : "&UBound($filelist,1)-1&" Daten")
    Until $i=UBound($filelist,1)-1

    [/autoit]

    mein AutoIt Quellcode - Selber geschrieben der Hilft dir beim erstellen soner func.


    @speed
    hab ich auch gebaut -.- nur muste ihm ja was geben was er mit lowskillz auch schafft

    -

  • Es kammen zwar viele Antworten, mich wundert aber dass @Oscars FileCommander nicht erwähnt wurde. Dieser enthält imho alle nötigen Grundlagen um das Problem zu lösen.

  • Zitat

    Es kammen zwar viele Antworten, mich wundert aber dass @Oscars FileCommander nicht erwähnt wurde. Dieser enthält imho alle nötigen Grundlagen um das Problem zu lösen.


    Den kennt vielleicht nicht jeder... Und um ehrlich zu sein, habe ich daran gar nicht gedacht ^^.