2017-08-28 13 views
2

Ich schreibe eine sehr kleine App, um ein Verzeichnis von einem Ort zum anderen mit etwas zusätzlicher Automatisierung zu kopieren. Die gesamte Anwendung funktioniert einwandfrei mit Ausnahme der tatsächlichen Kopiermethode. Das Schlimmste ist, dass ich überhaupt keine Fehler bekomme, und wie die meisten von Ihnen wissen, ist das schlimmer als Fehler zu bekommen. HierC# Verzeichnis Kopieren gibt keinen Fehler, aber kopiert Verzeichnis nicht

ist die Methode in Frage:

public static bool CopyDir(string sPath, string dPath) 
     { 
      string[] files = Directory.GetFiles(sPath); 
      try 
      { 
       foreach (string file in files) 
       { 
        string name = Path.GetFileName(file); 

        foreach (string dirPath in Directory.GetDirectories(sPath, "*", 
         SearchOption.AllDirectories)) 
         Directory.CreateDirectory(dirPath.Replace(sPath, dPath)); 

        foreach (string newPath in Directory.GetFiles(sPath, "*.*", 
         SearchOption.AllDirectories)) 
         File.Copy(newPath, newPath.Replace(sPath, dPath), true); 
       } 
      } catch // this is no use because the Exception is empty. 
      { 
       return false; 
      } 
      return false; //the app keeps executing to here and I don't know why 
     } 

Variable Dump von Debugger:

  • sPath: "C:\\Users\\Jacob Jewett\\Downloads\\func1"
  • DPATH: "C:\\Users\\Jacob Jewett\\AppData\\Roaming\\.minecraft\\saves\\data\\functions\\"
  • Dateien: [0] "C:\\Users\\Jacob Jewett\\Downloads\\func1\\main.mcfunction"

Ordnerbaum von Downloads\func1 (sPath):

func1 
    main.mcfunction 

EDIT (02.33): OK also hier ist mein Überarbeitete Code, es File in use Fehler zurückgibt, aber nicht alles kopieren.

public static bool CopyDir(string sPath, string dPath) 
     { 
      try 
      { 
       foreach (string dirPath in Directory.GetDirectories(sPath, "*", 
        SearchOption.AllDirectories)) 
        Directory.CreateDirectory(dirPath.Replace(sPath, dPath)); 

       foreach (string newPath in Directory.GetFiles(dPath, "*.*", 
        SearchOption.AllDirectories)) 
        File.Copy(newPath, newPath.Replace(sPath, dPath), true); 
       return true; 
      } 
      catch (UnauthorizedAccessException e) 
      { 
       MessageBox.Show("Attempt to copy failed. Raw: "+e,"IO Error",MessageBoxButtons.OK, MessageBoxIcon.Error); 
       return false; 
      } 
     } 

EDIT (8-29-17 12.09): Ich habe einige Optimierungen der Methode gemacht und ich an einem Punkt bin, wo ich jetzt eine Access to path [path] is Denied. bekommen, die aber besser als nichts ist Ich habe noch keine funktionierende Lösung gefunden. Ich habe hier auf den Fehler gestoßen und die meisten sagen, dass File.SetAttributes() vor der File.Copy() Methode aufgerufen wird. Dies hat keine Auswirkung. Alternativ habe ich versucht, das Attribut Read-Only des Verzeichnisses sPath1 auf Keines zu setzen, bevor ein Kopiervorgang durchgeführt wurde, und dies hat auch keine Auswirkung.

Aktuelle Code:

public static bool CopyDir(string sPath, string dPath) 
{ 
    try 
    { 
     DirectoryInfo spdi = new DirectoryInfo(sPath); 
     spdi.Attributes &= ~FileAttributes.ReadOnly; 
     foreach (string dirPath in Directory.GetDirectories(sPath, "*", 
      SearchOption.AllDirectories)) 
      Directory.CreateDirectory(dirPath); 

     foreach (string newPath in Directory.GetFiles(dPath, "*.*", 
      SearchOption.AllDirectories)) 
     { 
      File.SetAttributes(dPath, FileAttributes.Normal); 
      File.Copy(sPath, newPath); 
     } 
     Directory.CreateDirectory(dPath); 
     return true; 
    } 
    catch (UnauthorizedAccessException e) 
    { 
     MessageBox.Show("Attempt to copy failed. (UAC) Raw: "+e,"IO Error",MessageBoxButtons.OK, MessageBoxIcon.Error); 
     return false; 
    } 
} 
+2

Es ist sehr wahrscheinlich, dass das 'return false' in den' catch' Block fällt. Sie treffen eine Ausnahme, aber sie wird nur verschluckt und Sie sehen den Fehler nie. –

+0

Ich habe versucht, einen besseren catch-Block hinzuzufügen, und die Ausnahmen gibt nichts zurück. Von dem, was ich sehen kann, geht es nicht einmal zum Fangblock. –

+0

Haben Sie versucht, mit dem Debugger durchzulaufen? – itsme86

Antwort

0

Edit: Ich Code wieder gelesen, und ich denke, dass ich das eigentliche Problem habe.

Die folgenden Anweisungen reichen aus, um alle Unterverzeichnisse und Dateien zum Ziel zu kopieren.

foreach (string dirPath in Directory.GetDirectories(sPath, "*", 
     SearchOption.AllDirectories)) 
     Directory.CreateDirectory(dirPath.Replace(sPath, dPath)); 

foreach (string newPath in Directory.GetFiles(sPath, "*.*", 
     SearchOption.AllDirectories)) 
     File.Copy(newPath, newPath.Replace(sPath, dPath), true); 

Die äußere Foreach ist redundant.

Hier ist Code korrigiert:

public static bool CopyDir(string sPath, string dPath) 
{ 
    try 
    { 
     foreach (string dirPath in Directory.GetDirectories(sPath, "*", 
       SearchOption.AllDirectories)) 
       Directory.CreateDirectory(dirPath.Replace(sPath, dPath)); 

     foreach (string newPath in Directory.GetFiles(sPath, "*.*", 
       SearchOption.AllDirectories)) 
       File.Copy(newPath, newPath.Replace(sPath, dPath), true); 
    } 
    catch // this is no use because the Exception is empty. 
    { 
     return false; 
    } 

    return false; //the app keeps executing to here and I don't know why 
} 

Das heißt, es ist eine gute Praxis ist etwas mit der Ausnahme im catch-Block zu tun. Selbst wenn es nur protokolliert :) Auf diese Weise können Sie es ausschließen, wenn es nicht protokolliert.

+0

Die 'string [] Dateien' sind jedoch nicht leer. Der Debugger zeigt an, dass er alle korrekten Dateien im Quellverzeichnis 'main.mcfunction' enthält. –

+0

richtig, mein schlechtes: S Bearbeitete meine Antwort, um diese Annahme zu entfernen. Der Code funktioniert jedoch immer noch an meinem Ende, also muss es etwas anderes sein. Wie sieht die Ordnerstruktur für sPath aus? –

0

Wenn Sie sagen, dass Sie keine Fehler erhalten, kopieren Sie die Dateien? Wenn ja, dann vergessen Sie vielleicht einfach, am Ende der äußeren foreach-Schleife im try-Block den Wert true zurückzugeben.

Ansonsten repliziert dieser Code eine Ordnerstruktur perfekt für mich.

try{ 
    foreach(...) 
    { 
     // etc 
    } 

    return true;  // <<<<<<-------- 
} 
catch 
{ 
} 
return false; 

Auch, wenn Sie diese in der Haupt GUI-Thread ausgeführt werden, dann geht es Dinge einzusperren und der Debugger wird wahrscheinlich beschweren sich über ein Kontext Dead-Lock-Schalter, so stellen Sie sicher, dass Sie es in einem Thread laufen .

In Bezug auf die Verwendung des Debuggers, legen Sie einen Unterbrechungspunkt, wo Sie stoppen möchten, dann verwenden Sie F10, um über eine Linie zu gehen und F11, um in eine Linie zu treten.

Verwandte Themen