AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Synchronisation im Netwerk - Dateilisten, wie?
Thema durchsuchen
Ansicht
Themen-Optionen

Synchronisation im Netwerk - Dateilisten, wie?

Ein Thema von mr47 · begonnen am 31. Okt 2006 · letzter Beitrag vom 1. Nov 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von mr47
mr47

Registriert seit: 6. Dez 2004
Ort: Stuttgart
644 Beiträge
 
Delphi 2005 Personal
 
#1

Synchronisation im Netwerk - Dateilisten, wie?

  Alt 31. Okt 2006, 11:14
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 . 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 . Wie könnte ich das machen?


Danke im Voraus

mfg mr47
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Synchronisation im Netwerk - Dateilisten, wie?

  Alt 1. Nov 2006, 06:49
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.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Benutzerbild von mr47
mr47

Registriert seit: 6. Dez 2004
Ort: Stuttgart
644 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Synchronisation im Netwerk - Dateilisten, wie?

  Alt 1. Nov 2006, 13:25
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
  Mit Zitat antworten Zitat
bigg
(Gast)

n/a Beiträge
 
#4

Re: Synchronisation im Netwerk - Dateilisten, wie?

  Alt 1. Nov 2006, 13:51
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.
  Mit Zitat antworten Zitat
Benutzerbild von mr47
mr47

Registriert seit: 6. Dez 2004
Ort: Stuttgart
644 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Synchronisation im Netwerk - Dateilisten, wie?

  Alt 1. Nov 2006, 14:07
Hey!

Also ich hab nachdem ich das Thema erstellt hab trotzdem weiterentwickelt, wenn's Müll ist, ist's auch nicht schlimm . Ich hab einen Typ (einen Record) erstellt der so aussieht:

Delphi-Quellcode:
type
  TFileListEntry = record
    fName: string[255];
    fSize: Cardinal;
    fDate: TDateTime;
    fTimeStamp: Cardinal;
    fHash: string[32];
  end;
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.
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
  Mit Zitat antworten Zitat
bigg
(Gast)

n/a Beiträge
 
#6

Re: Synchronisation im Netwerk - Dateilisten, wie?

  Alt 1. Nov 2006, 14:57
moin,

sieht ja schon halbwegs sauber aus...aber:

Delphi-Quellcode:
type
  TFileListEntry = record
    fName: string[255];
    fSize: Cardinal; // *1
    fDate: TDateTime;
    fTimeStamp: Cardinal;
    fHash: string[32]; // *2
end;
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.

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
  Mit Zitat antworten Zitat
Benutzerbild von mr47
mr47

Registriert seit: 6. Dez 2004
Ort: Stuttgart
644 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Synchronisation im Netwerk - Dateilisten, wie?

  Alt 1. Nov 2006, 16:16
Hi Bigg! (und auch andere )

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
  Mit Zitat antworten Zitat
bigg
(Gast)

n/a Beiträge
 
#8

Re: Synchronisation im Netwerk - Dateilisten, wie?

  Alt 1. Nov 2006, 18:58
Hi,

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.

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:
http://www.delphipraxis.net/internal...ct.php?t=76263

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.
  Mit Zitat antworten Zitat
Benutzerbild von mr47
mr47

Registriert seit: 6. Dez 2004
Ort: Stuttgart
644 Beiträge
 
Delphi 2005 Personal
 
#9

Re: Synchronisation im Netwerk - Dateilisten, wie?

  Alt 1. Nov 2006, 19:45
Hi!

Nochmal zu Punkt4

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 ). 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

Ordnerüberwachung:

Vielen Dank. Bis jetzt hab ich mich darum noch gedrückt . Aber auch dieses Problem muss ich irgendwann angehen. Danke für den Link!
  Mit Zitat antworten Zitat
bigg
(Gast)

n/a Beiträge
 
#10

Re: Synchronisation im Netwerk - Dateilisten, wie?

  Alt 1. Nov 2006, 20:24
Es gibt einiges, nicht nur für Delphi:
FastZLib

Für deinen Fall wohl das idealste^^


http://7-zip.org/sdk.html
http://www.delphizip.net/
http://www.dsdt.info/tutorials/cabinet/
...

Zur 4.tens:

Jo na dann bin ich ja beruhigt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz