Autor Beitrag
domo93
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 13.06.16 12:20 
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

ausblenden volle Höhe 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);
            }
        }
Einloggen, um Attachments anzusehen!
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173
Erhaltene Danke: 43



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173
Erhaltene Danke: 43



BeitragVerfasst: 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.