Anzahl Werte in Array fest stellen

  • Nabend

    Ich versuche mir gerade ein Script zu schreiben, welches mir die Unterordner von bestimmten Ordnern ausliest. Eigentlich kein Problem mit _FileListToArray. Das Problem besteht allerdings darin dass es 2 Ordner gibt (aus Platzgründen, daher können die Ordner nicht vereint werden) welche vom Inhalt her der gleichen Kategorie zugeordnet werden. Da ich bei der Ausgabe allerdings keine Unterteilung zwischen Ordner 1 und Ordner 2 will, muss ich die Arrays kombinieren und alphabetisch sortieren. Das klappt auch, allerdings werden beim Sortiervorgang auch die Werte umsortiert welche angeben wieviel Werte sich im Array befinden. Wäre ja auch kein Problem, wenn sich diese aufgrund ihrer Zahlengrösse nicht immer auf eine andere Arraynummer verschieben würden.

    Um die Geschichte kurz zu erklären: Gibt es eine Möglichkeit herauszufinden wieviel Werte ein Array hat? Normalerweise ist dass ja $array[0], allerdings trifft das hier nicht zu. Daher bräuchte ich einen anderen Befehl hierfür.

    Einmal editiert, zuletzt von ahatius (26. Dezember 2009 um 17:09)

  • Mir ist gerade etwas komisches passiert. Die Auflistung der Ordner in alphabetischer Reihenfolge klappt wunderbar. Allerdings bockt er auf einmal beim FileWrite Befehl. Hier mal der SourceCode

    [autoit]

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

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

    ;Alte Liste löschen
    FileDelete("Liste.txt")
    DirCreate("E:\Benutzer\Ahatius\Eigene Videos\Movies\zz")

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

    ;Neue Listendatei erstellen
    $Liste = FileOpen("Liste.txt", 1)

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

    ;Filme zusammentragen
    $Movies = _FileListToArray("E:\Benutzer\Ahatius\Eigene Videos\Movies", "*", 2)
    $Movies2 = _FileListToArray("F:\Benutzer\Ahatius\Eigene Videos\Movies", "*", 2)

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

    ;Erstes Array rauslöschen
    _ArrayDelete($Movies, 0)
    _ArrayDelete($Movies2, 0)

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

    ;Arrays zusammenfügen
    _ArrayConcatenate($Movies, $Movies2)

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

    ;Arrays sortieren
    _ArraySort($Movies)

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

    ;Anzahl Filme definieren
    $Anzahl = UBound($Movies)

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

    ;Filme schreiben
    For $i = 1 to $Anzahl
    FileWrite($Liste, $Movies[$i])
    Next

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

    FileClose($Liste)

    [/autoit]

    Im Abschnitt "Filme schreiben" erzeugt er folgenden Fehler:

    Code
    >"D:\Programme (x86)\Applikationen\AutoIt 3\SciTE\..\autoit3.exe" /ErrorStdOut "E:\Benutzer\Ahatius\Eigene Dokumente\AutoIt Scripts\List.au3"    
    E:\Benutzer\Ahatius\Eigene Dokumente\AutoIt Scripts\List.au3 (30) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    FileWrite($Liste, $Movies[$i])
    FileWrite($Liste, ^ ERROR
    >Exit code: 1    Time: 0.226

    Spannend finde ich dass der Fehler nur beim Filewrite kommt. Wenn ich eine MsgBox mache welche mir einzeln die Ordner ausgibt (mit gleicher Schreibweise "$Movies[$i]"), kommt kein solcher Fehler. Woran könnte das liegen?

  • Arrays sind in AutoIt 0-basiert.
    Das heißt also das erste Element hat den Index [0].
    Wenn man also Ein Array mit 5 Elementen hat, hat das letzte Element den Index [4].

    Du lässt dein Array aber ein Element weiterlaufen - dann kommt der Fehler.
    Logisch - da ist ja auch kein Element mehr.
    Also müsstest du to $Anzahl - 1 schreiben weil $Anzahl ja die Gesamtanzahl der Elemente darstellt.

  • Nochmal eine kleine Frage. Ist es möglich einem Array von _FileListToArray ein 2D Array hinzuzufügen welches die Unterordner von diesem Ordner anzeigt? Als Beispiel sei folgende Ordnerstruktur gegeben:
    "E:\Benutzer\Ahatius\Eigene Videos\Ordner\Unterordner". Kann ich dann zum Beispiel irgendwie ein Array wie $array[1][2] erstellen, wobei 1 für "Ordner" steht und 2 für den Unterordner?

    • Offizieller Beitrag

    Du kannst in einem Array als Eintrag auch ein anderes Array speichern. Wenn du aber auf solch einen Eintrag zugreifen willst, mußt du erst den Eintrag auslesen.
    Ein direkter Zugriff auf das Unterarray ist somit nur über ein Temporäres Array möglich.