Entwickler-Ecke

IO, XML und Registry - C# - Kopieren von mehreren Dateien


daisyking - Mi 24.09.08 09:40
Titel: C# - Kopieren von mehreren Dateien
hallöchen an alle,

danke nochmal, dass ihr mir bei meinem 1. problem geholfen habt.

leider habe ich ist noch ein problem aufgetreten.
das problem besteht darin, wie ich bestimmte dateien (aber erstmal net pflicht) aus dem ordner a in den ordner b kopiert bekomme.

folgender code funktioniert auch, ist aber eher zum kopieren 1 datei gedacht:

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:
 private void CopyFiles()
        {
 try
            {
                string path1 = Convert.ToString(@"D:\Projekt\Debug\Test.lbl");
                string path2 = Convert.ToString(@"D:\Projekt\Sicherung\Test.lbl");

                File.Copy(path1, path2);
                MessageBox.Show("Kopieren erfolgreich");
            }
            catch (DirectoryNotFoundException e)
            {
                Console.WriteLine(e.Message);
                //MessageBox.Show("Kopieren fehlgeschlagen!");
            }
            catch (FileNotFoundException e)
            {
                Console.WriteLine(e.Message);
                //MessageBox.Show("Datei nicht gefunden");
            }
            catch (ArgumentException e)
            {
                Console.WriteLine(e.Message);
                //MessageBox.Show("Ziel- /Quellverzeichnis nicht gefunden");
            }
            catch (IOException e)
            {
                Console.WriteLine(e.Message);
            }
}


leider möchte ich erstmal den gesamten ordnerinhalt kopieren. da habe ich an folgenden code gedacht:

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:
  private void CopyFiles()
        {

string path = @"D:\Projekt\Debug";
            string path1 = @"D:\Projekt\Sicherung";

            string[] str = Directory.GetFileSystemEntries(path);
            string[] str1 = Directory.GetFileSystemEntries(path1);

            FileInfo mFile;

            for (int i = 0; i <str.Length; i++)
            {


                try
                {
                    string path2 = Convert.ToString(new FileInfo(str[i]));

                    string path3 = Convert.ToString(new FileInfo(str1[i])); 
//fehlermeldung:"The target file "D:\Projekt\Debug\.svn" is a directory, not a file."(wenn es auskommentiert ist)
                    //und "A first chance exception of type 'System.IndexOutOfRangeException' occurred in NexusLabelDesignerCForm.exe" (wenn es nicht auskommentiert ist)

                    File.Copy(path1, path2);
                    MessageBox.Show("Kopieren erfolgreich");
                }
                catch (DirectoryNotFoundException e)
                {
                    Console.WriteLine(e.Message);
                    //MessageBox.Show("Kopieren fehlgeschlagen!");
                }
                catch (FileNotFoundException e)
                {
                    Console.WriteLine(e.Message);
                    //MessageBox.Show("Datei nicht gefunden");
                }
                catch (ArgumentException e)
                {
                    Console.WriteLine(e.Message);
                    //MessageBox.Show("Ziel- /Quellverzeichnis nicht gefunden");
                }
                catch (IOException e)
                {
                    Console.WriteLine(e.Message);
                }
               
         }
        }


der letzte codeausschnitt funktioniert nur bis zum

C#-Quelltext
1:
string path2 = Convert.ToString(new FileInfo(str[i]));                    

ab da gibt er die jeweiligen exeption raus.
denke mal es ist wahrscheinlich nur ein kleiner denkfehler von mir aber ich seh wahrscheinlich den wald vor bäumen nicht. habe auch schon bücher gefälzt und im internet gegoogelt. habt ihr da vielleicht ne idee, wie man dies beheben könnte?

bestem dank im voraus

daisyking :?:

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Moderiert von user profile iconChristian S.: Topic aus WinForms verschoben am Mi 24.09.2008 um 09:41


JüTho - Mi 24.09.08 10:39

Hallo,

als erstes solltest Du Convert.ToString an mehreren Stellen rausschmeißen: Wenn es schon ein String ist wie bei "abc" und an einen string übergeben wird, ist das völlig überflüssig. Damit wird der Code auf jeden Fall übersichtlicher. Beispiel:

C#-Quelltext
1:
string path1 = @"D:\Projekt\Debug\Test.lbl";                    

Dann liegt Dein Hauptproblem darin, dass Du viel zu kompliziert denkst.

Du willst die Namen aller Dateien im Quellverzeichnis, aber vermutlich ohne Unterverzeichnisse. Also benutze doch dies:

C#-Quelltext
1:
string[] sources = Directory.GetFiles(path);                    

Die Methode GetFileSystemEntries liefert auch Unterverzeichnisse und anscheinend das aktuelle Verzeichnis mit "." zusätzlich; das führt dann zu:
Zitat:
fehlermeldung:"The target file "D:\Projekt\Debug\.svn" is a directory,


Vor dem Kopieren hast Du doch im Sicherungspfad keine Dateien, oder sie sind unwichtig.

Wozu erzeugst Du FileInfo, wenn Du es nicht benötigst und nicht benutzt? So wird doch kopiert:

C#-Quelltext
1:
File.Copy(source, dest);                    

Das wichtigste Problem reduziert sich also darauf, das Ziel richtig anzugeben. Das geht z.B. so:

C#-Quelltext
1:
string dest = Path.Combine(path1, Path.GetFileName(sources[i]));                    

Bitte beachte, dass für das Zusammensetzen eines Pfades und eines Dateinamens fast immer Path.Combine die beste Methode ist.

Für die IndexOutOfRangeException habe ich keine sofort einleuchtende Erklärung. Aber die dürfte bei Vereinfachung des Codes sowieso wegfallen.

Viel Erfolg! Jürgen


daisyking - Mi 24.09.08 16:19

Hallo Jürgen,

danke Dir, dass Du mich "aus den Urwald" geholfen hast. Mit dem komplizierten Denken hast du vollkommen recht, das haben mir schon einige Lehrer als auch Bekannte gesagt, nur es ist schwierig es abzustellen. :)

Aber zurück zum Thema:
Ich habe es mir sehr sorgfältig durchgelesen, was Du geschrieben hast und es ist folgender Code dabei rausgekommen, den ich mit einem Vergleich (wegen doppelte Dateien) modifiziert habe. Hoffe es ist richtig so.


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:
 
 private void CopyFiles()
            {
 string path = @"D:\Projekt\Debug";
            string path1 = @"D:\Projekt\Sicherung";

            string[] sources = Directory.GetFiles(path);
                                                        
            for (int i = 0; i <sources.Length; i++)
            {
                string source = Path.Combine(path, Path.GetFileName(sources[i]));
                string dest = Path.Combine(path1, Path.GetFileName(sources[i]));
                if (source != dest)
                {
                    try
                    {
                        File.Copy(source, dest);
                    }
                    catch(Exeption e)
                    {           }
                 .....
             }
           }


Besten Dank.

daisyking :gruebel:

kann man auch den code so schreiben, dass er nur bestimmte dateien kopiert? sicherlich,oder? hm, das wird aber erst später in angriff genommen, da es kein muss ist.

Moderiert von user profile iconKlabautermann: Code durch CS-Tags ersetzt


JüTho - Mi 24.09.08 17:31

user profile icondaisyking hat folgendes geschrieben:
Hoffe es ist richtig so.

Das sehe ich auch so. Aber auf die Abfrage "(source != dest)" könntest Du wirklich verzichten, weil dies durch "path != path1" gesichert ist.

user profile icondaisyking hat folgendes geschrieben:
kann man auch den code so schreiben, dass er nur bestimmte dateien kopiert? sicherlich,oder? hm, das wird aber erst später in angriff genommen, da es kein muss ist.

Ganz einfach: Schau in die SDK-Doku/MSDN. Die Dateien werden bei dieser Version mit GetFiles ausgewählt. Lies doch mal nach, ob es da nicht vielleicht eine passende Variante gibt.

Tipp: Unter NET gibt es viele Überladungen. In der SDK-Doku/MSDN findet man diese.

Jürgen


daisyking - Fr 26.09.08 15:58

Hallo,

habe bei dem GetFiles die 2. Überladung eingebracht und es funktioniert.

Vielen, vielen Dank. :flehan:

daisyking :gruebel:


DevInet - Di 21.09.10 16:16

Hallo. Ich weiss, ist vielleicht ein bischen spät, aber hab dazu mal ne Frage.

Wenn ich das richtig verstanden habe, wird bei der Methode, die ihr da rausgearbeitet habt, nur der Inhalt des Ordners "D:\Projekt\Debug", ohne die Unterordner. Right?

Meine Frage ist nun, wie muss das aussehen, damit auch die Unterordner, inklusive der enthaltenen Dateien, kopiert werden?
Ich hab es schon mit ner rekursiven Form versucht, aber die rennt beim fünften Ordner immer gegen die Wand.

Mfg
DevInet


Yogu - Di 21.09.10 16:30

user profile iconDevInet hat folgendes geschrieben Zum zitierten Posting springen:
Ich hab es schon mit ner rekursiven Form versucht, aber die rennt beim fünften Ordner immer gegen die Wand.

Zeig uns doch mal deinen Code und sage uns, wo und wie es kracht :)