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
;----------------------------------------------------------------
;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
;----------------------------------------------------------------
#include<Date.au3>
#include<Array.au3>
#include<File.au3>
#include<_ArrayDblDel.au3>
;Tastenkombination um das Programm zu beenden (Alt+x)
HotKeySet("!x", "_beenden")
;Nummer des ersten zu kopierenden Ordners
$start = 0
;Nummer des letzten zu kopierenden Ordners
$ende = 0
;Nummer des letzten zu überspringenden Ordners
$ende2 = 0
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
;Datumsoptionen
$iWeekday = _DateToDayOfWeek(@YEAR, @MON, @MDAY)
$sNewDate = _DateAdd('d', 0, _NowCalcDate())
$sNewDate = StringReplace($sNewDate, "/", ".")
;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"
;**************************** 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)
;~ ;Quell-Ordner (ohne Laufwerksbuchstabe)
;~ $ordner[0] = "Video"
;~ $ordner[1] = "Icons"
;~ ;Quell-Ordner zusammengesetzt
;~ $Quell_Pf_[0][0] = $Quell_LW & $ordner[0] & "\"; < < < < < < < < < < < < < < < < < < ändern > > > > > > > > > > > > > > > > > > >
;~ $Quell_Pf_[1][0] = $Quell_LW & $ordner[1] & "\"; < < < < < < < < < < < < < < < < < < ändern > > > > > > > > > > > > > > > > > > >
;~ ;Ziel-Laufwerk
;~ $Ziel_LW = "C:\"
;~ $Ziel_Pf = $Ziel_LW & "Sicherung Internet\" & $sNewDate & "\"
;***************************************************************************************************************************
[/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
;Quell-Ordner (ohne Laufwerksbuchstabe)
$ordner[0] = ""
;Zielpfade anpassen
$Ziel_LW = "C:\"
$Ziel_Pf = $Ziel_LW & "TEST\USB-Stick" & "\"
;***************************************************************************************************************************
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit];alles starten
_check()
;***********************************************************************
; Funktion komplettes Array mit allen zu kopierenden Dateien erstellen *
;***********************************************************************
Func _gesamt_array_erstellen()
;Alle Hauptordner sichtbar machen ("versteckt" deaktivieren)
;~ For $z = 0 to $ende
;~ FileSetAttrib($Quell_Pf_[$z][0] & "*", "-H")
;~ Next
;leeres Array erstellen
$array_gesamt = _ArrayCreate("")
;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
;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
;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
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
;***********************************************************************
; Funktion einzelne Arrays mit allen zu kopierenden Dateien erstellen *
;***********************************************************************
;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)
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
;************************************
; Funktion zum kopieren der Dateien *
;************************************
;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
;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
;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
$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")
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()
;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()
EndFunc ;==>_kopieren
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit];****************************************************************
; Funktion komplettes Array mit Dateien im Zielordner erstellen *
;****************************************************************
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("")
;Dateien zum kopieren zusammentragen
$anzahl2 = DirGetSize($Ziel_Pf, 1)
$anzahl_array2 = $anzahl2[1]
$merken_alt = 0
_makecopylist2($Ziel_Pf)
;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
;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
;Die erste (leere) Linie des Gesamt-Array löschen
_ArrayDelete($array_gesamt2, 0)
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
_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
EndFunc ;==>_makecopylist
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit];*******************************************************************************
; Funktion vergleichen ob die Datei in der Quelle existiert und evtl. löschen *
;*******************************************************************************
Func _vergleichen()
;~ _ArrayDisplay($array_gesamt)
;~ _ArrayDisplay($array_gesamt2)
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)
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
;---------------------------------------------------------
; 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
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