2017-08-28 2 views
2

J'écris une très petite application pour copier un répertoire d'un endroit à l'autre avec une automatisation supplémentaire. L'application entière fonctionne parfaitement, à l'exception de la méthode de copie réelle. Le pire, c'est que je ne reçois aucune erreur, et comme la plupart d'entre vous le savent, c'est pire que d'avoir des erreurs.C# La copie de répertoire ne renvoie aucune erreur, mais ne copie pas le répertoire

Voici la méthode en question:

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 
     } 

décharge variable du débogueur:

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

arborescence des dossiers de Downloads\func1 (sPath):

func1 
    main.mcfunction 

EDIT (14h33): Ok, donc voici mon code refactorisé, il retourne File in use erreur mais ne copie rien.

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 (29/08/17 12:09): Je l'ai fait quelques ajustements à la méthode et je suis à un point où je maintenant obtenir un Access to path [path] is Denied., ce qui est mieux que rien Je n'ai pas encore trouvé de solution de travail. J'ai fait un peu de navigation ici pour l'erreur et la plupart disent de mettre File.SetAttributes() avant que la méthode File.Copy() soit appelée. Cela n'a aucun effet. Alternativement, j'ai essayé de mettre l'attribut Read-Only du répertoire sPath1 à zéro avant que toute copie ne soit faite, et cela aussi n'a aucun effet.

Code actuel:

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

Il est très probable qu'il tape 'return false' dans le bloc' catch'. Vous frappez une exception, mais elle est simplement avalée et vous ne voyez jamais l'erreur. –

+0

J'ai essayé d'ajouter un meilleur bloc catch, et les exceptions ne retournent rien. Ça ne va même pas au bloc catch de ce que je peux voir. –

+0

Avez-vous essayé d'utiliser le débogueur? – itsme86

Répondre

0

Edit: Je relis votre code et je pense que j'ai la vraie question.

Les instructions ci-dessous sont suffisantes pour copier tous les sous-répertoires et fichiers vers la destination.

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); 

Le foreach externe est redondant.

code est corrigé ici:

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 
} 

Cela dit, il est une bonne pratique de faire quelque chose avec l'exception dans le bloc catch. Même si c'est juste la journalisation :) De cette façon, vous pouvez l'exclure si elle ne se connecte pas.

+0

les 'string [] files' ne sont pas vides cependant. Le débogueur montre qu'il contient tous les fichiers corrects dans le répertoire source, 'main.mcfunction'. –

+0

droite, mon mauvais: S Édité ma réponse pour supprimer cette hypothèse. Le code fonctionne quand même sur ma fin, donc ça doit être autre chose. À quoi ressemble la structure des dossiers pour sPath? –

0

Lorsque vous dites que vous n'obtenez pas d'erreurs, copiez-vous les fichiers? Si oui, alors peut-être vous oubliez simplement de retourner vrai à la fin de la boucle foreach externe dans le bloc try. Sinon, ce code répliquait parfaitement une structure de dossiers pour moi.

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

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

De plus, si vous utilisez ce dans le fil de l'interface principale puis il va verrouiller les choses et le débogueur se plaindra probablement d'un changement de contexte de verrouillage mort, alors assurez-vous de l'exécuter dans un thread .

En termes d'utilisation du débogueur, placez un point d'arrêt à l'endroit où vous voulez vous arrêter, puis utilisez F10 pour enjamber une ligne et F11 pour avancer dans une ligne.