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;
}
}
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. –
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. –
Avez-vous essayé d'utiliser le débogueur? – itsme86