Sicherungstool - dauert zu lange

  • Hi,
    ich habe ein Tool geschrieben, welches
    einelne Dateien oder ganze Laufwerke sichert.

    Dabei werden u. a. die alten Dateien im Zielordner gelöscht.

    Jedoch braucht das Script sehr lange mit dem erstellen des Arrays, wenn es viele Dateien (>2000) sind.
    Dann bricht das Script auch noch ab, weil das Array nicht erstellt werden konnte.

    Außerdem gibts Probleme, wenn Ordner versteckt sind

    Vielleicht kann man das Script auch einfacher schreiben.
    Vielleicht kanns einer von euch brauchen und kann mal drüberschauen

    Spoiler anzeigen
    [autoit]

    ;----------------------------------------------------------------
    ;Durch dieses Script können Dateien und Ordner gesichert werden
    ; - Ziellaufwerk vorhanden?
    ; - Quellverzeichnisse vorhanden?
    ; - genügend freier Speicher auf dem Ziellaufwerk?
    ; - Es wird ein Kopierfenster mit jeder einzelnen Datei eingeblendet
    ; Dort sieht man den prozentualen Vorschritt
    ; Dort sieht man deie Übertragunsgeschwindigkeit
    ; Dort sieht man die aktuell kopierte Datei
    ; - Es kann für einzelne Dateien oder komplette Laufwerke verwendet werden
    ; - Das Script kann mit Alt+x abgebrochen werden
    ;----------------------------------------------------------------

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

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

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

    ;Tastenkombination um das Programm zu beenden (Alt+x)
    HotKeySet("!x", "_beenden")

    [/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 $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, $anzahl_auslassen_gesamt, $anzahl_unterm_strich, $dateigroesse, $dateigroesse_summe, $time_summe, $time_ende
    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]

    ;folgende Ordner bei der Sicherung ausschließen
    $ausschliessen[0] = "V:\_Programme" ; z. B. "D:\alt"
    ;~ $ausschliessen[1] = "V:\__Tipps" ; z. B. "D:\alt"
    ;~ $ausschliessen[2] = "V:\_Vista Tipps" ; z. B. "D:\alt"

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

    ;**************************** Einzelne Ordner kopieren ********************************************************************

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

    ;Quell-Laufwerk
    ;~ $Quell_LW = "D:\" ;entweder direkte Eingabe des Laufwerksbuchstaben z. B. "E:\" oder Für Laufwerk auf dem sich das Script befindet: StringLeft(@ScriptDir, 3)

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

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

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

    ;~ ;Quell-Ordner zusammengesetzt
    ;~ $Quell_Pf_[0][0] = $Quell_LW & $ordner[0] & "\"; < < < < < < < < < < < < < < < < < < ändern > > > > > > > > > > > > > > > > > > >
    ;~ $Quell_Pf_[1][0] = $Quell_LW & $ordner[1] & "\"; < < < < < < < < < < < < < < < < < < ändern > > > > > > > > > > > > > > > > > > >

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

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

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

    ;***************************************************************************************************************************

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

    ;**************************** komplettes Laufwerk kopieren ********************************************************************

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

    ;Quellpfade anpassen
    $Quell_LW = "V:\" ;StringLeft(@ScriptDir, 3) ;entweder direkte Eingabe des Laufwerksbuchstaben z. B. "E:\" oder Für Laufwerk auf dem sich das Script befindet: StringLeft(@ScriptDir, 3) < < < < < < < < < < < < < < < < < < ändern > > > > > > > > > > > > > > > > > > >
    $Quell_Pf_[0][0] = $Quell_LW

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

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

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

    ;Zielpfade anpassen
    $Ziel_LW = "C:\"
    $Ziel_Pf = $Ziel_LW & "TEST\USB-Stick" & "\"

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

    ;***************************************************************************************************************************

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

    ;alles starten
    _check()

    [/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()

    ;Alle Hauptordner sichtbar machen ("versteckt" deaktivieren)

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

    ;~ For $z = 0 to $ende
    ;~ FileSetAttrib($Quell_Pf_[$z][0] & "*", "-H")
    ;~ Next

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

    ;Prüfung, ob das Quell-Array erstellt werden konnte
    If IsArray($array_gesamt_liste) Then
    Else
    MsgBox(16,"Fehler beim erstellen des Quell-Arrays", "Das Array für die Dateien im Quellordner konnte nicht erstellt werden." & @Cr & "Eine Ursache kann zum Beispiel ein versteckter Ordner sein.")
    Exit
    EndIf

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

    ;die Dateien jedes zu kopierenden Ordners dem Gesamt-Array hinzufügen
    For $h = $start to UBound($array_gesamt_liste)-1
    If $array_gesamt_liste[$h] = $Quell_Pf_[$q][0] & "Recycled" Then ; wenn das Wort "Recycled" (Papierkorb) erscheint, dies nicht in das Array eintragen
    Else
    _ArrayAdd($array_gesamt, $array_gesamt_liste[$h])
    EndIf
    Next

    ;Anzahl der zu kopierenden Dateien (ohne die ausgelassenen Ordner)
    For $f = $start to $ende2
    If FileExists($ausschliessen[$f]) Then
    $anzahl_auslassen = DirGetSize($ausschliessen[$f], 1)
    $anzahl_auslassen_array = $anzahl_auslassen[1]
    Else
    $anzahl_auslassen_array = 0
    EndIf
    $anzahl_auslassen_gesamt += $anzahl_auslassen_array
    Next

    If $Entscheidung = 1 Then
    $verrechnen = 1 ;da im Papierkorb 2 Dateien drinn sind und der Papierkorb selbst als Datei gesehen wird (also 2-1=1)
    Else
    $verrechnen = 0 ;keine Beeinflussung
    EndIf
    $anzahl_unterm_strich = $anzahl_gesamt - $anzahl_auslassen_gesamt - $verrechnen

    [/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)

    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] & '\'
    $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

    _ArrayDblDel($FileList)

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

    If $Entscheidung = 1 Then
    $zahl_addieren = 1
    ElseIf $Entscheidung = 0 Then
    $zahl_addieren = 0
    EndIf
    ;~ ConsoleWrite($anzahl_array & " " & UBound($FileList)+$zahl_addieren & @Lf)
    If $anzahl_array = (UBound($FileList)+$zahl_addieren) 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))
    Else
    Return $FileList
    EndIf
    EndFunc ;==>_makecopylist

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

    ;************************************
    ; Funktion zum kopieren der Dateien *
    ;************************************

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

    ;Funktion zum kopieren
    Func _kopieren()
    $speed = 0
    Local $i
    Local $count = 0

    ;Fortschritts-Anzeige einblenden
    ProgressOn("Bitte warten - Die Dateien werden in den Zielordner kopiert", "Dateien :", "0 Dateien", -1, 300, 16)

    ;Für jedes Element des Gesamt-Array ...
    For $i = 0 to UBound($array_gesamt) -1

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

    ;Zielordner der einzelnen Dateien festlegen ...
    For $m = $start to $ende
    If StringInStr($array_gesamt[$i], $Quell_Pf_[$m][0]) Then
    $ordner_Dateiname = StringReplace($array_gesamt[$i], $Quell_Pf_[$m][0], $ordner[$m] & "\")
    $dateiname = StringRight($array_gesamt[$i], StringLen($array_gesamt[$i]) - StringInStr($array_gesamt[$i], "\", 0, -1))
    $quelle = $Quell_Pf_[$m][0]
    $ziel = $Ziel_Pf & $ordner_Dateiname
    $zielordner = $Ziel_Pf & $ordner[$m]
    EndIf
    Next

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

    ;Für jeden zu überspringenden Ordner ...
    For $h = $start to $ende2
    If StringinStr($array_gesamt[$i], $ausschliessen[$h]) Then ;Ordner überspringen
    Else ;Dateien kopieren
    $fromCrc = FileGetAttrib($array_gesamt[$i]) & FileGetSize($array_gesamt[$i]) & FileGetTime($array_gesamt[$i]) ;Eigenschaften Quell-Dateien
    $toCrc = FileGetAttrib($ziel) & FileGetSize($ziel) & FileGetTime($ziel) ;Eigenschaften Ziel-Dateien

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

    $count += 1

    ProgressSet($count * 100 / $anzahl_unterm_strich, _
    "Quelle: " & $quelle & @LF & "Ziel: " & $zielordner & @LF & $dateiname, _
    Round(($count * 100 / $anzahl_unterm_strich), 0) & " % " & @TAB & $count & " von " & $anzahl_unterm_strich & " fertig" & @TAB & $speed & " MB/s")

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

    If Fileexists($Ziel) And ($fromCrc = $toCrc) Then ;nicht kopieren
    Else ;kopieren
    FileSetAttrib($Ziel_Pf & $ordner_Dateiname, "-R") ;Schreibschutz entfernen

    ;Dateigröße und benötigte Zeit ermitteln
    $dateigroesse = Round(FileGetSize($array_gesamt[$i]) / 1024 / 1024, 0)
    $dateigroesse_summe += $dateigroesse
    $time_start = TimerInit()

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

    ;kopieren
    FileCopy($array_gesamt[$i], $Ziel_Pf & $ordner_Dateiname, 9)

    ;benötigte Zeit ermitteln
    $time_ende = TimerDiff($time_start) / 1000
    $time_summe += $time_ende
    $speed = Round($dateigroesse_summe / $time_summe, 1)
    EndIf
    EndIf
    Next
    Next

    ;Fortschritts-Anzeige beenden
    ProgressSet(100, "fertig", "alles kopiert")
    Sleep(500)
    ProgressOff()

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

    EndFunc ;==>_kopieren

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

    ;****************************************************************
    ; Funktion komplettes Array mit Dateien im Zielordner erstellen *
    ;****************************************************************

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

    Func _gesamt_array_erstellen2()

    ;existiert der Zielordner?
    If NOT FileExists($Ziel_Pf) Then
    MsgBox(16,"Zielordner existiert nicht", "Eventuell trat während dem Kopieren ein Fehler auf")
    Exit
    EndIf

    ;notwendig, da sonst eine Fehlermeldung erscheint
    _FileCreate($Ziel_Pf & "wird gleich wieder gelöscht.txt")

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

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

    ;Dateien zum kopieren zusammentragen
    $anzahl2 = DirGetSize($Ziel_Pf, 1)
    $anzahl_array2 = $anzahl2[1]
    $merken_alt = 0

    _makecopylist2($Ziel_Pf)

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

    ;Prüfung, ob das Ziel-Array erstellt werden konnte
    If IsArray($array_gesamt_ok2) Then
    Else
    MsgBox(16,"Fehler beim erstellen des Quell-Arrays", "Das Array für die Dateien im Quellordner konnte nicht erstellt werden.")
    Exit
    EndIf

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

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

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

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

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

    EndFunc ;==>_gesamt_array_erstellen

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

    ;**********************************************************************
    ; Funktion einzelne Arrays mit allen Dateien im Zielordner erstellen *
    ;**********************************************************************

    ;Funktion zum zusammentragen der Dateien
    Func _makecopylist2($dir2)
    $FileList2 = _FileListToArray($dir2, "*", 0)
    If (Not IsArray($FileList2)) And (@error = 1) Then SetError(-1)
    _ArrayDelete($FileList2,0)
    $v = 0
    While ($v < UBound($FileList2))
    If FileGetAttrib($dir2 & '\' & $FileList2[$v]) = "D" Then
    $tmp2 = _makecopylist2($dir2 & '\' & $FileList2[$v])
    $tmpdir2 = $FileList2[$v] &'\'
    $dateien_anzahl2 = DirGetSize($dir2 & '\' & $FileList2[$v], 1)
    $dateien_anzahl_array2 = $dateien_anzahl2[1]

    _ArrayDelete($FileList2, $v)

    If $dateien_anzahl_array2 > 0 Then
    For $h = 0 To UBound($tmp2) - 1
    _ArrayInsert($FileList2, $h + $v, $tmpdir2 & $tmp2[$h])
    Next
    EndIf
    $v = $v + UBound($tmp2) - 1
    EndIf
    $v=$v+1
    WEnd

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

    _ArrayDblDel($FileList2)

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

    $merken = UBound($FileList2)
    If $merken > $merken_alt Then
    $merken_alt = $merken
    Endif
    If $anzahl_array2 <= $merken_alt Then
    $array_gesamt_ok2 = _ArrayCreate("")
    For $o = 0 to UBound($FileList2)-1
    _ArrayInsert($array_gesamt_ok2, $o, $dir2 & $FileList2[$o])
    Next
    _ArrayDelete($array_gesamt_ok2, UBound($FileList2))
    ;~ _ArrayDisplay($array_gesamt_ok2)
    Else
    Return $FileList2
    EndIf

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

    EndFunc ;==>_makecopylist

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

    ;*******************************************************************************
    ; Funktion vergleichen ob die Datei in der Quelle existiert und evtl. löschen *
    ;*******************************************************************************

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

    Func _vergleichen()
    ;~ _ArrayDisplay($array_gesamt)
    ;~ _ArrayDisplay($array_gesamt2)

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

    For $u = 0 to UBound($array_gesamt2)-1
    $ordner_dateiname_loeschen = StringReplace($array_gesamt2[$u], $Ziel_Pf, "")
    $ordner_loeschen = StringLeft($array_gesamt2[$u], StringInStr($array_gesamt2[$u], "\", 0, -1))
    $search = _ArraySearch($array_gesamt, $ordner_dateiname_loeschen, 0, 0, 0, 1)

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

    If $search = "-1" Then
    FileDelete($array_gesamt2[$u])
    $dir_loe = DirGetSize($ordner_loeschen, 1)
    $dir_loeschen = $dir_loe[1]
    If $dir_loeschen = 0 Then
    DirRemove($ordner_loeschen, 1)
    EndIf
    EndIf
    Next
    EndFunc

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

    ;---------------------------------------------------------
    ; Funktionen Datensicherung Internet | <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    ;---------------------------------------------------------

    Func _check()
    ;Prüfung, ob es sich um ein zu sicherndes Laufwerk (3) handelt, oder um mehrere Ordner (größer 3)
    If StringLen($Quell_Pf_[0][0]) = 3 Then
    $Entscheidung = 1
    $Pruefung = $Ziel_Pf & $sNewDate
    Else
    $Entscheidung = 0
    $Pruefung = $Ziel_Pf
    EndIf

    ;Prüfung Ziellaufwerk vorhanden?
    If FileExists($Ziel_LW) Then ;Prüfung Quellverzeichnisse vorhanden?
    $tmp = 0
    For $i = $start to $ende
    If Not FileExists($Quell_Pf_[$i][0]) Then ;Fenster Quellordner fehlt
    MsgBox(16, "Quellordner fehlt", "Der Ordner " & $Quell_Pf_[$i][0] & " existiert nicht. Bitte kontrollieren")
    $goend = 1
    Else ;Speicherplatz ermitteln und runden
    $Quell_Pf_[$i][1] = Round((DirGetSize($Quell_Pf_[$i][0])/1024 / 1024), 0)
    $tmp +=($Quell_Pf_[$i][1]) ;Größe zusammenrechnen
    EndIf
    Next

    If $goend = 1 Then Exit ;Quellordner fehlt, dann Script beenden
    $Ziel_LW_Gr_Ru = Round(DriveSpaceFree($Ziel_LW), 0)

    ;Funktion Größenvergleich der Quellverzeichnisse mit dem Ziellaufwerk
    If $tmp > $Ziel_LW_Gr_Ru Then ;Fenster zu wenig Speicherplatz
    Msgbox(16,"Zu wenig Speicherplatz vorhanden","Geben Sie mindestens " & $tmp - $Ziel_LW_Gr_Ru & " MB Speicherplatz auf " & $Ziel_LW & " frei")
    Exit
    Else;Alles OK, Datensicherung beginnt
    _gesamt_array_erstellen()
    _kopieren()
    _gesamt_array_erstellen2()
    _vergleichen()
    EndIf
    Else ;Fenster Ziellaufwerk fehlt
    $ret = MsgBox(5 + 64, "Datensicherung Internet", "Ziellaufwerk " & $Ziel_LW & " nicht vorhanden")
    If $ret = 4 Then ;Wiederholen wurde ausgewählt, Funktion startet von vorne
    _check()
    Else ;Abbrechen wurde ausgewählt, dann Script beenden
    EndIf
    EndIf

    ;Zielverzeichnis umbenennen in das aktuelle Datum (nur wenn ein komplettes Laufwerk gesichert wird)
    If $Entscheidung = 1 Then
    DirMove($Ziel_Pf & DriveGetLabel(StringLeft($Quell_LW, 2)) & " (" & StringLeft($Quell_LW, 1) & ")", $Ziel_Pf & $sNewDate, 1)
    Else
    EndIf

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

    EndFunc ;==>_check

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

    ;Beim Drücken von Alt+x wird das Programm beendet
    Func _beenden()
    Exit
    EndFunc ;==>_beenden

    [/autoit]
  • was meinst du damit ? das backup tool überschreibt immer dateien wenn es eine neuere datei gibt ?

  • Ein Beispiel
    Heute erstelle ich eine Sicherung mache.
    Morgen lösche ich eine Datei in der Quelle.
    Übermorgen mache ich wieder eine Sicherung.
    Dann bliebe ja die gelöschte Datei in der Sicherung erhalten.

    Dies ist aber nicht sinnvoll, da ja dann irgendwann die Sicherung mit uralten Dateien zugemüllt ist :tongue:

    • Offizieller Beitrag

    Hallo,

    vllt. hilft dir ja der Beitrag Incremental Backup ....

  • hm, also wenn ich dies so langsam richtig sehe, ist es fast besser ein separates Tool zum sichern zu verwenden, als es mit AutoIt zu erledigen :weinen:

  • wow, nicht schlecht das Teil, danke

    + Ordner sichern und dabei eine Datei/Ordner die nur im Ziel existiert und nicht in der Quelle kann gelöscht werden :rock:
    + Es kann ein Ordner mit dem aktuellen Datum erstellt werden :rock:
    + Es gibt eine Version, die nicht installiert werden muß :rock:

    - Hässliche Oberfläche :irre:

  • Oder mit meiner quick Copy Funktion :D
    Übers Command, ist also viel schneller :D

    beschreibung am anfang is copyright muahhahahaha^^

    Spoiler anzeigen
    [autoit]


    #include <Process.au3>

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

    #comments-start
    ; Quickcopy von Huggy
    ; Erlaubt schnelles kopieren durch Command
    ; Einzigartige Technologie dank GtaSpider super-Runwait
    ; Extreme geschwindigkeiten von bis zu 20 gb / sekunde :O
    ; Supertolle Lachgaszufuhr für hyperbeschleunigung!
    ; Anwendung ZB:
    $start = "C:\Dokumente und Einstellungen\Schlumpfi\Desktop\AutoIt3-Decompiler.txt"
    $ziel = "C:\Dokumente und Einstellungen\Schlumpfi\Desktop\AutoIt3-Decompiler22222.txt"
    $overwrite = 1
    ;syntax: _quickcopy($start, $ziel, $overwrite)

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

    #comments-end
    Func _quickcopy($start, $ziel, $overwrite)
    If NOT FileExists($start) Then
    SetError(1,0,0)
    EndIf
    IF $overwrite = 1 Then
    _RunWait('cmd.exe /c copy "' & $start & ' ' & $ziel & " /Y" )
    Else
    _RunWait('cmd.exe /c copy "' & $start &' ' & $ziel)
    EndIf
    EndFunc
    ; _RunWait von GtaSpider
    Func _RunWait($sFilename,$sWorkingdir="",$sFlag="",$iIOFlag="",$iTimeOut=0)
    Local $pid = Run($sFilename,$sWorkingdir,$sFlag,$iIOFlag)
    If $iTimeOut Then $timer = TimerInit()
    While ProcessExists($pid)
    Sleep(50)
    If $iTimeOut Then
    If TimerDiff($timer) >= $iTimeOut Then ExitLoop
    EndIf
    WEnd
    If ProcessExists($pid) Then
    ProcessClose($pid)
    If StderrRead($pid) <> "" Then Return SetError(2,0,StderrRead($pid))
    Return SetError(3,0,StdoutRead($pid))
    EndIf
    If StderrRead($pid) <> "" Then Return SetError(1,0,StderrRead($pid))
    Return StdoutRead($pid)
    EndFunc

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

    mfg

  • Hi,
    sieht gut aus :D
    Aber Verzeichnisse kann ich dadurch nicht kopieren, oder? :tongue:

  • Hi Leute

    wie wärs mit Robocopy vom M$ ??

    also Ich mache in meinen scripts das Backup damit. man kann Files/Dirs auschließen usw. es gibt eine ausführliche DOC (leider nur in englisch)

    mein Save Script:

    Spoiler anzeigen
    [autoit]


    ......................................
    RunWait(@ScriptDir & '\ROBOCOPY.EXE "' & $JACDAT & '" "' _
    & $root & '\Save_NACH_Rebuild" *.* /V /X /TS /FP /ZB /COPY:DAT /E /PURGE /R:10 /W:30 /XF *old.* *.bak *.old *-VaAbr*.* *.Html *.txt /XD ' _
    & $JACDAT & '\Belegarchiv ' & $JACDAT & '\Jackold ' & $JACDAT & '\OEVB_Schnittstelle ' _
    & $JACDAT & '\Save_NACH_Rebuild /NP /TEE /LOG:' & $root & '\log\Save_nach_rebuild.log ', @ScriptDir)
    .......................................

    [/autoit]

    daher hab ichs :)

    http://www.msu-hb.de/system/system/robocopy.htm

    lg

  • Zitat

    Jedoch braucht das Script sehr lange mit dem erstellen des Arrays, wenn es viele Dateien (>2000) sind.

    Das Problem ist die Funktion _ArrayAdd().
    Diese initialisiert das komplette Array neu wenn ein Eintrag hinzu kommt.
    Das dauert dann umso länger je größer das Array ist.
    Normalerweise würde man soetwas über Listen umgehen da dort die Werte im Speicher nicht hintereinander stehen müssen und das ganze damit deutlich dynamischer aufgebaut ist.
    Listen sind in AutoIt aber leider nur über >>Net.Framework-Objekte<< möglich.

    Wenn man diesen Aufwand nicht betreiben will bietet sich als Alternativlösung an das Ausgangsarray schon ausreichend groß zu initialiseren und erst am Ende mit ReDim auf die richtige Größe festzusetzen (ist aber auch nicht wirklich saubere und ressourcenfreundliche Programmierung).

    Einen Vergleich dieser Varianten hatte ich mal >>hier<< gepostet.

  • TOMTOM25m
    oh englisch, nicht so mein Ding, deshalb lieber nicht :tongue:

    AspirinJunkie
    hm, hätte nicht gedacht, dass es so kompliziert wird, das ganze


    Werde wohl in Zukunft dem Tipp von ExBerliner folgen und TrayBackup verwenden :D