Hallo Zusammen,
ich möchte gerne folgendes Problem lösen. Es sollen zwei Ordner synchronisiert werden.
Das heißt, ich will einen Ordner in den anderen kopieren, aber nur mit den Dateien, die neuer sind.
Bisher habe ich dieses mit dem Parameter D bei xcopy gemacht.
[autoit]Run('XCOPY "'& $srcDir & '" "' & $destDir & '" /D /S /E /V /C /H /R /O /Y /F /G',@TempDir,@SW_HIDE )
[/autoit]
Alles kein Problem. Da ich auch einen Prozentbalken haben wollte, habe ich in einer Schleife - solange xcopy läuft -
mit
$destSize = DirGetSize($destDir, 1)
[/autoit]
die bisherige Größe ausgegeben, umgerechnet und somit meinen Prozentbalken gefüllt und die bisher kopierte Dateigröße ausgegeben.
Doch nun wird zur Dateisicherung ein NAS benutzt. Zwar ist dieses im Gigabyte-Netzwerk eingebunden, doch immer noch ziemlich träge.
Auch wird ein Ordner mit mehreren 100GB übertragen (viele RAW-Dateien).
Hier das bisherige Script, ausgearbeitet auch in diesem Forum:
Spoiler anzeigen
Func CopyWithProgress($srcDir, $destDir) ;Original gigx und autoBert
Local $tsBeginn = _NowCalc(), $tsDiff =-1, $tsRest ;eingefügt für Restdauer
If StringRight($srcDir, 1) = "\" Then $srcDir = StringLeft($srcDir, StringLen($srcDir) - 1)
If StringRight($destDir, 1) <> "\" Then $destDir = $destDir & "\"
If Not FileExists($destDir) Then DirCreate($destDir)
$srcSize = DirGetSize($srcDir, 1)
$1_percent = $srcSize[0] / 100
Run('XCOPY "'& $srcDir & '" "' & $destDir & '" /D /S /E /V /C /H /R /O /Y /F /G',@TempDir,@SW_HIDE )
ProgressOn("Advanced status of file copying", "", "",10,10)
Do
if $tsDiff < 0 Then Sleep(5000)
$destSize = DirGetSize($destDir, 1)
$tsDiff = _DateDiff("s",$tsBeginn,_NowCalc())
$tsRest = round($tsDiff / ($destSize[0] / $1_percent) * 100,0) - $tsDiff
ConsoleWrite($tsDiff & " " & $1_percent & " " & $tsRest &@CRLF)
ProgressSet(Round($destSize[0] / $1_percent, 2), Round($destSize[0] / (1024 * 1024), 2) & " MB of " & Round($srcSize[0] / (1024 * 1024), 2)& " MB copied" & @CRLF _
& $destSize[1] & " of " & $srcSize[1] & " Files copied." & @CRLF _
& $destSize[2] & " of " & $srcSize[2] & " Folders copied.", Round($destSize[0] / $1_percent, 2) & "% - Done! " & $tsRest & " sec. Rest")
Sleep($tsDiff)
Until $destSize[0] >= $srcSize[0]
MsgBox(0,"Fertig in " & $tsDiff & " sec.",Round($destSize[0] / (1024 * 1024), 2) & " MB of " & Round($srcSize[0] / (1024 * 1024), 2)& " MB copied" & @CRLF _
& $destSize[1] & " of " & $srcSize[1] & " Files copied." & @CRLF _
& $destSize[2] & " of " & $srcSize[2] & " Folders copied." & @CRLF & Round($destSize[0] / $1_percent, 2) & "% - Done! ")
ProgressOff()
EndFunc
Nun kann sich jeder denken, was passiert, wenn man einen solch großen Ordner ständig nach der Größe fragt und das noch über das Netzwerk.
Da wird die Netzlast schnell zu groß und das Backup dauert ca 6h. Wenn ich es so per Hand verschiebe, ist es nach einer Stunde getan.
Auch wäre es wünschenswert die gerade kopierte Datei anzuzeigen.
Also meine neue GUI sollte ungefähr so aussehen:
Spoiler anzeigen
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 288, 156, 192, 124)
$Group2 = GUICtrlCreateGroup("Fortschritt", 8, 8, 265, 129)
$Label1 = GUICtrlCreateLabel("Aktuell:", 24, 40, 39, 17)
$Progress1 = GUICtrlCreateProgress(72, 40, 190, 17)
$Input1 = GUICtrlCreateInput("Input1", 72, 64, 193, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_READONLY))
$Label3 = GUICtrlCreateLabel("Datei:", 24, 64, 32, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Label2 = GUICtrlCreateLabel("Gesamt:", 24, 96, 43, 17)
$Progress2 = GUICtrlCreateProgress(72, 96, 190, 17)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Ich habe überlegt, mit FileCopy zu arbeiten, aber weiß nicht, wie ich mit den Änderungen einer Datei umgehen kann.
Man könnte höchstens mit FileGetTime immer die Datei prüfen, die gerade dran kommt und beide Ordner mit einander vergleichen.
Hat jemand zu später Stunde noch eine Idee, wie man hochperformant auf ein NAS Ordner abgleicht?
Ich habe es schon sogar mit Robocopy versucht, doch auch hier ist es schwierig einen Kopierstatus hinzubekommen.
Vielen Dank erst einmal für jede Hilfe.
Lieben Gruß, Anna