C# lokale Dateien mit einem Webserver (über http) synchronisieren

Timmey92

Commodore
Registriert
Okt. 2008
Beiträge
4.563
Hallo!

Ich arbeite momentan an einem Programm und möchte dafür einen Launcher/Patcher schreiben.

Dieser Patcher soll die Dateien auf dem lokalen Speicher mit denen auf dem Webserver möglichst effizient (Bandbreitenschonend) vergleichen und wenn die Datei auf dem Webserver nicht identisch ist soll sie heruntergeladen werden und die lokale Datei ersetzen.

Da frage ich mich wie mache ich das?
Hatte an Hashes gedacht, nur wie kriege ich von einer Datei auf einem HTTP Server den Hash ohne die Datei runterzuladen?


Der Launcher soll also auch als Installer dienen, indem er einfach die Dateien runterlädt, auch wenn sie nicht vorhanden sind. Es soll also immer das Webserververzeichnis abgebildet werden (mit von mir programmierten Ausnahmen für z.B. Konfiguration, User files wie Savegames etc.)

Hoffe ihr könnt mir da ein paar Gedankenanstöße geben :)
Danke im vorraus!
 
BloodHunter2k8 schrieb:
Da frage ich mich wie mache ich das?
Hatte an Hashes gedacht, nur wie kriege ich von einer Datei auf einem HTTP Server den Hash ohne die Datei runterzuladen?

Ich kenn mich damit zwar nich aus, aber ich denke dazu brauchst du ne Software auf dem Server, die per Anfrage vom Client die Hashes generiert und dann zurück schickt.

Oder du erstellst eine Dateiliste mit den zugehörigen Hashes, die du auf dem Server ablegst und der Client downloaden kann.
 
Also praktisch müsste ich einen Server programmieren der über eine TCP Verbindung die Hashes der Dateien erzeugt und an meinen Launcher(Client) überträgt?

Die 2. Variante finde ich auch nicht schlecht :) Da spart man sich ein wenig Arbeit.

Andere Varianten gibts nicht?
 
Wie gesagt, ich kenne mich damit nich aus aber das ist das was mir dazu einfällt, wenn ich das Problem lösen müsste. Gibt bestimmt noch mehr Möglichkeiten.

Ich würde auch am ehesten die 2. Variante nehmen (Faulheit siegt ;)) und später vllt. auf die erste wechseln.
 
Könnte man die Hashes über eine .bat Datei erzeugen? Dann könnte man das jeden Tag ausführen lassen und müsste nicht mal auf 1. umsteigen :)
 
man könnte doch auch nur die ersten bsp 40byte vom file holen
und die auf hash prüfen
sozusagen den hash 40byte groß machen und von file ziehn
sollte theoretisch auch funktionieren

du kannst nicht daten vom server abgreifen ohne etwas "herunterzuladen"
 
das man etwas "herunterladen" muss ist mir klar, aber eben nicht die ganze Datei, das ist es worauf es mir ankommt.
Wäre das mit den 40Byte denn eindeutig? Wenn man die Datei sagen wir nur am Ende verändert, würde ja dann der selbe Hash herauskommen, wenn man nur die ersten 40 byte vergleicht.
 
Die Variante mit dem Hash in einer Datei ist doch sehr gut. Du schreibst einfach einen Cronjob der einmal pro Stunde den Hash der Datei berechnet und abspeichert. Unter Linux dürfte das etwa so gehen "md5sum meinedatei > meinedatei.hash".
 
kommt auf deinen anwendungsfall drauf an
wenn du nach jeder veränderung den hash neu berechnest dann ja
ansonsten nein

über einen launcher sollte es so funktionieren
habs selber vor kurzem erst gemacht

die idee von cx01 is ned dumm ^^


So wie ich das verstanden habe hast du

Datei1 lokal
Datei1 server

die du patchen willst
die lokale datei soll immer der des servers angepasst werden
also sobald du den lauchner startest
berechnet der lancher den hash der lokalen datei und vergleicht den mit dem hash der server datei
der ja zuvor berechnet wurde und am anfang der datei gesetzt (bsp 40byte)
also ist der hash unterschiedlich wenn du die lokale datei änderst bzw die serverdatei änderst
es muss hald immer der aktuelle hash der datei in der datei am anfang stehn
 
Zuletzt bearbeitet:
Dazu eine Verständnisfrage: Der Hash wird IN die Datei an den Anfang geschrieben? Das war mir nicht bekannt ... ist das immer so?

Ansonsten hast du mich richtig verstanden, so möchte ich das machen.
Ist übrigens alles Windows (Webserver und Client)
 
Zuletzt bearbeitet:
Ich würde ihn in eine extra Datei packen. Wenn er in der Datei ist, müsstest du ihn ja nach dem runterladen wieder entfernen, was irgendwie nervig ist.
 
Könnte das ganze über FTP einfacher gehen als über HTTP?
Gibt doch bestimmt FTP Server die die Hashes angeben können?
 
Keine Ahnung, ob es solche FTP-Server gibt. Hast du denn Root-Zugriff auf den Server?
 
ne der wird standartmäßig natürlich nicht am anfang gesetzt oder ähnliches müsstest du hald per hand machen

am einfachsten wär es wie gesagt in eine extra datei wobei du aber eine solche datei nur extern besitzt
also nur aufm server liegend
lokal sollte der hash immer neu berechnet werden
weswegen ich auch nicht den timestamp als hash benutzen würde sondern einen algorithmus der dir aus dem inhalt der datei einen hash wert erstellt da kannst sicher sein das er "einzigartig" ist

über einen direkten ftp server is mir sowas nicht bekannt
 
Ja habe kompletten Zugriff auf den Server.
Ich denke ich werde das über eine extra Datei lösen. Schreibe mir ein Programm was eine Dateiliste mit Pfaden der Dateien erstellt und dann die Datei Hashes davon erstellt. Auf diese Weise kann ich mit meinem Launcher dann die Dateiliste herunterladen, die einzelnen hashes überprüfen und überflüssige Dateien löschen/nicht vorhandene runterladen/updaten.

Danke!
 
jo mach das ;P
wünsch dir noch viel spaß beim coden ^^
 
Ja danke :)
 
Wo ist das Problem ne kleine PHP Datei auf dem Webserver zu legen die von der Datei einen Hash erzeugt und dir bei Aufruf zurück gibt?

irgendwas ala $bla = md5_file ( $filename)
 
@Mike Lowrey
denk nicht das dass generell ein problemgibt
wenn du jedoch ne größere datei hast von der du jedes mal einen neuen hash erzeugst benötigt das mehr ressourcen als einmal einen festzulegen

anderfalls kann es sinnvoll sein da man nicht jedesmal einen neuen hash erzeugen muss nachm speichern
Ergänzung ()

da sich der hashwert ja nur ändern wenn man die datei ändert sollte es nicht das problem sein nach jedem ändern den hash neu festzulegen ^^
 
Zuletzt bearbeitet:
Abgesehen davon, dass ich nicht daran gedacht habe :D hat InEv1L recht, denke ich.
Diese Lösung wäre natürlich flexibler... Da ich Ressourcen frei habe probiere ich einfach mal beides :D
 
Zurück
Oben