#1 8. September 2009 rekursiv kopieren moin! nachdem das kopieren über xcopy geklappt hat, hab ich mal wieder ein kopierproblem. ich möchte mit c# einen pfad angeben und sämtliche dateien und ordner von diesem pfad an einen anderen kopieren, also inklusive unterordner. hab zwar im netz einiges zu dem thema gefunden aber nichts aus dem ich wirklich schlau geworden bin. nun die frage, kann das evtl hier mal jemand erklären, also ein kleines codebeispiel und ne erklärung als würd ich die hose mit der kneifzange zu machen? soll nichts besonderes sein, einfach nur alle ordner, unterordner und dateien von a nach b. wahrscheinlich uninteressant aber besser zu viele infos als zu wenig, wähle die pfade über folderBrowserDialog aus. mfg lash + Multi-Zitat Zitieren
#2 8. September 2009 AW: rekursiv kopieren Was ist damit: C# - Ordner mit Inhalt kopieren (rekursiv) ? Das sollte funktionieren. Es ist eine rekursive Funktion, die zuerst auf den ersten Ordner angewandt. Aus diesem werden alle Ordner ausgelesen und für jeden Ordner wird die Funktion erneut ausgeführt (der neue Ordner wird dann im Zielverzeichnis erstellt). Sind im letzten Ordner (tiefste Ebene) keine Ordner mehr, dann werden alle Dateien in den Zielordner kopiert. Dann springt er in die Ebene darüber und nimmt den nächsten Ordner usw... Sollte eigentlich verständlich sein, wenn man sich ein wenig mit den verwendeten Funktionen auskennt und mit Rekursionen greez //edit: Öffne ein Verzeichnis (Quelle), erstelle es im neuen Ordner (Ziel); wiederhole dies für jeden Ordner in der Ebene darunter, bis in einem Ordner keine Ordner mehr vorhanden sind, dann kopiere alle Dateien zu dem Ziel. Springe dann wieder eine Ebene höher, bis alle Ordner abgearbeitet wurden und kopiere auch alle Daten aus diesem Ordner. + Multi-Zitat Zitieren
#3 9. September 2009 AW: rekursiv kopieren bevor ich dumm sterbe, stell ich lieber jetzt ne dumme frage. wie rufe ich diese methode auf? will das ja letztendlich auf nem buttonclick event haben. hab bisher noch nie "eigene" methoden benutzt und dann immer ein event aufgerufen zb private void button1_Click(object sender, EventArgs e) daraus wurde dann einfach button1_Click(sender, e); ich stell mich wahrscheinlich gerade einfach zu blöd an aber wie gesagt, bevor ich dumm sterbe..... mfg lash + Multi-Zitat Zitieren
#4 9. September 2009 AW: rekursiv kopieren Kopier die Funktion einfach in deine Formklasse als eigene Methode. Dann rufst du in dem Event (also zwischen private void button1_Click(object sender, EventArgs e) {<HIER>}) dies auf: this.CopyDirectoryWithIncludedFiles(QUELLSTRING, ZIELSTRING); Also so ca: Code: private void button1_Click(object sender, EventArgs e) { this.CopyDirectoryWithIncludedFiles(QUELLSTRING, ZIELSTRING); } QUELLSTRING und ZIELSTRING (z.B. C:\test\ und D:\any\where\) musst du natürlich vorher irgendwie durch Benutzeingaben bekommen (druch Folderdialoge evtl). Ist eigentlich ne recht einfache Sache greez + Multi-Zitat Zitieren
#5 9. September 2009 AW: rekursiv kopieren ganz großes kino von mir..... hab in der methode die pfade "hinzugefügt"....... also in diesem bereich: Code: // alle Unterverzeichnisse des aktuellen Verzeichnisses ermitteln string[] subDirectories = Directory.GetDirectories(dirCopySource); // Zielpfad erzeugen StringBuilder newTargetPath = new StringBuilder(); { newTargetPath.Append(dirCopyTarget); newTargetPath.Append(dirCopySource.Substring(dirCopySource.LastIndexOf(@"\"))); } is klar, dass es nich gehen kann...... noch ne frage, gibts vllt irgendwas nettes womit ich den status vom kopieren anzeigen kann? also bspw einen ladebalken oder ein fenster indem angezeigt wird, was gerade kopiert wird. + Multi-Zitat Zitieren
#6 9. September 2009 AW: rekursiv kopieren Das wird nicht so leicht werden, besonders weil es mehrere Dateien sind und du vorher nicht weißt, wie viele Dateien es sind. Du könntest vorher durch die Ordner iterieren und die Dateien zählen und jedesmal, wenn du eine kopiert hast, stept die ProgressBar ein bisschen weiter. Das ist aber auch nicht das wahre. Schau zur Not mal hier: C# - ProgressBar durch Threads steuern ?! @ .NET Archiv - tutorials.de: Tutorial, Forum, Anleitung & Hilfe greez + Multi-Zitat Zitieren
#7 9. September 2009 AW: rekursiv kopieren sry aber meine fragerei scheint kein ende zu nehmen..... abgesehen von der progressbar, neues problem. wenn die zu kopierende menge zu groß is gibts einfach keine reaktion mehr und das prog schmiert ab. wollte gerade mal als ultimativen test knapp 7 gb kopieren, ca 500mb werden kopiert, danach gibts keine reaktion mehr. wie kann ich die methode anpassen, damit auch große mengen kopiert werden können? bzw kann ich irgendwie sagen, auch wenns länger dauert, mach einfach weiter, gib nich auf + Multi-Zitat Zitieren
#8 9. September 2009 AW: rekursiv kopieren Musst am besten mit Threads arbeiten. Du meinst, dass das programm nicht reagiert oder das gar nichts mehr kopiert wird? Wenn nichts mehr kopiert wird, dann weiß ich nicht genau woran das liegen mag. Die Oberfläche regiert nicht mehr, weil das Kopierprozess im gleichen Thread geschieht wie das Anzeigen der Oberfläche. Also packst du am besten einen Thread darein, der das Kopieren übernimmt, dann bleibt deine Oberfläche auch ansprechbar Schau dir den Link an, den ich in meinem vorherigen Post gepastet hab. greez + Multi-Zitat Zitieren
#9 9. September 2009 AW: rekursiv kopieren da werd ich mich dann morgen reindenken, heute keine lust mehr^^ auf jeden fall ein großes dankeschön, ich schulde dir ein bier ich lass das thema hier nochmal offen, morgen kommen dann bestimmt meine fragen zu den threads + Multi-Zitat Zitieren
#10 10. September 2009 AW: rekursiv kopieren es wird zwar gut erklärt und wirkt auch recht einfach doch iwie will es bei mir nich.... der thread erwartet eine methode obwohl sie eigentlich drin ist..... Code: using System.Threading; //......................... //private void CopyDirectoryWithIncludedFiles(string dirCopySource, string dirCopyTarget) //{ //......................... //} Thread thread1 = new Thread(new ThreadStart(CopyDirectoryWithIncludedFiles(textBox1.Text, textBox2.Text))); thread1.Start(); //edit// sry für doppelpost, hatte noch keinen kaffee getrunken....... //und nochmal edit// bin einen kleinen schritt weiter, man kann mit ThreadStart(...) keine parameter übergeben, ich muss also ParameterizedThreadStart verwenden. allerdings hab ich immernoch keine ahnung, wie ich die parameter dann übergebe, weil wenn ich es einfach so versuche: Code: Thread thread1 = new Thread(new ParameterizedThreadStart(CopyDirectoryWithIncludedFiles(textBox1.Text, textBox2.Text))); hauts nicht hin und ich bekomme die selbe fehlermeldung, also "Methodenname erwartet" + Multi-Zitat Zitieren