![]() |
Synchronisation im Netwerk - Dateilisten, wie?
Hi!
Ich schreibe zur Zeit an einem Programm zur Synchronisation eines Ordners zwischen zwei Netzwerkteilnehmern. Ich hab bis jetzt an einem Ansatz geschrieben, der, wie mir jetzt klar geworden ist, nicht ganz sauber ist :wink: . Und zwar möchte ich für jeden Ordner der im Netzwerk freigegeben ist eine Dateiliste haben, die dann verglichen wird. Jetzt hab ich zwei Probleme: 1. In welcher Form sollen die Dateien / Listen sein. Ich hab bisher mit normalen Textdateien gearbeitet, was allerdings bei 500+ Dateien langsam werden dürfte. Außerdem ist es recht "unbequem" mit Textdateien zu arbeiten. Am besten wäre natürlich ne Datenbank, aber: Ich will nicht, dass der Benutzer irgendwelche Zusatzprogramme / Datenbanken etc. installieren muss. Ideen? 2. Wie soll ich dann im Netzwerk Änderungen an der Datenbank vornehmen. Bisher hab ich Befehle in Form von Strings versendet, die dann die Gegenstelle geparst und ausgewertet hat. Irgendwann hab ich in dem riesigen geparse nicht mehr gewusst wo was hin muss :mrgreen: . Wie könnte ich das machen? Danke im Voraus mfg mr47 :hi: |
Re: Synchronisation im Netwerk - Dateilisten, wie?
Ich denke XML ist die Lösung für dein Problem.
Warum? 1. Es gibt Parser dafür. 2. Lässt es sich als String leicht übertragen. 3. Bietet es schon die Baumstruktur, die man aus Dateisystemen kennt. |
Re: Synchronisation im Netwerk - Dateilisten, wie?
Hey chaosben!
Danke für deine Antwort. Und was brauch ich dazu? Hab Delphi 2k5. Ich habe bisher noch nie mit XML in Delphi gearbeitet... mfg mr47 |
Re: Synchronisation im Netwerk - Dateilisten, wie?
moin mr47,
XML ist doch aber auch nur textbasiert, genau wie jede andere Datei auch und ob du damit einen Performancegewinn erzielen wirst, bezeifle ich imho mal ganz stark. Hast du dich schonmal mit dem Thema "Records" beschäftigt? Diese wären für dein Problem schon recht günstig und auch einfach zu implementieren. |
Re: Synchronisation im Netwerk - Dateilisten, wie?
Hey!
Also ich hab nachdem ich das Thema erstellt hab trotzdem weiterentwickelt, wenn's Müll ist, ist's auch nicht schlimm :wink: . Ich hab einen Typ (einen Record) erstellt der so aussieht:
Delphi-Quellcode:
Von diesem Typ erstell ich dann typisierte Dateien. Bin inzwischen soweit (wegen der Performance), dass ich für jeden freigegebenen Ordner eine eigene Dateiliste, also eine eigene typisierte Datei, erstelle und alle Dateilisten wiederum in einer Datei verwaltet werden. Ich denke das dürfte schneller sein. Also hab ich jetzt das Speicher-/Verwaltungsproblem gelöst.
type
TFileListEntry = record fName: string[255]; fSize: Cardinal; fDate: TDateTime; fTimeStamp: Cardinal; fHash: string[32]; end; Bleibt das Problem der Übertragung. Wenn man die Elemente im Record zusammenzählt kommt man immerhin auf 300 Byte oder mehr. Bei einem Ordner mit 500 Einträgen sind das schon 146 kByte. Die Frage ist wie man Änderungen an der DAteiliste möglichst trafficschonend übertragen kann. Also löschen, hinzufügen oder verändern von Einträgen. Oder soll ich veränderte Dateilisten einfach neu herunterladen? Achja und schreibt bitte, wenn das mit den typisierten DAteien so Quatsch ist! Danke! Gruß mr47 |
Re: Synchronisation im Netwerk - Dateilisten, wie?
moin,
sieht ja schon halbwegs sauber aus...aber:
Delphi-Quellcode:
1. Der Datentyp ist hier schlecht gewählt, da du bei sehr großen Dateien ab 4 GB Probleme bekommen wirst. (Cardinal -Bufferoverflow). Benutze deswegen den Datentyp "Int64". Mit diesem kann man theoretisch +/- 2^63-1 Werte darstellen, so dass sich auch Dateien von über 4 GB verwalten ließen.
type
TFileListEntry = record fName: string[255]; fSize: Cardinal; // *1 fDate: TDateTime; fTimeStamp: Cardinal; fHash: string[32]; // *2 end; 2. Solltest du Hash-Verfahren ala MD5 (128 Bit), SHA1 (128 Bit) einsetzen, so sollten 16 Byte zum übertragen der Prüfsummen ausreichen. Die Kodierung kann man dann auf dem Client bzw. Server vornehmen. 3. Dateiattribute, Schreib- und Leserechte von Dateien fehlen in deiner Dateiliste, okay wären vielleicht auch nur optional.. 4. Leg am besten keine Datei an, sondern arbeite direkt mit Streams, sofern deine Dateilisten nicht allzugroß sind, diese kann man ebenfalls noch mit einem schnellen Kompressionsalgo versehen |
Re: Synchronisation im Netwerk - Dateilisten, wie?
Hi Bigg! (und auch andere :wink: )
Vielen Dank für deine Antwort! Punkt 1 und 2 hab ich verstanden und auch gleich geändert. Punkt 3 ist derzeit nicht notwendig. Falls doch mal ist es auch kein großes Problem das noch dazu zu bauen. Punkt 4 hab ich nicht so ganz verstanden. Fall: Ich bin Benutzer A und ein anderer Benutzer B hat seinen Rechner irgendwo und wir synchronisieren einen Ordner. Also starte ich mein Programm, gebe den Ordner frei. Mein Programm erzeugt eine Datei mit der Liste aller Dateien, die freigegeben sind. Benutzer B verbindet zu mir, sieht diese Liste und läd sie sich runter.(Das passiert natürlich alles automatisch...) Damit weiß er welche Dateien ihm noch fehlen etc. Meine Frage ist, wenn ich später was an dieser Liste, also am Ordnerinhalt, veränder, wie dann Benutzer B an die neue Information kommt. Allerdings hab ich jetzt eine andere Idee. Wie effektiv sind Kompressionsalgos? Wie viel kann ich aus einer z.B. 200 kByte großen Datei rausholen? Nochmals Danke und gruß mr47 |
Re: Synchronisation im Netwerk - Dateilisten, wie?
Hi, :wink:
Punkt 4: Es ist unnötig eine Datei anzulegen, diese mit den Nutzer-Daten (deine Dateiliste) zu füllen und anschließend brockenweise zu versenden. Da eh schon alles im Speicher liegt, verschickt du es direkt an den Zielrechner, es sei denn der Nutzer ist zur Zeit nicht erreichbar. Da wäre dann eine Datei sehr sinnvoll, hörte sich jedoch nicht so an, als wolltest du eine Warteschlange programmieren. Oder? Es könnte ja auch mal Vorkommen, das die Verbindung zwischen den einzelnen Computern abbricht usw. und sofort, da steckt der Teufel im Detail. :mrgreen: Zur Kompression: Das lässt sich natürlich nicht pauschal beantworten, es ist immer unterschiedlich. Im Worstcase bringt eine Kompression gar nichts. Hier mal ein simples Beispiel für eine gute Kompression: Datei1.txt Datei2.txt Datei3.txt In allen Dateinamen befindet sich das Wort "Datei" sowie die Erweiterung ".txt". Daraus könnte man jetzt zum Beispiel folgendes machen: "Datei/1-3/.txt". Es hängt also immer von den Daten selbst ab und wie sie aufgebaut sind. PS: Die Kompression bezog sich lediglich auf die Dateiliste...den oft sind Daten ja schon recht gut komprimiert. Bilder, Videos, Programme, etc. Zur Überwachung der Ordner: Auch nicht ganz trivial: Um festzustellen, das sich etwas ändert schau mal: ![]() Anschließend müßtest du herausfinden, was sich geändert hat und dann die komplette Liste erneut übertragen oder nur die Änderung also im Endeffekt die Liste abgleichen. |
Re: Synchronisation im Netwerk - Dateilisten, wie?
Hi!
Nochmal zu Punkt4 :wink: Der Grund, warum ich eine Datei anlege, ist nicht das versenden. Sondern: wenn ich mein Programm beende und wieder starte sind die Daten aus dem Arbeitsspeicher weg. Und da ich vllt einen Ordner freigeben will, aber nicht alle Dateien die im Ordner enthalten sind, erstell ich Dateien, die die Listen enthalten. (Ich hoff mal, dass ich dich jetzt nicht die ganze Zeit falsch verstanden habe :mrgreen: ). Ein weiterer Grund ist: Es kann durchaus sein, dass ein Ordner von mehreren Gegenstellen als Quelle benutzt wird. Das also um mich ein Art Dreiecks- oder sogar Sternnetzwerk entsteht. Da mein Programm (speziell für Internet- /Lansynchronisationen) einen FTP-Port offen hat, kann man diese Dateilisten einfach über FTP runterladen. (Der Rest wird auch über FTP laufen, ich hab dazu extra ne Klasse geschrieben). Kompression: Ja ist klar. Ich weiß theoretisch wie einfache Kompressionsverfahren funktionieren. Da aber gerade in Dateilisten sich Pfade etc. oft wiederholen, denk ich ließe sich da schon was rausholen. Gibts kostenlose, schon fertige, Algos die in Delphi implementiert sind? Her damit :wink: Ordnerüberwachung: Vielen Dank. Bis jetzt hab ich mich darum noch gedrückt :wink: . Aber auch dieses Problem muss ich irgendwann angehen. Danke für den Link! |
Re: Synchronisation im Netwerk - Dateilisten, wie?
Es gibt einiges, nicht nur für Delphi:
![]() Für deinen Fall wohl das idealste^^ ![]() ![]() ![]() ... Zur 4.tens: Jo na dann bin ich ja beruhigt. :mrgreen: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz