Entwickler-Ecke

C# - Die Sprache - [4.5] Brauche Hilfe beim Verzeichnis synchronisieren


domo93 - Mo 13.06.16 12:20
Titel: [4.5] Brauche Hilfe beim Verzeichnis synchronisieren
Hallo Leute,

ich bräuchte etwas Hilfe bei meiner Programmieraufgabe. Ich werd sie unten im Anhang auch nochmal hochladen, aber ich beschreibe sie auch nochmal kurz. Es geht darum eine windows forms Anwendung zu erstellen, mit der man den Inhalt von einem Ordner mit einem anderen synchronisieren kann. Ich bin jetzt soweit, dass ich den Inhalt von dem alten Ordner in den neuen reinkopiere (wenn es bei einer Datei Übereinstimmung gibt, soll nachgefragt werden ob die Datei überschrieben wird falls sie neuer ist). Das Problem ist jetzt:

Es wird nur reinkopiert, d.h. wenn im neuen ordner vorher schon Datei sind, die nicht im alten sind, dann bleiben die erhalten, das soll nicht sein die Ordner sollen synchronisiert werden. Der Neue Ordner soll genau den gleichen Inhalt haben wie der Alte.

Ich lade erstmal nur die Methode mit dem Kopieren hoch, der Rest ist ja eigentlich uninteressant. Die Funktion ist Rekursiv und wird immer wieder aufgerufen bis alle Unterverzeichnisse und Dateien durch sind. Die Aufgabenstellung lade ich auch mit hoch.

Was ich vergessen habe zu sagen habs noch nicht so drauf. Bitte bei der Antwort sehr ausführlich, was wo gemacht werden muss, damit es selbst ein anfänger versteht


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
 //Methode zum Kopieren des Verzeichnisses
        private void DirectoryCopy(string quellpfad, string zielpfad, bool copyUnterverzeichnise)
        {

            try
            {
                // ermöglicht die Bearbeitung von verzeichnisen und Dateien
                DirectoryInfo myQuellDir = new DirectoryInfo(quellpfad);
                DirectoryInfo myZielDir = new DirectoryInfo(zielpfad);

                if (!myQuellDir.Exists)
                {
                    throw new DirectoryNotFoundException(
                        "Das Quellverzeichnis existiert nicht oder konnte nicht gefunden werden!"
                        + myQuellDir.Name);
                }

                // Unterverzeichnise ermitteln und ablegen
                DirectoryInfo[] myQuellDirs = myQuellDir.GetDirectories();

                // Sollte das Zielverzeichnis nicht existieren, so wird es neu erstellt
                if (!Directory.Exists(zielpfad))
                {
                    Directory.CreateDirectory(zielpfad);
                }

                FileInfo[] filesQuellDir = myQuellDir.GetFiles();
                foreach (FileInfo file in filesQuellDir)
                {

                    string temppath = Path.Combine(zielpfad, file.Name);

                    if (!File.Exists(temppath))
                    {
                        file.CopyTo(temppath, true);
                    }
                    else
                    {
                        if (File.Exists(temppath) && file.LastWriteTime > File.GetLastWriteTime(temppath))
                        {
                            file.CopyTo(temppath, true);
                        }
                        else if (File.Exists(temppath) && file.LastWriteTime < File.GetLastWriteTime(temppath))
                        {
                            DialogResult result = MessageBox.Show("Die Datei '" + file.Name +
                                "' existiert bereits!\nMöchten Sie diese mit der älteren Version überschreiben?",
                                "Datei bereits vorhanden!", MessageBoxButtons.YesNo);
                            if (result == System.Windows.Forms.DialogResult.Yes)
                            {
                                file.CopyTo(temppath, true);
                            }
                        }

                    }
                    while (progressBar1.Value < progressBar1.Maximum)
                    {
                        progressBar1.Value++;
                        progressBar1.Refresh();
                    }
                }

                if (copyUnterverzeichnise)
                {
                    foreach (DirectoryInfo subdir in myQuellDirs)
                    {
                        string temppath = Path.Combine(zielpfad, subdir.Name);
                        DirectoryCopy(subdir.FullName, temppath, copyUnterverzeichnise);
                    }
                }
            }
            catch
            {
                MessageBox.Show("Kontrollieren sie bitte die Pfadeingaben""Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


Blup - Mo 13.06.16 12:32

Du liest die Liste der Dateien im Zielpfad und löscht dort alle Dateien, die nicht im Quellpfad vorhanden sind.


domo93 - Mo 13.06.16 12:49

ja aber wie mache ich das ? Wie gesagt, mir scheitert es halt an der Umsetzung, dass ich die überflüssigen Löschen muss, das weiß ich auch. Kann man, die irgendwie vergleichen ? Damit man weiß was in beiden drin ist ?


Ralf Jansen - Mo 13.06.16 12:56

Genauso wie jetzt auch. Du vergleichst schon Quelle mit Ziel und kopierst nur bei bestimmten Bedingungen. Und jetzt machst du das gleiche nur vertauscht du beim Vergleich Quelle und Ziel und löscht dann alle Dateien die in der ursprünglichen Qelle nicht aufzufinden sind.


Blup - Mo 13.06.16 13:09

Beim Erzeugen der Exception darfst du nicht auf ein Steuerelement der Oberfläche zugreifen, sondern musst den übergebenen Quellpfad ausgeben. Das ist nicht nur schlechter Stil, sondern hier richtig falsch.

Die Schleife um den Progressbar gehört dort nicht hin. Der Progressbar soll nur um genau einen Schritt weiter gefüllt werden, nachdem eine Datei kopiert wurde. Auch hier gilt: Wenn die Methode ein Steuerelement steuern soll, übergib dieses als Parameter. Alternativ könntest du an dieser Stelle eine Methode aufrufen, die den Progressbar steuert. Eine Trennung von Funktion und Oberfläche sollte auf jeden Fall vorhanden sein.

Deine Funktion ist für die Aufgabenstellung zu einfach gestrickt, da für den Progressbar zuerst die gesamte Anzahl der erforderlichen Kopier- bzw. Löschaktionen ermittelt werden muss.