C# Ordner abgleichen

Atreju93

Lieutenant
Registriert
Nov. 2010
Beiträge
595
Hallo zusammen

Ich habe eine etwas komplexe Frage.

Ich arbeite daran, ein Programm zu schreiben, welches zwei Laufwerke, oder Zwei ordner miteinaner abgleichen kann.

Hier ist auch schon der Kniff, eine "normale" synchronisation beruht darauf, dass eines der Master und das Andere des Slave ist, somit ist das Eine eine Kopie des Anderen. Wenn ich auf A was lösche, ist es auf B auch gelöscht, wenn ich auf B etwas hinzufüge, wird es gelöscht und nicht auch auf A hinzugefügt.

ich möchte, dass nur neue Dateien von BEIDEN ordnern oder Laufwerken (wie auch immer), kopiert werden. Also zuerst wird von A alles nach B kopiert, was in B nicht vorhanden ist, und dann von B alles in A kopiert, was in A nicht vorhanden ist.

Dazu wäre noch eine Überprüfung der Datei/Ordnergrösse gut, damit Ordner/dateien die gleich heissen, aber ev grösser/kleiner sind auch (nach Nachfrage) ersetzt werden.

Lösungen im Internet basieren nach meiner Suche keine auf diesem Prinzip..

habt ihr eine Lösung?

Gruss

Atreju
 
Also
Zuerst habe ich das ganze in Batch schonmal gemacht, dann in VB. Die Batch hatte x Funktionen, ergab auch fast 3'000 codezeilen in Batch(!) in VB keine grosse Sache.

Ganz ehrlich warum ich das mache?
Bin Informatiker i.A. und möchte mir C# für die Schule etwas näher bringen und versuche so etas C#zu machen. Habe schon etliche Projekte gemacht.

Zudem haben wir im Moment in der Firma nicht allzuviel Arbeit, also habe ich Zeit für soetwas..

Ich möchte mich Weiterbilden.. deshalb dieses Projekt..
 
Und wo ist genau das Problem? In deinem Eingangspost fragst du ja nach einer "Komplettlösung", wenn ich es richtig verstanden habe.
 
Also, bis jetzt bin ich soweit:

Ich habe eine Funktion erstellt, die ich mit CopyDirectory(quelle, ziel); aufrufe:

Code:
            private void CopyDirectory(string sourceDirectory, string destDirectory)
            {
                DirectoryInfo ds = new DirectoryInfo(sourceDirectory);
                if (!Directory.Exists(destDirectory))
                    Directory.CreateDirectory(destDirectory);

                foreach (DirectoryInfo d in ds.GetDirectories())
                {
                    CopyDirectory(d.FullName, destDirectory + "\\" + d.Name);
                }

                foreach (FileInfo f in ds.GetFiles())
                {
                    f.CopyTo(destDirectory + "\\" + f.Name, true);
                }

Hier habe ich aber das Problem, dass ich nicht angeben kann, dass er mich mit einem Dialogfeld Fragt, ob er Dateien+ odner, die gleich Heissen ,aber nicht gleich gross sind, ob er sie überschreiben soll oder nicht.
 
Atreju93 schrieb:
Dialogfeld Fragt, ob er Dateien+ odner, die gleich Heissen ,aber nicht gleich gross sind, ob er sie überschreiben soll oder nicht.

Einmal am Anfang oder jedes mal wenn eine doppelte Datei gefunden wird?
 
Jedes Mal, wenn eine Doppelte Datei gefunden wird.
Aber nur, wenn sie sich in der Grösse Unterscheidet. Also nicht das "normale" Copy von Windows, das auch bei gleichem Namen nachfragt.

Falls Dateinamen + grösse gleich ist, soll er sie einfach überspringen. Falls Dateinamen gleich, aber Grösse ungleich ist, soll er nachfragen...
 
Das Dialogfenster kannst du so realisieren:
Code:
if (MessageBox.Show("Die Datei " + dateiname + " ist bereits vorhanden.\nSoll sie überschrieben werden?", "Frage", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
       // Überschreiben
}

oder ging es dir darum wie du die Größe überprüfst?
 
Hi,

hast du das nicht gefunden?

Microsoft LINQ Anleitung

Finde ich eigentlich einen sehr schönen Ansatz, noch dazu ist gleich als Übung LINQ mit dabei!

Die Ansätze gäbe es auch noch:

Synchronize Folders

Klasse "FolderSync"

Ich denke, die Sache mit der unterschiedlichen Größe wirst du selber implementieren müssen. Evtl auch unterschiedliches Datum und gleiche Größe, das neuere gilt.

Aber der Grundstock ist damit schon mal gelegt. Vielleicht hilft es dir :)

VG,
Mad
 
Zurück
Oben