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;
}
}
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. –
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. –
Haben Sie versucht, mit dem Debugger durchzulaufen? – itsme86