überprüfen, ob Dateien erfolgreich kopiert wurden

  • Hallo!

    Ich arbeite gerade an einem Skript, das Dateien aus einem Quellverzeichnis in ein Work und zum Schluss in ein Zielverzeichnis kopiert. Die wichtigste Funktion in diesem Skript ist es, zu überprüfen, ob auch alle Dateien korrekt kopiert wurden (für den Fall, dass auf dem Weg etwas verloren ging).
    Jeder Schritt wird in einer Logdatei festgehalten.

    Die Funktion bekommt ein Array (mit FileFindNextFile erstellt) mit den Dateien aus dem Quellverzeichnis und dann vergleiche ich einzeln die Dateinamen mit denen im Zielverzeichnis. Weil beide "Listen" mit FileFindNextFile erstellt wurden, sollte die Reihenfolge passen.

    Beim Testen funktioniert es aber nicht so recht... Wenn ich eine Datei aus der Quelle oder dem Ziel lösche, erkennt die Funktion das nicht und schreibt weiterhin in das Log, dass die Datei korrekt kopiert wurde.

    Hier einmal die Funktion:

    Spoiler anzeigen
    [autoit]

    Func dateien_vergleichen(ByRef $liste, $zielpfad, $filter, $datum)
    Local $suchmuster, $naechste_datei, $zaehler, $fehler

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

    FileWriteLine($log, " ")
    FileWriteLine($log, "Überprüfen: ")

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

    $suchmuster = FileFindFirstFile($zielpfad & $filter)
    ; Sleep(20000)
    For $zaehler = 0 To UBound($liste) -1
    $naechste_datei = FileFindNextFile($suchmuster)
    if @error Then
    FileWriteLine($log, "Programmende! Zu wenige Dateien für die Überprüfung im Verzeichnis " & $zielpfad & " gefunden.")
    $fehler = FileOpen("O:\test\Log\Fehler.txt", 1)
    FileWriteLine($fehler, $datum)
    FileWriteLine($fehler, "Programmende! Zu wenige Dateien für die Überprüfung im Verzeichnis " & $zielpfad & " gefunden.")
    FileClose($fehler)
    FileClose($suchmuster)
    Exit
    EndIf
    If $naechste_datei = $liste[$zaehler] Then
    FileWriteLine($log, $liste[$zaehler] & " ist korrekt kopiert worden.")
    Else
    FileWriteLine($log, "Programmende! Die Dateinamen" & $liste[$zaehler] & " und " & $naechste_datei & " stimmen nicht überein!")
    $fehler = FileOpen("O:\test\Log\Fehler.txt", 1)
    FileWriteLine($fehler, $datum)
    FileWriteLine($fehler, "Programmende! Die Dateinamen" & $liste[$zaehler] & " und " & $naechste_datei & " stimmen nicht überein!")
    FileClose($fehler)
    FileClose($suchmuster)
    Exit
    EndIf
    Next
    FileClose($suchmuster)
    EndFunc

    [/autoit]

    Könnte das mit einem FileExits besser funktionieren? Oder hat jemand eine andere Idee? ?(

    Einmal editiert, zuletzt von kleine_ratte (29. Juni 2011 um 13:10)

  • Ich habe es mit etwas anders gelöst.
    Erstelle Array vom Quellordner , anschliessend vom Zielordner.
    Zum Schluß Arrays vergleichen.

    Gruß Dietmar

    Ich benötigte zusätzlich noch Produkt/Dateiversion Datum usw. deswegen war es etwas aufwendiger.
    aber vom Prinzip habe ich es wie oben genannt gelöst.

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Wo kommt die Liste denn her die du übergibst?
    Wird sie jedemal frisch erstellt, nachdem du eine Datei gelöscht hast? Wenn nicht, ist klar das deine Funktion alte Daten prüft.
    Eventuell könnte dir auch _ArraySort() weiterhelfen. (Allerdings wieder vorausgesetzt, deine Liste spiegelt den aktuellen Zustand auf deiner Platte wieder.)
    Was hältst du eigentlich von der Idee einer "Vorprüfung". Du könntest beispielsweise einen Hash von Quell und vom Zielornder erstellen und diesen vergleichen.
    Das wäre im Erfolgsfall wohl die schnellste und zuverlässigste Methode.
    Dann müsstest du deine Filelist nur neu erstellen, wenn die Prüfung nicht erfolgreich war.
    Für einen MD5 Hash habe ich folgende Links gefunden

    Spoiler anzeigen
  • Natürlich wird das Array mit den Dateinamen bei jedem durchgang neu erstellt. Sonst würde er ja beim ersten durchgang OK sagen und danach immer, dass es nicht klappt.
    Aber das Problem war ja, dass er immer gesagt hat, alles wurde korrekt kopiert, obwohl ich extra einen Fehler herbeigeführt habe.

    Ich habe es mit der Methode von Dietmar versucht. Jetzt klappt es: wenn vor der Array-Erstellung eine Datei verschwindet, zeigt er mir den richtigen Fehler an. So sollte das auch genügen, denke ich. Denn eigentlich tauchen die Kopierfehler nur vom Netzlaufwerk (Quelle) zum Workverzeichnis (Lokal) auf.

    Danke für die Hilfe! :)