Laden...

Synchronisation von Dateien übers Netzwerk: Wie angehen?

Erstellt von marcelws vor 20 Jahren Letzter Beitrag vor 20 Jahren 9.555 Views
M
marcelws Themenstarter:in
309 Beiträge seit 2004
vor 20 Jahren
Synchronisation von Dateien übers Netzwerk: Wie angehen?

hallo,

ich habe erst vor ein paar wochen mit c# angefangen. habe bisher vorwiegend
mit vb6 gearbeitet (in der ausbildung). ){gray}nun würde ich mir gerne als übung
ein synchronisations tool schreiben, das meine projekte am pc mit dem laptop
sync. und umgekehrt natürlich. dabei sollen dann nur anhand der ordnernamen
& ggf. dem datum der änderung die entsprechenden ordner hin- und
hergeschoben werden. nix dolles eben. aber es soll ja auch nen sinnvolles
übungsprojekt sein 😉.

ab april werde ich eine .NET schulung bei siemens machen und bis dahin
wollte ich das eigentlich hinbekommen, weil dann auch recht nützlich 🙂.

nur habe ich schonmal leider von vornerein keinen blassen schimmer von
netzwerkprogrammierung. und das ist schonmal der erste schritt für mich.
ohne netzwerkverbindung keine sync. 😦.

für alle tipps/ tricks & hints bin ich euch jetzt schon mehr als dankbar!!

grüße
Marcel

C
980 Beiträge seit 2003
vor 20 Jahren

Die dinger sind wirklich praktisch, ich nutze dazu immer noch FileSync 😉

Der Einstiegspunkt ist für dich wohl der System.Net.Sockets Namespace. Ich empfehle für diese Anwendung das TCP Protokoll, und somit die beiden Klassen TcpClient für den virtuellen Client und TcpListener für den virtuellen Server. Durch die durchgehende Abstrahierung im .NET Framework auf Streams ist das ganze nicht viel schwieriger als das Schreiben einer Datei im Dateisystem:

TcpClient Class

TcpListener Class

M
marcelws Themenstarter:in
309 Beiträge seit 2004
vor 20 Jahren

dank dir vielmals. ich werde mir das morgen mal ansehen und dann mit an sicherheit grenzender wahrscheinlichkeit auf dich zurückkommen 😉
du redest vom stream....wird es so easy wie bswp mit FSO unter VB?

grüße
Marcel

C
980 Beiträge seit 2003
vor 20 Jahren

btw: um files zu synchronisieren wäre es wohl noch einfacher, das CIFS/NBT Protokoll zu nutzen, bzw. das Betriebssystem es nutzen und als virtuelles Dateisystem abbilden zu lassen (UNC, z.b. "\servername\sharename\datei.txt") ... dann brauchst dazu allerdings gar kein Networking mehr, was wohl das Ziel der ganzen Übung ist 😉

M
marcelws Themenstarter:in
309 Beiträge seit 2004
vor 20 Jahren

hehe....ich hab zwar keinen schimmer wovon du da redest aber du hast sicher recht 😉
nun, ich hab mir das grad doch nochmal kurz angesehen. ich kann ja nicht erwarten gleich alles zu verstehen...aber:
kannst du mir vielleicht sagen was ich alles für die verbindung brauche bis ich die files transferieren kann?
so eine art.......1. connection object......2. recordset object.......3. command object usw.
muss dann auf dem "server" auch noch was laufen damit ich die daten schicken, bzw. überhaupt erst eine verbindung bekomme?
nur so eine kurze grobe übersicht wäre wirklich super 🙂!

grüße
Marcel

G
205 Beiträge seit 2003
vor 20 Jahren

Vielleicht hilft dies hier auch noch ein wenig weiter
http://www.uni-koblenz.de/~hagbard/csharp/csharp.html

M
marcelws Themenstarter:in
309 Beiträge seit 2004
vor 20 Jahren

vielen Dank! ! Das sieht doch mal super aus 🙂...Jetzt muss ich mir nur noch Copy&Paste verkneifen und lernen 😉.
Nochmal kurz zurück:

  1. Muss ich in diesem Projekt auch einen Server schreiben der dann bspw auf meinem pc zum Einsatz kommt? (sync per LAN &&|| INet)

  2. In dem Beispielscript wird der host als string übergeben. Ich sagte ich bin blöd, nur wie lautet der des 2ten pc's. localhost ist je meiner. Ich habe versucht die IP adresse zu nutzen, das funktioniert aber nicht. Oder geht es nur deshalb nicht weil noch kein Server dort läuft (mit der IP meine ich?)

So, die 2 Fragen sollten für jetzt erstmal reichen 😉...ihr helft einem blutigem Netzwerkanfänger, also macht euch auf dumme Fragen gefasst 🙂

viele grüße
Marcel

M
marcelws Themenstarter:in
309 Beiträge seit 2004
vor 20 Jahren

zusatz:

ich habe grade festgestellt das System.Windows & System.Drawing bei mir nicht implementiert werden können. habe ich mir mein framework zerschossen?
habe gestern erst SP2 & danach 1.1 installiert!?

grüße
Marcel

M
marcelws Themenstarter:in
309 Beiträge seit 2004
vor 20 Jahren

erledigt...war in einer konsolenanwendung...schäm....
bitte schaut nach dem thread weiter oben....nicht das der jetzt versinkt 😉

grüße
Marcel

G
205 Beiträge seit 2003
vor 20 Jahren

Das mit dem Server kommt drauf an wie du die Daten wegsichern willst...
Du kannst wenn du lust hast einen schreiben, oder dies auch ohne einen eigenen Server realisieren...

C
980 Beiträge seit 2003
vor 20 Jahren

Original von marcelws

  1. Muss ich in diesem Projekt auch einen Server schreiben der dann bspw auf meinem pc zum Einsatz kommt? (sync per LAN &&|| INet)

Wenn du (wie ich annehme) nicht CIFS verwendet willst musst du natürlich neben dem Client (-> TcpClient) auch einen Server (-> TcpListener) schreiben, der dann auf die Verbindung vom Client wartet ... (die app kann natürlich auch gleichzeitig Server und Client sein..)

X
36 Beiträge seit 2004
vor 20 Jahren

hier schau dir das mal an:

hier

EDIT: omg sry hab oben nich gesehen das der link schon gepostet wurde!!

gruß X-I2ated

M
marcelws Themenstarter:in
309 Beiträge seit 2004
vor 20 Jahren

nur so zwischendurch : DANKE ! !

kommen noch viel mehr Fragen 😉

grüße
Marcel

C
980 Beiträge seit 2003
vor 20 Jahren

btw: ein etwas anderer ansatz, mittels .NET Remoting:

http://www.codeproject.com/csharp/Laptop_Backup.asp

M
marcelws Themenstarter:in
309 Beiträge seit 2004
vor 20 Jahren
Dateisystem

Also ich glaube ich schaue mir das mit dem Netzwerk später an. Erstmal muss ich mir ein paar TCP/IP Tutorials durchlesen (links willkommen 😉). Ich werde jetzt erstmal die anderen Klassen schreiben und das ganze lokal testen. Das Netzwerk kann ich ja später immer noch implementieren.
Wenn ichs nicht verstehe hilft es ja am ende auch nix.

Nun zu meinem Problem:
Wie bekomme ich ein "Folderobjekt"?

StreamReader file;
file = new File.OpenText("file.dat");
....ist ja klar.

Nur, wie geht das mit den Ordner? Nur ein kleiner Tipp! (den Rest muss ich selber rausfinden) Bitte keine fertigen Skripte!

grüße
Marcel

N
4.644 Beiträge seit 2004
vor 20 Jahren

Die Klassen Directory und DirectoryInfo beinhalten Methoden für Verzeichnisse.
Ist es das was Du suchst?

M
marcelws Themenstarter:in
309 Beiträge seit 2004
vor 20 Jahren

Ja dank Dir! Hab ich auch grade gefunden 🙂 ich habe die ganze Zeit nach "Folder" und "Ordner" gesucht......hehe

Marcel

M
marcelws Themenstarter:in
309 Beiträge seit 2004
vor 20 Jahren
Array || Container

Ich würde gerne Wissen ob ich für die Speicherung der Folders & Files ein Array oder besser einen Conainer nutzen soll. Welches von beiden ist schneller?

Ein erster Ansatz sieht etwa so aus: (erstmal nur alle Folders in Array speichern)

public class CFolders
    {   
        private string[] clientFolder;
        private string[] hostFolder;
        private string[] subFolder;


        // Alle Subfolders in ClientFolder	
        public void GetClientFolders(string ClientPath)
        {
            clientFolder = Directory.GetDirectories(ClientPath);

            foreach(string elem in clientFolder)
            {
                Console.WriteLine(elem);    
                GetSubFolders(elem,1);
            }
        }
        // Alle Subfolders in HostFolder	
        public void GetHostFolders(string HostPath)
        {
            hostFolder = Directory.GetDirectories(HostPath);

            foreach(string elem in hostFolder)
            {
                Console.WriteLine(elem);    
                GetSubFolders(elem,2);
            }
        }
        
        private void GetSubFolders(string SubPath, byte ID)
        {
            subFolder = Directory.GetDirectories(SubPath);
            if (subFolder.Length != 0)
            {
                    foreach (string elem in subFolder)
                 {
                     Console.WriteLine(elem);
                     if ( ID == 1)
                         GetClientFolders(elem);
                     else
                         GetHostFolders(elem);
                 }
            }   
        }
    }

grüße
Marcel

M
marcelws Themenstarter:in
309 Beiträge seit 2004
vor 20 Jahren

hat sich schon erledigt. Ich muss ja eh Container nehmen (Capacity = Count)

grüße
Marcel

PS: aber was wäre denn trotzdem schneller?

C
980 Beiträge seit 2003
vor 20 Jahren

Nun ja, welches schneller ist hängt von einer Vielzahl an Faktoren an: anzahl zu erwartende einträge, manipulationen, reihenfolge (sortiert? egal?), anzahl zugriffe, etc... auch für einen Ring Buffer, der wachsen können muss, arbeite ich z.b. sicher mit arrays und nicht mit Collections ...

btw: http://www.gotdotnet.com/team/libraries/FxCopRules/NamingRules.aspx (das zweitunterste) 😉

M
marcelws Themenstarter:in
309 Beiträge seit 2004
vor 20 Jahren
datum vergleichen

hallo zusammen,

also langsam komme ich vorran 🙂. War doch eine gute Idee dieses Projekt als Übung zu nehmen!

Meine Frage:
Wie zum Henker kann ich zwei DateTime objekte auf <≥ prüfen?
Mein Verusch sieht so aus:

string cPath = Convert.ToString(CEnumerator.Key);
string hPath = path;
                 
                    DateTime hostFileDate = Directory.GetLastWriteTime(hPath);
                    DateTime clientFileDate = Directory.GetLastWriteTime(cPath);
                    
                    if ( hostFileDate.Date == clientFileDate.Date)
                        Console.WriteLine("Beide Ordner haben das gleiche Datum!");
                    else if ( hostFileDate.Date < clientFileDate.Date )
                        Console.WriteLine("Client_Ordner ist neuer!");
                    else
                        Console.WriteLine("Client_Ordner ist älter!");

aber irgendwie klappt das nur mit dem Datum. Das allein hilft mir ja nix. Die Uhrzeit der letzten Änderung ist ja bei == auch wichtig und muss geprüft werden.
Habt ihr eine Idee?
Jetzt wär mir ein Codeschnipsel schon lieb 😉

viele Grüße
Marcel

N
4.644 Beiträge seit 2004
vor 20 Jahren

Ich würde es so machen:

if ( hostFileDate == clientFileDate)
{
    Console.WriteLine("Beide Ordner haben das gleiche Datum!");
}
else if ( hostFileDate < clientFileDate )
    Console.WriteLine("Client_Ordner ist neuer!");
else
    Console.WriteLine("Client_Ordner ist älter!");
C
980 Beiträge seit 2003
vor 20 Jahren

Original von marcelws
hostFileDate.Date

(Die Date Eigenschaft liefert das Datum, also wird auch nur das Datum verglichen)

M
marcelws Themenstarter:in
309 Beiträge seit 2004
vor 20 Jahren

genau das ist ja mein problem. wie kann ich das machen?
muss ich datum & uhrzeit seperat vergleichen? wenn ja wie? wenn nein, wie kann ich das gesamte datum vergleichen?

so hätte ich es ja gern:

wenn das datum1 incl. uhrzeit <≥ als das datum2 incl. uhrzeit dann

grüße
Marcel

M
marcelws Themenstarter:in
309 Beiträge seit 2004
vor 20 Jahren

geht es nicht einfacher als so:

if ( hostFileDate.Date == clientFileDate.Date)
{
   Console.WriteLine("Beide Ordner haben das gleiche Datum!");
       if ( hostFileDate.Hour == clientFileDate.Hour )
             Console.WriteLine("Ordner sind gleich alt!");
       else if ( hostFileDate.Hour < clientFileDate.Hour )
             Console.WriteLine("Host_Ordner ist älter!");
       else
             Console.WriteLine("Host_Ordner ist neuer");
}.......
C
980 Beiträge seit 2003
vor 20 Jahren

Warum vergleichst du nicht einfach die DateTime instanzen? Noodles Vorschlag funktioniert nicht?

M
marcelws Themenstarter:in
309 Beiträge seit 2004
vor 20 Jahren

ich habe es glaube vorhin selber mal so versucht, es ging nicht.
so wie oben geht es ja jetzt nur bekomme ich an einer stelle eine falsche ausgabe...siehe markierung

du meinst mit equals? da bekomme ich aber doch nur true || false zurück oder?

grüße
Marcel

C
980 Beiträge seit 2003
vor 20 Jahren

Vergleichst du im Beispiel jetzt die die zeitlose Instanz oder die mit zeit?

also

hostFileDate == clientFileDate

oder

hostFileDate.Date == clientFileDate.Date

?

Die Date Eigenschaft liefert übrigens wieder eine DateTime Instanz zurück, aber mit der Zeit 0:00 ...

M
marcelws Themenstarter:in
309 Beiträge seit 2004
vor 20 Jahren

wie oben im listing ( 3 vor ) die mit zeit

N
4.644 Beiträge seit 2004
vor 20 Jahren

Was ich gepostet sollte aber funktionieren, da ich es selbst getestet hab.

M
marcelws Themenstarter:in
309 Beiträge seit 2004
vor 20 Jahren

ok ich versuch das nochmal....brb

Marcel

M
marcelws Themenstarter:in
309 Beiträge seit 2004
vor 20 Jahren

funktioniert 🙂------>dank dir!

Marcel

M
marcelws Themenstarter:in
309 Beiträge seit 2004
vor 20 Jahren
So....die Klassen sind fertig :-)

Heute hab ich eigentlich soweit alles fertig was die Synchronisation angeht.
Der gesamte Abgleich der Folders & Files ist fertig. Die zu kopierenden Folders & Files speichere ich in Containern. Jetzt könnte ich dann einfach den Inhalt an den entsprechenden Ort kopieren. Danke hier erstmal für eure Ünterstützung.

Jetzt gehts dann ans eingemacht ( für mich jedenfalls 😉)

Es wäre super wenn ihr mir die verschiedenen Möglichkeiten der Netzwerkübertragung mal aufzeigen könntet.
Welche Möglichkeiten gibt es.....welche sollte man für was nutzen?
Es gibt ja auch noch USB.....es würde auch Sinn machen eine Möglichkeit der Übertragung per USB2.0 zu Implementieren.....Netzwerk ist allerdings Primär damit ich die Daten auch aus nem Biergarten Synchronisieren könnte.

viele Grüße
Marcel

M
marcelws Themenstarter:in
309 Beiträge seit 2004
vor 20 Jahren

...weiß niemand was?

grüße
Marcel

C
980 Beiträge seit 2003
vor 20 Jahren

Naja, Netzwerke sind ein grosses Kapitel ... auf Layer 4 würd ich sicher mit TCP arbeiten, vorzugsweise über das IP Layer 3 Protokoll ... mit den unteren Layern würd ich mich gar nicht erst beschäftigen (wenn das System das IP Protokoll neben Ethernet auch für UBS implementiert gut, nehm ich aber im gegensatz zu Firewire nicht an) ... wenn du IP nutzen kannst, dann kannst du da immer auch eine TCP Verbindung aufbauen, und im Gegensatz zu UDP musst du dich mit TCP nicht um die Fehlerkorrektur, Reihenfolge etc. kümmern. Ausserdem ist TCP im .NET Framework mit dem System.Net Namespace sehr einfach zu nutzen ...