Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Dateivergleich über Netzwerk (https://www.delphipraxis.net/180884-dateivergleich-ueber-netzwerk.html)

Marco Steinebach 27. Jun 2014 11:04

Dateivergleich über Netzwerk
 
Hallo zusammen,
ich habe ein Programm, dessen Dateien, auf die es zugreift, auf einem Netzwerklaufwerk liegen.
Um den Netzwerk-Traffik zu minimieren, habe ich mir folgendes überlegt:
ich speichere eine lokale Kopie aller Dateien. Sind Netzwerk- und lokale Version gleich, wird die lokale Version zum Lesen verwendet, sonst wird die Netzwerk-Version erst wieder lokal kopiert.
Gespeichert wird sowieso immer im Netzwerk um Inkonsistenzen zu verhindern.
Ich dachte, ich könnte einfach (im Pseudocode) sagen:
wenn das FileDate von Quelle und Ziel unterschiedlich ist, kopieren, sonst kannstde die lokale kopie nehmen.
1. Kann man das überhaupt so lösen?
2. gibt's dafür vielleicht gescheitere Strategien?

Für Antworten wäre ich sehr dankbar, ich hänge nämlich absolut fest! ;-)
Herzliche Grüße
Marco

Aphton 27. Jun 2014 11:16

AW: Dateivergleich über Netzwerk
 
Joa, klingt eigentlich ok.. Ich würds halt aber nicht mit Datum sondern eher mit einem Hash machen - am besten ist, du legst eine Textdatei im Netzlaufwerk ab, wo dann (Datei,Hash) Tupel enthalten sind.. Du müsstest dann immer nur die Textdatei runterladen (minimale Netzwerkauslastung), dort drinnen dann die Hashes extrahieren und mit den Hashes der lokalen Daten überprüfen und bei Ungleichheit updaten..

p80286 27. Jun 2014 11:19

AW: Dateivergleich über Netzwerk
 
Wenn Du wirklich das kopieren ersparen willst, dann solltest Du auch noch die Dateigröße vergleichen.
Eine weitere Möglichkeit wären Prüfsummen/Hashwerte der Netz-Dateien zu hinterlegen, aber wer garantiert das diese nach 1 Minute,30Minuten...12Stunden noch stimmen?

Also bleibt keine andere Möglichkeit als die Originaldatei zu lesen, Dann kannst Du auch gleich kopieren.

Gruß
K-H

Der schöne Günther 27. Jun 2014 11:20

AW: Dateivergleich über Netzwerk
 
Wenn es dir nur um den Traffic geht, warum nicht eingebaute Windows-Bordmittel wie "Offline-Dateien"? Das ist doch, meine ich, extra dafür gemacht worden.

p80286 27. Jun 2014 11:22

AW: Dateivergleich über Netzwerk
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1263636)
Wenn es dir nur um den Traffic geht, warum nicht eingebaute Windows-Bordmittel wie "Offline-Dateien"? Das ist doch, meine ich, extra dafür gemacht worden.

OK, das gibt es als Datei-Attribut aber wie wendet man's praktisch an?

Gruß
K-H

himitsu 27. Jun 2014 13:48

AW: Dateivergleich über Netzwerk
 
Wie wilst du die Dateien vergleichen?

Grundsätzlich bleibt da ja erstmal nur Dateigröße und eventuell Änderungsdatum.
Und wenn der Traffic gespart werden soll, dann maximal eine parieller Vergleich/Hash des Dateiinhalts (z.B. nur die ersten paar Byte/Kilobyte der Datei).


Alternativ müsste auf der anderen Seite des Netzwerks ebenfalls irgendein Programm laufen, von welches man den Hash der Datei(en) bekommt.

jensw_2000 27. Jun 2014 15:20

AW: Dateivergleich über Netzwerk
 
Erzähl man etwas mehr zu der Zielumgebung.
Ab Windows Server 2008 / Windows 7 gibt es dafür sehr cool Lösungen wie Remotedifferenzialkomprimierung oder ab 2008 R2 Branch Cache.

Offline Dateien helfen Dir nicht weiter. Wenn Online, dann werden IMMER die Dateien vom Netzwerkshare geladen. Wenn Offline, dann immer die lokale Kopie. Der Sync erfolgt recht langsam im Hintergrund.

Sir Rufo 27. Jun 2014 16:02

AW: Dateivergleich über Netzwerk
 
Die Schlagworte wurden ja schon genannte (Größe, Hash-Werte (z.B. MD5 und SHA1)) um zu erkennen, ob die lokale Datei eine exakte Kopie der Datei auf dem Netzlaufwerk ist.

Problematisch ist aber nun, wie man an die aktuelle Größe und die aktuellen Hash-Werte der Datei auf dem Netzlaufwerk kommt.

Hier führt eigentlich kein Weg daran vorbei auf der Netzwerkressource einen Dienst zu implementieren, der zu einem Dateinamen diese Informationen ermittelt und zurückgibt. Und wenn man schon dabei ist, dann kann der Dienst diese Datei auch gleich mit ausliefern.

Die Anwendung fragt nun nach einer Datei, bekommt vom Server-Dienst die Informationen über Größe und Hash-Werte der Datei auf dem Server. Nun schaut man, ob es im lokalen Cache solch einen Eintrag gibt, der diese Eigenschaften hat (Größe, Hash-Werte). Wenn ja, dann wird diese Datei ausgeliefert, wenn nicht, dann wird die Datei vom Server gelesen, im Cache abgelegt und dann von dort gelesen.

Marco Steinebach 27. Jun 2014 18:03

AW: Dateivergleich über Netzwerk
 
Hallo zusammen,
ersteinmal ganz herzlichen Dank für eure Antworten.

Kurz zur Erklärung: Das Programm läuft auf mehreren Rechnern im lokalen Netz, und legt seine Dateien (Daten) auf einem Laufwerk ab. Ich weiß, ich weiß, SQL o.ä. wäre die elegantere Lösung, hab ich aber hier nicht. ;-)
d.h., wenn eine der laufenden Instanzen etwas speichert, ändert sich ja das Datum der Datei. Wenn nun irgendein Client, auch der, der gerade gespeichert hat, jetzt prüft, ob seine lokale Kopie mit der Netzwerk-Version übereinstimmt, sollte das ja nicht der Fall sein, weil die beiden Datumswerte unterschiedlich sind - denke ich, oder?
Brauch ich, in diesem Fall, die Hash-Prüfung überhaupt?
Serverseitig läuft ein Programm (wenn's auch kein Dienst ist ;-)), so daß auch die Abfrage bzw. Kommunikation über diesen Weg möglich wäre.
Den Traffik wollte ich minimieren, weil es, greift man über ein VPN auf's Netzwerk zu, dann einfach schneller geht wenn man nur das Datum vergleichen muß, die Dateien sind zwar nicht groß, aber auch 200 KB wollen übertragen werden.

Ich glaube, nach der Lektüre eurer Antworten, muß ich meine Frage präzisieren:
Ich kann mittels
Delphi-Quellcode:
GetFileTime
ja wunderschön alle drei Datums-Zeitwerte ermitteln und vergleichen.
Schreibe ich nun die lokale Kopie, muß ich...
welchen der drei Datumswerte, wie, ändern?

Viele Grüße
Marco

Dejan Vu 27. Jun 2014 18:42

AW: Dateivergleich über Netzwerk
 
Wenn nur deine Anwendungen die Originaldatei ändern, und eine Änderung immer über das Datum erkennbar ist, dann reicht das doch (das Prüfen über das Datum).

Ich habe eine Anwendung, die läuft auch 100fach bei einem Kunden sowohl Anwendung als auch Konfigurationsdateien liegen im Netz. Wenn morgens alle Arbeiter die Anwendung im Netz starten würden, wäre das Netz doch ziemlich überlastet. Außerdem ist es dann nicht möglich ein Update einzuspielen. Also habe ich mir eine kleine Batchdatei geschrieben, die lokal ausgeführt wird und genau das macht, was Du vorhast:

1. Kopiere die Dateien aus dem Netz, wenn sie neuer sind als die lokale Kopie
2. Starte die lokale Kopie mit lokaler Konfiguration.

Wenn ich ein Update einspiele oder sich die Config verändert hat, geht eine Mail an alle raus 'Bitte beenden Sie die Anwendung bei Gelegenheit und starten diese dann neu'.

In einem anderen Fall macht das die Anwendung selbst, indem sie 1x pro Minute prüft, ob sich etwas am Datum der Netzanwendung geändert hat ("Huch? Die ist ja neuer als ich"), daraufhin beendet sich die Anwendung (nach Bestätigung durch den Benutzer). Die Batchdatei habe ich um eine dritte Zeile erweitert:

1. Kopiere die Dateien aus dem Netz, wenn sie neuer sind als die lokale Kopie
2. Starte die lokale Kopie mit lokaler Konfiguration.
3. Goto 1

Beenden geht dann: Die Konsole schließen, die die Batchdatei ausführt, danach die Anwendung schließen.

Sir Rufo 27. Jun 2014 20:05

AW: Dateivergleich über Netzwerk
 
Was passiert denn wenn ein Client Daten ändert?
Wie kommen diese Änderungen an den Server und in welcher Form (nur die Änderung oder die gesamte Datei)?
Sollen die überhaupt an den Server gehen?

himitsu 27. Jun 2014 21:39

AW: Dateivergleich über Netzwerk
 
Zitat:

Zitat von Dejan Vu (Beitrag 1263660)
Wenn nur deine Anwendungen die Originaldatei ändern, und eine Änderung immer über das Datum erkennbar ist, dann reicht das doch (das Prüfen über das Datum).

Da nicht verraten wurde, über welches Protokoll die Dateien abgerufen werden, war/ist halt nicht klar, ob und wenn ja wie zuverlässig das Datum ist und ob man das für den Vergleich verwenden kann.

Dejan Vu 28. Jun 2014 08:45

AW: Dateivergleich über Netzwerk
 
Unabhängig davon, das Du als Programmierer die genaue Bedeutung einer Implikation (Wenn/dann, oder 'IF...THEN') kennen solltest, schlägt er das doch selbst vor:
Zitat:

Zitat von Marco Steinebach (Beitrag 1263630)
Ich dachte, ich könnte einfach (im Pseudocode) sagen:
wenn das FileDate von Quelle und Ziel unterschiedlich ist, kopieren, sonst kannstde die lokale kopie nehmen.
...

Und eine Wortwahl wie 'FileDate' impliziert auch ein wenig, das Dateioperationen verwendet werden, und kein Wasauchimmer-Protokoll. Weiterhin bezweifle ich tiefer gehende Kenntnisse eines wie auch immer gearteten Protokolls, alleine durch die Art der Frage.
Zitat:

Zitat von p80286 (Beitrag 1263635)
Also bleibt keine andere Möglichkeit als die Originaldatei zu lesen, Dann kannst Du auch gleich kopieren.

Nun ja. Bei jeder Änderung der Netz-Datei wird einmalig der Hashwert gebildet und in einer separaten Datei abgelegt. Um das noch zu optimieren könnte die verändernde Datei die Änderungen an ihrer lokalen Kopie vornehmen, dort die Hashdatei neu setzen, und dann beides ins Netz kopieren.

Klaus01 28. Jun 2014 09:35

AW: Dateivergleich über Netzwerk
 
.. wenn nur die Hashwerte verglichen werden, weiß man nicht ob die Datei
neuer oder älter ist als die lokale Kopie.

Grüße
Klaus

Sir Rufo 28. Jun 2014 10:08

AW: Dateivergleich über Netzwerk
 
Zitat:

Zitat von Klaus01 (Beitrag 1263679)
.. wenn nur die Hashwerte verglichen werden, weiß man nicht ob die Datei
neuer oder älter ist als die lokale Kopie.

Grüße
Klaus

Ist das nicht egal, wenn die Datenhoheit beim Server liegt?

Darum ja auch meine Fragen (weiter oben). Wie sieht denn die Datenkommunikation zurück aus, bzw. wo ist das ändernde Moment der Datei auf dem Server?

Marco Steinebach 28. Jun 2014 14:56

AW: Dateivergleich über Netzwerk
 
Hallo zusammen,
stimmt, ;-), tiefergehende Kenntnisse über TCP u.ä. hab ich keine, mir ist zwar klar, wie ich eine Datei auf bzw. von einem Server kriege, das war's aber dann auch schon.
aber, in diesem Fall, ist's einfacher:
gute, alte Dateioperationen, wobei lediglich die Datei auf einem freigegebenen Netzwerklaufwerk liegt.
Wenn also ein Client Daten ändert heißt es schlicht:
Delphi-Quellcode:
{$i-
repeat
  reset (datei);
until ioresult <> 0;
{$i+}
// Datensatz suchen und neuen Inhalt ablegen
CloseFile (datei);
was verhindert, das zwei Leute gleichzeitig an der Datei rumschrauben.
Ich weiß, ich weiß, RICHTIGE Client-Server-Programme sehen definitiv anders aus, aber für diesen Anwendungsfall reichts, denn es ist kaum davon auszugehen, daß zwei Leute exakt den gleichen Record bearbeiten - und wenn doch: wer zuletzt kommt, malt zuletzt. ;-)

Ich habe jetzt einfach alle drei verfügbaren Datumswerte
Creation
LastAccess und
LastWrite
beim Kopieren mitübergeben, also die Kopie hat exakt denselben Zeitstempel wie die Server-Version, und, bis jetzt, tut das Programm, was es soll, wenn ich auf Datumsgleichheit für LastWrite bei Quelle und Ziel prüfe.

Kurze Frage noch - und ich dachte immer, ich könnte Batch-Dateien schreiben ;-):
Mit was bekommt man denn in einer Batch raus, welche von zwei Dateien neuer ist?

Herzliche Grüße und nochmal vielen Dank!
Marco

Dalai 28. Jun 2014 15:16

AW: Dateivergleich über Netzwerk
 
Zitat:

Zitat von Marco Steinebach (Beitrag 1263688)
Kurze Frage noch - und ich dachte immer, ich könnte Batch-Dateien schreiben ;-):
Mit was bekommt man denn in einer Batch raus, welche von zwei Dateien neuer ist?

Rausbekommen tut man's nicht, sondern man kopiert einfach
Code:
xcopy /D
Code:
/D:M-T-J Kopiert nur die an oder nach dem Datum geänderten Dateien.
          Ist kein Datum angegeben, werden nur Dateien kopiert,
          die neuer als die bestehenden Zieldateien sind.
MfG Dalai


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 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