Autor Beitrag
daisyking
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Mi 24.09.08 09:40 
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:
ausblenden 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:
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:
  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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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:
ausblenden C#-Quelltext
1:
File.Copy(source, dest);					

Das wichtigste Problem reduziert sich also darauf, das Ziel richtig anzugeben. Das geht z.B. so:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43

Win XP, Win 7 Prof., Linux Mandriva
C#(VS 2010), Java, php
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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 :)