Alle Dateien auflisten - Fehler wenn Ordner leer

  • Hi,
    ich hab ein Scritp erstellt, welches mir die Dateien von einem bestimmten Ordner auflistet.

    Dies funktioniert soweit.
    Wenn allerdings ein leerer Ordner existiert, kommt folgende Fehlermeldung

    Code
    V:\_AutoIt\Versuche aktuell\mit Anzeige kopieren6 kurz.au3 (108) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.: 
    _ArrayInsert($FileList, $j + $i, $tmpdir & $tmp[$j]) 
    _ArrayInsert($FileList, $j + $i, $tmpdir & ^ ERROR


    Spoiler anzeigen
    [autoit]

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

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

    ;Nummer des ersten zu kopierenden Ordners
    $start = 0

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

    ;Nummer des letzten zu kopierenden Ordners
    $ende = 0

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

    ;Nummer des letzten zu überspringenden Ordners
    $ende2 = 0

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

    ;~ Dim $dir[$ende+1]
    Dim $ordner[$ende+1]
    Dim $ausschliessen[$ende2+1]
    Dim $array_gesamt_liste, $anzahl, $anzahl_array, $array_gesamt, $anzahl_array2, $array_gesamt2, $array_gesamt_ok2, $anzahl2, $anzahl_gesamt, $merken_alt, $ziel, $ordner_Dateiname, $quelle, $zielordner, $dateiname
    Dim $Entscheidung
    Dim $Quell_Pf_[$ende+1][2] ; [n][0] = Pfad; [n][1] = gerundete Größe
    Dim $goend = 0

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

    ;Datumsoptionen
    $iWeekday = _DateToDayOfWeek(@YEAR, @MON, @MDAY)
    $sNewDate = _DateAdd('d', 0, _NowCalcDate())
    $sNewDate = StringReplace($sNewDate, "/", ".")

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

    ;~ ;Quell-Laufwerk
    $Quell_LW = "D:\"

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

    ;~ ;Quell-Ordner (ohne Laufwerksbuchstabe)
    $ordner[0] = "Video"

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

    ;~ ;Quell-Ordner zusammengesetzt
    $Quell_Pf_[0][0] = $Quell_LW & $ordner[0] & "\"

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

    ;~ ;Ziel-Laufwerk
    $Ziel_LW = "C:\"
    $Ziel_Pf = $Ziel_LW & "Sicherung Internet\" & $sNewDate & "\"

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

    ;folgende Ordner bei der Sicherung ausschließen
    $ausschliessen[0] = "D:\alt"

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

    _gesamt_array_erstellen()

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

    ;***********************************************************************
    ; Funktion komplettes Array mit allen zu kopierenden Dateien erstellen *
    ;***********************************************************************

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

    Func _gesamt_array_erstellen()
    ;~ _ArrayDisplay($array_gesamt_liste)

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

    ;leeres Array erstellen
    $array_gesamt = _ArrayCreate("")

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

    ;Dateien zum kopieren zusammentragen
    For $q = $start to $ende
    $anzahl = DirGetSize($Quell_Pf_[$q][0], 1)
    $anzahl_array = $anzahl[1]
    $ordner_aktuell = $Quell_Pf_[$q][0]
    _makecopylist($ordner_aktuell)
    $anzahl_gesamt += $anzahl_array

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

    ;die Dateien jedes zu kopierenden Ordners dem Gesamt-Array hinzufügen
    For $h = 0 to UBound($array_gesamt_liste)-1
    _ArrayAdd($array_gesamt, $array_gesamt_liste[$h])
    Next

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

    Next

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

    ;Die erste (leere) Linie des Gesamt-Array löschen
    _ArrayDelete($array_gesamt, 0)
    _ArrayDisplay($array_gesamt)

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

    EndFunc ;==>_gesamt_array_erstellen

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

    ;***********************************************************************
    ; Funktion einzelne Arrays mit allen zu kopierenden Dateien erstellen *
    ;***********************************************************************

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

    ;Funktion zum zusammentragen der Dateien
    Func _makecopylist($dir)
    $FileList = _FileListToArray($dir, "*", 0)
    If (Not IsArray($FileList)) And (@error = 1) Then SetError(-1)
    _ArrayDelete($FileList,0)

    $i = 0
    While ($i < UBound($FileList))
    If (FileGetAttrib($dir & '\' & $FileList[$i]) = "D") Then
    $tmp = _makecopylist($dir & '\' & $FileList[$i])
    $tmpdir = $FileList[$i] & '\'
    _ArrayDelete($FileList, $i)
    For $j = 0 To UBound($tmp) -1
    _ArrayInsert($FileList, $j + $i, $tmpdir & $tmp[$j])
    Next
    $i = $i + UBound($tmp) - 1
    EndIf
    $i=$i+1
    WEnd

    _ArrayDblDel($FileList)

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

    If $anzahl_array = UBound($FileList) Then
    $array_gesamt_liste = _ArrayCreate("")
    For $z = 0 to UBound($FileList)-1
    _ArrayInsert($array_gesamt_liste, $z, $dir & $FileList[$z])

    Next

    _ArrayDelete($array_gesamt_liste, UBound($FileList))
    ;~ _ArrayDisplay($array_gesamt_liste)
    Else
    Return $FileList
    EndIf

    EndFunc ;==>_makecopylist

    [/autoit]
    • Offizieller Beitrag
    Zitat

    _ArrayInsert($FileList, $j + $i, $tmpdir & $tmp[$j])
    _ArrayInsert($FileList, $j + $i, $tmpdir & ^ ERROR


    Bedeutet, dass $tmp kein Array ist (klar, wenn leerer Ordner). Da du es als Array ansprichst entsteht der Fehler.
    Also solche Situationen abfangen, indem du vorher prüfst ob die Variable ein Array ist:

    [autoit]

    If IsArray($tmp) Then
    _ArrayInsert($FileList, $j + $i, $tmpdir & $tmp[$j])
    Else
    ; Fehler setzen oder MsgBox
    EndIf

    [/autoit]
  • Habs geändert, immernoch der gleiche Fehler

    Spoiler anzeigen
    [autoit]

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

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

    ;Nummer des ersten zu kopierenden Ordners
    $start = 0

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

    ;Nummer des letzten zu kopierenden Ordners
    $ende = 0

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

    ;Nummer des letzten zu überspringenden Ordners
    $ende2 = 0

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

    ;~ Dim $dir[$ende+1]
    Dim $ordner[$ende+1]
    Dim $ausschliessen[$ende2+1]
    Dim $array_gesamt_liste, $anzahl, $anzahl_array, $array_gesamt, $anzahl_array2, $array_gesamt2, $array_gesamt_ok2, $anzahl2, $anzahl_gesamt, $merken_alt, $ziel, $ordner_Dateiname, $quelle, $zielordner, $dateiname
    Dim $Entscheidung
    Dim $Quell_Pf_[$ende+1][2] ; [n][0] = Pfad; [n][1] = gerundete Größe
    Dim $goend = 0

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

    ;Datumsoptionen
    $iWeekday = _DateToDayOfWeek(@YEAR, @MON, @MDAY)
    $sNewDate = _DateAdd('d', 0, _NowCalcDate())
    $sNewDate = StringReplace($sNewDate, "/", ".")

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

    ;~ ;Quell-Laufwerk
    $Quell_LW = "D:\"

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

    ;~ ;Quell-Ordner (ohne Laufwerksbuchstabe)
    $ordner[0] = "Video"

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

    ;~ ;Quell-Ordner zusammengesetzt
    $Quell_Pf_[0][0] = $Quell_LW & $ordner[0] & "\"

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

    ;~ ;Ziel-Laufwerk
    $Ziel_LW = "C:\"
    $Ziel_Pf = $Ziel_LW & "Sicherung Internet\" & $sNewDate & "\"

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

    ;folgende Ordner bei der Sicherung ausschließen
    $ausschliessen[0] = "D:\alt"

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

    _gesamt_array_erstellen()

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

    ;***********************************************************************
    ; Funktion komplettes Array mit allen zu kopierenden Dateien erstellen *
    ;***********************************************************************

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

    Func _gesamt_array_erstellen()
    ;~ _ArrayDisplay($array_gesamt_liste)

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

    ;leeres Array erstellen
    $array_gesamt = _ArrayCreate("")

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

    ;Dateien zum kopieren zusammentragen
    For $q = $start to $ende
    $anzahl = DirGetSize($Quell_Pf_[$q][0], 1)
    $anzahl_array = $anzahl[1]
    $ordner_aktuell = $Quell_Pf_[$q][0]
    _makecopylist($ordner_aktuell)
    $anzahl_gesamt += $anzahl_array

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

    ;die Dateien jedes zu kopierenden Ordners dem Gesamt-Array hinzufügen
    For $h = 0 to UBound($array_gesamt_liste)-1
    _ArrayAdd($array_gesamt, $array_gesamt_liste[$h])
    Next

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

    Next

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

    ;Die erste (leere) Linie des Gesamt-Array löschen
    _ArrayDelete($array_gesamt, 0)
    _ArrayDisplay($array_gesamt)

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

    EndFunc ;==>_gesamt_array_erstellen

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

    ;***********************************************************************
    ; Funktion einzelne Arrays mit allen zu kopierenden Dateien erstellen *
    ;***********************************************************************

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

    ;Funktion zum zusammentragen der Dateien
    Func _makecopylist($dir)
    $FileList = _FileListToArray($dir, "*", 0)
    If (Not IsArray($FileList)) And (@error = 1) Then SetError(-1)
    _ArrayDelete($FileList,0)

    $i = 0
    While ($i < UBound($FileList))
    If (FileGetAttrib($dir & '\' & $FileList[$i]) = "D") Then
    $tmp = _makecopylist($dir & '\' & $FileList[$i])
    $tmpdir = $FileList[$i] & '\'
    _ArrayDelete($FileList, $i)
    For $j = 0 To UBound($tmp) -1

    If IsArray($tmp) Then
    _ArrayInsert($FileList, $j + $i, $tmpdir & $tmp[$j])
    Else
    ; Fehler setzen oder MsgBox
    EndIf
    Next
    $i = $i + UBound($tmp) - 1
    EndIf
    $i=$i+1
    WEnd

    _ArrayDblDel($FileList)

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

    If $anzahl_array = UBound($FileList) Then
    $array_gesamt_liste = _ArrayCreate("")
    For $z = 0 to UBound($FileList)-1
    _ArrayInsert($array_gesamt_liste, $z, $dir & $FileList[$z])

    Next

    _ArrayDelete($array_gesamt_liste, UBound($FileList))
    ;~ _ArrayDisplay($array_gesamt_liste)
    Else
    Return $FileList
    EndIf

    EndFunc ;==>_makecopylist

    [/autoit]


    EDIT:
    so wie es aussieht hab ich eine andere Lösung gefunden:

    Hier meine Änderung in der while-Schleife

    Spoiler anzeigen
    [autoit]

    ...
    While ($i < UBound($FileList))
    If (FileGetAttrib($dir & '\' & $FileList[$i]) = "D") Then
    $tmp = _makecopylist($dir & '\' & $FileList[$i])
    $tmpdir = $FileList[$i] & '\'
    $dateien_anzahl = DirGetSize($dir & '\' & $FileList[$i], 1)
    $dateien_anzahl_array = $dateien_anzahl[1]
    _ArrayDelete($FileList, $i)
    If $dateien_anzahl_array > 0 Then
    For $j = 0 To UBound($tmp) -1
    _ArrayInsert($FileList, $j + $i, $tmpdir & $tmp[$j])
    Next
    EndIf
    $i = $i + UBound($tmp) - 1
    EndIf
    $i=$i+1
    WEnd
    ...

    [/autoit]

    Habe einfach abgefragt, ob der Ordner leer ist oder nicht :D