Dateien auf Änderungen scannen

  • Ich habe ein Backupscript geschrieben, welches auf einer MD5-Differenz beruht. Vielleicht kann man es für Deine Zwecke anpassen.
    Hier das Script:

    Spoiler anzeigen
    [autoit]

    $fehler = FALSE
    $logfile = "MD5Backup.log"

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

    If _MD5Backup("C:\Benutzerdaten","\\Backupdrive\Folder","Benutzerdaten.db") = FALSE then $fehler = TRUE
    ; ggf weitere Backupaufträge

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

    If $fehler = FALSE Then
    Msgbox(0,"","Backup wurde erfolgreich durchgeführt !" & @CRLF & @CRLF & "Ereignisse können im Log '" & $logfile & "' nachgelesen werden.")
    Else
    Msgbox(0,"","Backup wurde mit Fehlern abgeschlossen !" & @CRLF & @CRLF & "Diese Fehler können im Log '" & $logfile & "' nachgelesen werden.")
    EndIf

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

    Func _MD5Backup($quelle,$ziel,$dbname)
    $dbneu = ""
    $dbinhalt = ""
    $return = TRUE
    GLOBAL $dll
    If FileExists($quelle) Then
    $dll = DllOpen("hashes.dll")
    If FileGetSize($logfile) > 0 Then FileWriteLine($logfile,@CRLF & "**********" & @CRLF)
    FileWriteLine($logfile,"Start des Backup von '" & $quelle & "' nach '" & $ziel & "' am " & @MDAY & "." & @MON & "." & @YEAR & " um " & @HOUR & ":" & @MIN & ":" & @SEC)
    If FileExists($dbname) then
    FileWriteLine($logfile,"Quelle wird auf gelöschte/veränderte Ordner/Dateien geprüft")
    $dbinhalt = FileRead($dbname)
    $dbzeilen = StringSplit($dbinhalt,@CRLF,1)
    For $i = 1 to $dbzeilen[0]
    $hashalt = StringLeft($dbzeilen[$i],StringInStr($dbzeilen[$i],",")-1)
    $name = StringMid($dbzeilen[$i],StringInStr($dbzeilen[$i],",")+1)
    If Not FileExists($quelle & $name) Then
    ; Datei oder Ordner existiert nicht mehr, wird im Ziel und in der DB gelöscht
    If $hashalt = "Verzeichnis---------------------" Then
    If FileExists($ziel & $name) Then
    If DirRemove($ziel & $name,1) = 0 Then
    FileWriteLine($logfile,"Fehler beim Löschen des Ordners '" & $ziel & $name & "'")
    $dbneu &= $hashalt & " " & $name & @CRLF
    $return = FALSE
    Else
    FileWriteLine($logfile,"Gelöscht : " & $ziel & $name)
    EndIf
    Else
    FileWriteLine($logfile,"DB bereinigt von : " & $name)
    EndIf
    Else
    If FileExists($ziel & $name) Then
    If FileDelete($ziel & $name) = 0 Then
    FileWriteLine($logfile,"Fehler beim Entfernen der Datei '" & $ziel & $name & "'")
    $dbneu &= $hashalt & " " & $name & @CRLF
    $return = FALSE
    Else
    FileWriteLine($logfile,"Gelöscht : " & $ziel & $name)
    EndIf
    Else
    FileWriteLine($logfile,"DB korr. : " & $name)
    EndIf
    EndIf
    Else
    ; Datei oder Ordner existiert noch
    If $hashalt = "Verzeichnis---------------------" Then
    ; ist ein Ordner, also nur in der DB behalten, nicht vergleichen
    $dbneu &= $hashalt & "," & $name & @CRLF
    Else
    ; ist eine Datei, aktuellen Hash ermitteln
    If FileGetSize($quelle & $name) = 0 Then
    ; der Hash einer 0-Byte-Datei kann nicht berechnet werden
    $hashneu = "groesseNull---------------------"
    Else
    $hasharray = DllCall($dll,"str","testit","str",$quelle & $name,"str","MD5","int",false)
    $hashneu = StringLeft($hasharray[0],StringInStr($hasharray[0],@CRLF)-1)
    EndIf
    If $hashneu <> $hashalt Then
    ; Datei hat sich veraendert
    FileWriteLine($logfile,"Verändert: " & $name)
    If FileCopy($quelle & $name,$ziel & $name,1) = 0 Then
    FileWriteLine($logfile,"Fehler beim Kopierem der Datei '" & $quelle & $name & "'")
    $dbneu &= $hashalt & "," & $name & @CRLF
    $return = FALSE
    Else
    $dbneu &= $hashneu & "," & $name & @CRLF
    EndIf
    Else
    ; Datei ist unveraendert und verbleibt in der DB
    $dbneu &= $hashalt & "," & $name & @CRLF
    EndIf
    EndIf
    EndIf
    Sleep(10)
    Next
    EndIf
    ; Quelle wird gescannt um neue Dateien zu finden oder
    ; eine fehlende Datenbank neu aufzubauen
    FileWriteLine($logfile,"Quelle wird auf neue Ordner/Dateien geprüft")
    $quelle_neu = _GetFolderMD5($quelle,"","*.*")
    If FileExists($ziel) Then
    ; es wird geprüft ob in der Quelle neue Dateien zu finden sind,
    ; die in der alten (aktuellen) DB nicht vorhanden sind
    $quelldateien = StringSplit($quelle_neu,@CRLF,1)
    $dbaktuell = $dbneu
    For $i = 1 to $quelldateien[0]
    $hashneu = StringLeft($quelldateien[$i],StringInStr($quelldateien[$i],",")-1)
    $name = StringMid($quelldateien[$i],StringInStr($quelldateien[$i],",")+1)
    $dbaktuell = StringReplace($dbaktuell,$hashneu & "," & $name & @CRLF,"",1,2)
    If @extended <> 1 Then
    FileWriteLine($logfile,"Neu : " & $name)
    If $hashneu = "Verzeichnis---------------------" Then
    If DirCreate($ziel & $name) = 0 Then
    FileWriteLine($logfile,"Fehler beim Erzeugen des Ordners '" & $ziel & $name & "'")
    $return = FALSE
    Else
    $dbneu &= $hashneu & "," & $name & @CRLF
    EndIf
    Else
    If FileCopy($quelle & $name,$ziel & $name,1) = 0 Then
    FileWriteLine($logfile,"Fehler beim Kopieren der Datei '" & $quelle & $name & "'")
    $return = FALSE
    Else
    $dbneu &= $hashneu & "," & $name & @CRLF
    EndIf
    EndIf
    EndIf
    Sleep(10)
    Next
    Else
    ; komplette Quelle wird neu kopiert und die Quell-DB übernommen
    FileWriteLine($logfile,"Ziel existiert nicht, komplette Quelle wird kopiert !")
    If DirCopy($quelle,$ziel,1) = 0 Then
    FileWriteLine($logfile,"Fehler beim Kopieren des Ordners '" & $quelle & "'")
    $return = FALSE
    Else
    $dbneu = $quelle_neu & @CRLF
    EndIf
    EndIf
    $dbid = FileOpen($dbname,2)
    FileWrite($dbid,StringLeft($dbneu,StringLen($dbneu)-2))
    FileClose($dbid)
    DllClose($dll)
    FileWriteLine($logfile,"Backup von '" & $quelle & "' nach '" & $ziel & "' wurde beendet am " & @MDAY & "." & @MON & "." & @YEAR & " um " & @HOUR & ":" & @MIN & ":" & @SEC & @CRLF)
    Else
    FileWriteLine($logfile,"Backup von '" & $quelle & "' konnte am " & @MDAY & "." & @MON & "." & @YEAR & " um " & @HOUR & ":" & @MIN & ":" & @SEC & " nicht gestartet werden." & @CRLF & "Die Quelle wurde nicht gefunden !" & @CRLF)
    EndIf
    Return $return
    EndFunc

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

    func _GetFolderMD5($ordner,$subordner,$muster)
    ; Gibt eine String mit Zeilenvorschueben zurück, in der Zeile für Zeile
    ; ein MD5-Hash und mit Kommata getrennt der Dateiname ist
    ; Die Funktion arbeitet rekursiv !
    Local $ausgabe
    If StringRight($ordner & $subordner,1) <> "\" then $subordner &= "\"
    $ausgabe = "Verzeichnis---------------------," & $subordner
    $suche = FileFindFirstFile($ordner & $subordner & $muster)
    While 1
    $file = FileFindNextFile($suche)
    If @error then ExitLoop
    If StringInStr(FileGetAttrib($ordner & $subordner & $file),"D") > 0 Then
    $ausgabe = $ausgabe & @CRLF & _GetFolderMD5($ordner,$subordner & $file,$muster)
    Else
    If FileGetSize($ordner & $subordner & $file) = 0 then
    $ausgabe &= @CRLF & "groesseNull---------------------," & $subordner & $file
    Else
    $result = DllCall($dll,"str","testit","str",$ordner & $subordner & $file,"str","MD5","int",false)
    $ausgabe &= @CRLF & StringLeft($result[0],StringInStr($result[0],@CRLF)-1) & "," & $subordner & $file
    EndIf
    EndIf
    Sleep(10)
    Wend
    FileClose($suche)
    If StringLeft($ausgabe,2) = @CRLF then $ausgabe = StringMid($ausgabe,3)
    Return($ausgabe)
    endfunc

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

    Dazu wird noch die folgende Hashes.dll benötigt:

    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"

  • Hm, alles Falsch was ich bis dato geschrieben habe.

    Das Script von Bugfix scannt nur auf neue Dateien während der laufzeit.
    Es gibt also gar nicht zu beginn alle dateien aus.
    Zu beginn der Laufzeit behandelt es das Verzeichniss wie ein Jungfräuliches.

    Ich denke mal ich nehme das als Lernprojekt für mich :)
    Werde also mein möglichstes tun und gegebenenfalls erfolge oder misserfolge hier Posten.

    Vielen Dank für eure Bemühungen

    mfg Observer