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

Timmey92

Commodore
Dabei seit
Okt. 2008
Beiträge
4.540
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!
 

locomarco

Commander
Dabei seit
Aug. 2009
Beiträge
2.446
Zitat von BloodHunter2k8:
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.
 

Timmey92

Commodore
Ersteller dieses Themas
Dabei seit
Okt. 2008
Beiträge
4.540
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?
 

locomarco

Commander
Dabei seit
Aug. 2009
Beiträge
2.446
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.
 

Timmey92

Commodore
Ersteller dieses Themas
Dabei seit
Okt. 2008
Beiträge
4.540
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 :)
 

Xetoxyc

Lieutenant
Dabei seit
Nov. 2010
Beiträge
872
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"
 

Timmey92

Commodore
Ersteller dieses Themas
Dabei seit
Okt. 2008
Beiträge
4.540
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.
 

cx01

Lt. Junior Grade
Dabei seit
Mai 2010
Beiträge
258
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".
 

Xetoxyc

Lieutenant
Dabei seit
Nov. 2010
Beiträge
872
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:

Timmey92

Commodore
Ersteller dieses Themas
Dabei seit
Okt. 2008
Beiträge
4.540
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:

cx01

Lt. Junior Grade
Dabei seit
Mai 2010
Beiträge
258
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.
 

Timmey92

Commodore
Ersteller dieses Themas
Dabei seit
Okt. 2008
Beiträge
4.540
Könnte das ganze über FTP einfacher gehen als über HTTP?
Gibt doch bestimmt FTP Server die die Hashes angeben können?
 

cx01

Lt. Junior Grade
Dabei seit
Mai 2010
Beiträge
258
Keine Ahnung, ob es solche FTP-Server gibt. Hast du denn Root-Zugriff auf den Server?
 

Xetoxyc

Lieutenant
Dabei seit
Nov. 2010
Beiträge
872
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
 

Timmey92

Commodore
Ersteller dieses Themas
Dabei seit
Okt. 2008
Beiträge
4.540
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!
 

Xetoxyc

Lieutenant
Dabei seit
Nov. 2010
Beiträge
872
jo mach das ;P
wünsch dir noch viel spaß beim coden ^^
 

Timmey92

Commodore
Ersteller dieses Themas
Dabei seit
Okt. 2008
Beiträge
4.540
Ja danke :)
 

Mike Lowrey

Commodore
Dabei seit
Juni 2005
Beiträge
4.978
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)
 

Xetoxyc

Lieutenant
Dabei seit
Nov. 2010
Beiträge
872
@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:

Timmey92

Commodore
Ersteller dieses Themas
Dabei seit
Okt. 2008
Beiträge
4.540
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
 
Top