Komplette Fileliste eines Ordners samt Unterordnr erstellen

  • Hallo Leute,
    ich bin neu hier und noch ein ziemlich Anfänger bezüglich Autoit.

    Ich möchte eine Liste mit den Dateien eines Ordners und seiner Unterordner erstellen.

    Sowei bin ich gekommen:

    [autoit]

    If MsgBox(1 ,"New?" , "Create new list?") = 1 Then

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

    If FileExists ( @ScriptDir & "\Save\Save.ini" ) = 1 Then
    Global $nummer = IniRead(@ScriptDir&"\Save\Save.ini" , "Nummer", "Nummer", "default")
    Global $ordner = IniRead(@ScriptDir&"\Save\Save.ini" , "Optionen", "Nummer", "default")
    Else
    Global $nummer = 1
    Global $ordner = 1
    EndIf

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

    If FileExists ( @ScriptDir & "\Save\Save.ini" ) = 0 Then
    DirCreate(@ScriptDir & "\Save\")
    _FileCreate(@ScriptDir & "\Save\Save.ini")
    MsgBox(0, "Select" ,"Select Folder.")
    $directory = FileSelectFolder("Zielordner :", "C:\Program Files (x86)\Steam", 1)
    IniWrite(@ScriptDir&"\Save\Save.ini" , "Optionen", $ordner, $directory)
    EndIf
    EndIf

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

    _FileWriteFromArray($nummer&".txt",_FileListToArray($directory,"*",1))

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

    Global $nummer = $nummer + 1
    Global $ordner = $ordner + 1
    IniWrite(@ScriptDir&"\Save\Save.ini" , "Nummer", "Nummer", $nummer)
    IniWrite(@ScriptDir&"\Save\Save.ini" , "Optionen", "Nummer", $ordner)

    [/autoit]

    Nun erstellt das Programm leider nur die Liste des Hauptordners und nich der Unterordner.
    Die Inidatei ist eine Mischung aus Spielerei aus Lerngründen (mal was ausprobieren :) ) und Speichernamenerzeugung.

    Hoffe ihr könnt mir helfen. Am besten mit kurzem Sourcecode ;)

    Danke :D

    Einmal editiert, zuletzt von Newb (5. Juni 2011 um 17:09)

  • Splitte doch einfach das Auslesen auf.
    Lies zuerst die Ordner im Hauptverzeichnis via

    [autoit]

    $FolderList = _FileListToArray("C:\DeinVerzeichnis","*",2)

    [/autoit]


    aus und den Inhalt dieser UnterOrdner liest du dann in ner kurzen Schleife etwa so:

    [autoit]

    For $I = 1 To $FolderList[0]
    $FileList = _FileListToArray($FolderList[$I])
    _ArrayDisplay($FileList)
    Next

    [/autoit]

    Gruß

    UNPLEASANT SPOILER

    You just lost the game!

  • BugFix : Keine Suchergebnisse.

    shadow667: Auch wenns logisch aufgebaut ist funktioniert es nicht. _ArrayDisplay($FileList) zeigt keine Wirkung/Reaktion.
    Ich möchte das ganze dann auch in einer Txt speichern.

    hab das ganze mal so versucht:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseX64=n
    #AutoIt3Wrapper_Add_Constants=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #Include <Misc.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiComboBox.au3>
    #include <File.au3>
    #Include <Array.au3>

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

    If MsgBox(1 ,"New?" , "Create new list?") = 1 Then

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

    If FileExists ( @ScriptDir & "\Save\Save.ini" ) = 1 Then
    Global $nummer = IniRead(@ScriptDir&"\Save\Save.ini" , "Nummer", "Nummer", "default")
    Global $ordner = IniRead(@ScriptDir&"\Save\Save.ini" , "Optionen", "Nummer", "default")
    Else
    Global $nummer = 1
    Global $ordner = 1
    EndIf

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

    If FileExists ( @ScriptDir & "\Save\Save.ini" ) = 0 Then
    DirCreate(@ScriptDir & "\Save\")
    _FileCreate(@ScriptDir & "\Save\Save.ini")
    MsgBox(0, "Select" ,"Select Folder.")
    $directory = FileSelectFolder("Zielordner :", "C:\Program Files (x86)\Steam", 1)
    Else
    MsgBox(0, "Select" ,"Select Folder.")
    $directory = FileSelectFolder("Zielordner :", "C:\Program Files (x86)\Steam", 1)
    EndIf
    IniWrite(@ScriptDir&"\Save\Save.ini" , "Optionen", $ordner, $directory)

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

    EndIf

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

    $FolderList = _FileListToArray($directory,"*",2)
    For $I = 1 To $FolderList[0]
    $FileList = _FileListToArray($FolderList[$I])
    _ArrayDisplay($FileList)
    Next
    _FileWriteFromArray($nummer&".txt" , _ArrayDisplay($FileList))

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

    Global $nummer = $nummer + 1
    Global $ordner = $ordner + 1
    IniWrite(@ScriptDir&"\Save\Save.ini" , "Nummer", "Nummer", $nummer)
    IniWrite(@ScriptDir&"\Save\Save.ini" , "Optionen", "Nummer", $ordner)

    [/autoit]
  • Problem erkannt, Problem gebannt

    [autoit]

    $FolderList = _FileListToArray($directory,"*",2)
    For $I = 1 To $FolderList[0]
    $FileList = _FileListToArray($directory&"\"&$FolderList[$I]) ;hier fehlte das Startverzeichnis
    _ArrayDisplay( $FileList)
    Next

    [/autoit]
    UNPLEASANT SPOILER

    You just lost the game!

  • AspirinJunkie: Danke, das wusste ich nicht ;)

    shadow667: Ja funktioniert soweit ;)
    Nur wie bekomme ich die Daten nun in eine txt Datei?

    [autoit]

    $FolderList = _FileListToArray($directory,"*",2)
    For $I = 1 To $FolderList[0]
    $FileList = _FileListToArray($directory&"\"&$FolderList[$I]) ;hier fehlte das Startverzeichnis
    _ArrayDisplay( $FileList)
    Next
    _FileWriteFromArray($nummer&".txt", ;??? )

    [/autoit]


    //Edit er sollte es auch nicht anzeigen, diese Massen von Fenstern xD

  • Diese Masse an Fenstern kommt vom _ArrayDisplay(), welches bei jedem Durchlauf angezeigt wird.

    Willst du für jeden Ordner ne eigene Textdatei anlegen oder nur insgesamt eine?

    UNPLEASANT SPOILER

    You just lost the game!

  • Eigentlich recht simpel:

    [autoit]


    $File = Fileopen($nummer&".txt",1) ;Die 1 sagt aus, daß neue Einträge an bestehende angehängt werden
    $FolderList = _FileListToArray($directory,"*",2)
    For $I = 1 To $FolderList[0]
    $FileList = _FileListToArray($directory&"\"&$FolderList[$I])
    _FileWriteFromArray($File, $FileList) ;muß in die Schleife, da sich der Inhalt von $FileList nach jedem Durchlauf erneuert
    Next
    FileClose($File)

    [/autoit]

    Keine Garantie, nicht getestet

    UNPLEASANT SPOILER

    You just lost the game!

  • Sieht schon wesentlich besser aus. (liste)

    Muss aber sagen, dass noch immer nicht alle dateien von dem Programm erfasst werden.

    Einige (~1500) Dateien des angegebenen Ordners fehlen.

    Es muss doch irgendwie möglich sein, so etwas zu realisieren.

  • Klar ist das möglich.
    Und du wärst auch schon drauf gestoßen wenn du mal BugFix Tipp befolgt hättest.
    Ich behaupte mal es gibt hier im Forum rund 50 verschiedene Funktionen welche alle Dateien und Unterordner in einem Verzeichnisbaum auflisten.
    Aber du scheinst nicht danach gesucht zu haben.

  • @AsperinJunkie:

    Hatte es bereits damit versucht und rumexperimntiert. Vlt käme ja noch eine andere :)

    Also soweit hab ihs schon:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseX64=n
    #AutoIt3Wrapper_Add_Constants=n
    #endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <Misc.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiComboBox.au3>
    #include <File.au3>
    #include <Array.au3>

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

    If MsgBox(1, "New?", "Create new list?") = 1 Then

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

    If FileExists(@ScriptDir & "\Save\Save.ini") = 1 Then
    Global $nummer = IniRead(@ScriptDir & "\Save\Save.ini", "Nummer", "Nummer", "default")
    Global $ordner = IniRead(@ScriptDir & "\Save\Save.ini", "Optionen", "Nummer", "default")
    Else
    Global $nummer = 1
    Global $ordner = 1
    EndIf

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

    If FileExists(@ScriptDir & "\Save\Save.ini") = 0 Then
    DirCreate(@ScriptDir & "\Save\")
    _FileCreate(@ScriptDir & "\Save\Save.ini")
    MsgBox(0, "Select", "Select Folder.")
    $sPath = FileSelectFolder("Zielordner :", "C:\Program Files (x86)\Steam", 1)
    Else
    MsgBox(0, "Select", "Select Folder.")
    $sPath = FileSelectFolder("Zielordner :", "C:\Program Files (x86)\Steam", 1)
    EndIf
    IniWrite(@ScriptDir & "\Save\Save.ini", "Optionen", $ordner, $sPath)

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

    EndIf

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

    #include<Array.au3>
    $ret = _GetFilesFolder_Rekursiv('.', 'au3',0,1)
    If IsArray($ret) Then
    _ArrayDisplay($ret, 'Rekursiv alle au3-Dateien')
    Else
    ConsoleWrite($ret & @CRLF)
    EndIf

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

    $New = FileOpen($nummer&".txt" ,1)
    _FileWriteFromArray( $New , ;??? )

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

    MsgBox(0, "End" , "End" )

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

    Global $nummer = $nummer + 1
    Global $ordner = $ordner + 1
    IniWrite(@ScriptDir & "\Save\Save.ini", "Nummer", "Nummer", $nummer)
    IniWrite(@ScriptDir & "\Save\Save.ini", "Optionen", "Nummer", $ordner)

    [/autoit]

    Weiß aber nich wie ich den zurückgegebenen Array bekomme. :o

    // siehe Zeile 113

    Angeblich bringt die Methode ja einen Array als Produkt aber ich hab leider keine Ahnung inwiefern. Könnt ihr helfen?

  • Angeblich bringt die Methode ja einen Array als Produkt aber ich hab leider keine Ahnung inwiefern. Könnt ihr helfen?


    Nur wenn man einstellt das man ein Array zurückbekommt. Du hast ja aber explizit angegeben das ein String zurückgegeben werden soll statt einem Array.
    Als 4. Parameter übergibst du der Funktion eine 1 - warum?
    In der Funktionsbeschreibung steht bei diesem 4. Parameter:

    Zitat

    $iRetType 0 gibt Array, 1 gibt String zurück


    So kommt dann natürlich kein Array zurück.

    Ich denke du solltest nochmal in Worten erklären was du eigentlich erreichen willst.
    Ich persönlich sehe z.B. nicht durch was die ganzen Ini-Einträge am Ende darstellen sollen.

    Geh lieber mal Stück für Stück vor anstatt gleich alles implementieren zu wollen.
    Mach nur ein Skript welches dir erstmal das Array erzeugt.
    Erst wenn das klappt baue deine Ini-Aktionen ein usw.
    Momentan sieht das Skript eher so aus als wären es mal 3 Einzelskripte gewesen welche du einfach nur hintereinander geschrieben hast.