Ja genau das.
Ich brauche die Dateien die zwischen den scanns erstellt wurden.
mfg Observer
Ja genau das.
Ich brauche die Dateien die zwischen den scanns erstellt wurden.
mfg Observer
Ich habe ein Backupscript geschrieben, welches auf einer MD5-Differenz beruht. Vielleicht kann man es für Deine Zwecke anpassen.
Hier das Script:
$fehler = FALSE
$logfile = "MD5Backup.log"
If _MD5Backup("C:\Benutzerdaten","\\Backupdrive\Folder","Benutzerdaten.db") = FALSE then $fehler = TRUE
; ggf weitere Backupaufträge
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
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
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
Dazu wird noch die folgende Hashes.dll benötigt:
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