[C#] rekursiv kopieren

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Lash, 8. September 2009 .

Schlagworte:
  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
     
  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.
     
  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
     
  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
     
  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.
     
  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
     
  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
     
  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
     
  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
     
  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"
     
  11. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.