Datei abgleich zwischen 2 PCs

bernd00

Mitglied
Moin zusammen,

hätte da mal eine Frage, bzw. suche einen Tip :).
Ich habe einen Rechner (Host) der einen Ordner mit Dateien (ca. 50 Dateien) bereit hält. Der Ordner ist im Netzwerk freigegeben.
Nun gibt es einige Rechner (Client) im selben Netzwerk, die Dateien aus diesem Ordner benötigen.
Bisher läuft es so, dass ich die Dateien in diesem Ordner in eine Zip packe und auf dem Client ist ein Java Programm dass die Zip auf den Client kopiert und entpackt. Kopiert wird die zip übers Netzwerk mit jcifs. Problem dabei ist, dass die zip immer größer wird und das eigentlich unnötig ist, weil einige Dateien nicht verändert wurden.

Meine Frage, wie kann man die einzelnen Dateien prüfen ob diese verändert sind und übertragen?

Meine Idee ist:
eine Tabelle im MSSQL Server anzulegen, die alle Dateinamen, pfad und md5 Wert beinhaltet. Das Programm auf dem Client liest die Tabelle und vergleicht mit dem lokalen System ob die Datei vorhanden ist oder verändert wurde und kopiert die mit jcifs.
Dabei weiß ich nicht, ob das die beste Lösung ist, das Programm muss pro lokaler Datei den md5 Wert ermitteln und abgleichen, sowie für jede Datei zum kopieren eine Verbindung auf- und abbauen. Gibt es eine Möglichkeit zwischen den Rechner ohne jcifs zu kopieren?

Hat jemand eine bessere Idee? Würde mich über Vorschläge freuen :)

MfG
bernd00
 
Also ich fang mal an mich geistig drüber zu ergießen:

1) Nutze lieber SHA256 ... denn sowohl MD5 als auch SHA-1 sind nicht ausreichend kollisionssicher. SHA256 dagegen hat schon eine bedeutent höhere Killisonssicherheit.
2) Warum machst du dir das so umständlich über eine Lib über Windows-Freigaben zu arbeiten ? Baue dir doch einen Java-Server und arbeite dierekt über die Streams.
3) Warum denn gleich mit Kanonen auf Spatzen schießen ? Wenn schon Datenbank dann mach es klein mit ner SQLite DB ... dafür gibt es sogar eine Java-Lib.
4) Ich würde es wie folgt machen:
a) SHA256 einer Datei berechnen
b) Dateiname + SHA256-Hash über Netz an den Server
c) Server berechnet live den aktuellen SHA256 der angefragten Datei und gleicht diesen mit dem übers Netz erhaltenen Hash ab.
d) Falls Hash identisch lediglich ein kurzes Command nach dem Motto : HASHOK zum Client senden
e) Falls Hash nicht identisch : Command HASHFAIL senden und dann das File hinterher. Um es einfach zu halten mit Base64-Encoding. Geht aber auch dierekt binär wenn du weist wie.
 
Hey, danke für die Antwort.

2) Ich mach das so kompliziert, weil ich noch nie einen Java-Server erstellt habe. Hättest du ein Beispiel mit Streams? Wäre natürlich die schönere Variante.

3) der MSSQL Server ist sowieso schon in Betrieb. Habe nur daran gedacht, weil so nur einmal pro Datei der hash berechnet werden müsste. Allerdings muss man daran denken die hash's neu in die DB zu speichern, also auch nicht so toll.

So in der Art war meine Idee ja auch, Hash abgleichen und wenn icht identisch dann kopieren. Nur an einen Java Server habe ich noch nie erstellt. Denke das ist bestimmt die beste Lösung.
 
Ich hab mal nen bisschen gesucht und einen Beispiel-Code von Thomas gefunden den er mal gepostet hat, wie man Dateien über das Netzwerk versendet:
http://www.tutorials.de/java/245134-datei-mittels-tcp-uebertragen.html
Den Hash auf Server-Seite jedes mal neu zu berechnen ist recht aufwändig. Wenn du Kontrolle darüber hast wie und wann die Dateien geändert werden könntest du auch einfach zu jeder Datei den Hash speichern und diesen immer updaten wenn sich die Datei ändert.
 
Der Post von Thomas ist natürlich ein Paradebeispiel wie man es sauber macht, das muss ich neidisch zugeben.

@Techno
Das mit dem Hash jedes mal neu berechnen ist nicht wirklich aufwändig. Mit dem SUN-Provider brauchst du selbst für eine große Datei *200MB* brauchst du mit nem relativ großen Buffer und NIO keine 5 Sekunden. Also wäre es für einen on-deamond-Server schon besser da man so die Dateien willkürlich ändern kann ohne den Server jedes mal neustarten muss.
 
Danke für das Beispiel. Das funktioniert mit localhost schonmal prima. Werd das direkt ausprobieren wie das mit 2 verschiedenen pcs abläuft.
 
Zurück