Ordner abgleichen und kopieren

  • 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

    [autoit]

    $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
    [autoit]


    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

    [/autoit]

    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
    [autoit]


    #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)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

    [/autoit]


    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 :love:

    Die Anna :*

    "Wo kämen wir hin, wenn jeder sagte wo kämen wir hin, und niemand ginge, um zu sehen, wohin wir kämen, wenn wir gingen..." :wacko:

    Einmal editiert, zuletzt von AnnaM (26. Juni 2012 um 11:14)

  • Ich könnte mir folgende Lösung vorstellen:
    1. Fülle array1 mit dateiname,datum, grösse vom quellordner
    2. Fülle array2 mit dateiname,datum vom zielordner
    3. durchlaufe array1 und vergleiche mit array2
    4. wenn datei aus array1 nicht in array2 vorhanden oder datum unterschiedlich,
    füge es zu array3 (dateiname, grösse) hinzu
    5. array3 ist jetzt die Liste der zu kopierenden Dateien.
    da kannst leicht die grössen aufaddieren und den fortschritt daraus berechnen
    6. array3 abarbeiten lassen, nach jeder Datei fortschritt aktualisieren

    Wer andern eine Bratwurst brät
    der hat ein Bratwurstbratgerät.

  • Vielleicht hilft Dir dies: _RobocopyBackup_WithProgress()

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Hallo Micha,

    ja, hat mir sehr geholfen. Danke

    Die Anna :*

    "Wo kämen wir hin, wenn jeder sagte wo kämen wir hin, und niemand ginge, um zu sehen, wohin wir kämen, wenn wir gingen..." :wacko: