我正在编写一个非常小的应用程序,将目录从一个地方复制到另一个地方,并增加了一些自动化功能。除了实际的复制方法之外,整个应用程序都可以完美运行。最糟糕的是我完全没有错误,而且大多数人都知道,这比得到错误更糟糕。
以下是有问题的方法:
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
}
调试器的变量转储:
"C:\\Users\\Jacob Jewett\\Downloads\\func1"
"C:\\Users\\Jacob Jewett\\AppData\\Roaming\\.minecraft\\saves\\data\\functions\\"
"C:\\Users\\Jacob Jewett\\Downloads\\func1\\main.mcfunction"
Downloads\func1
(sPath)的文件夹树:
func1
main.mcfunction
编辑(下午2:33):好的,所以这里是我的重构代码,它会返回File in use
错误,但不会复制任何内容。
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;
}
}
编辑(8-29-17 12:09 PM):我已经对方法进行了一些调整,我现在得到的是{{1 ,这比没有好,但我还没有找到一个有效的解决方案。我在这里做了一些关于错误的浏览,并且大多数人说在调用Access to path [path] is Denied.
方法之前放置File.SetAttributes()
。这没有效果。或者,我尝试在完成任何复制之前将File.Copy()
的属性Read-Only
目录设置为none,这也没有效果。
当前代码:
sPath1
答案 0 :(得分:0)
编辑:我重读了您的代码,我认为我遇到了真正的问题。
以下说明足以将所有子目录和文件复制到目标。
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
}
外部的foreach是多余的。
以下是更正后的代码:
|intval
那就是说,在catch块中对Exception做一些事情是一个好习惯。即使它只是记录它:)这样你可以在它没有记录时排除它。
答案 1 :(得分:0)
如果您说没有错误,请复制文件吗?如果是这样,那么也许你只是忘记在try块的外部foreach循环结束时返回true。
否则,此代码完全为我复制了文件夹结构。
try{
foreach(...)
{
// etc
}
return true; // <<<<<<--------
}
catch
{
}
return false;
另外,如果你在主GUI线程中运行它,那么它将会锁定并且调试器可能会抱怨上下文切换死锁,所以请确保你在一个线程中运行它。
在使用调试器方面,将断点放在要停止的位置,然后使用F10跳过一条线,使用F11跳转到一条线。