C#目录复制不会返回任何错误,但不会复制目录

时间:2017-08-28 17:09:07

标签: c# directory copy system

我正在编写一个非常小的应用程序,将目录从一个地方复制到另一个地方,并增加了一些自动化功能。除了实际的复制方法之外,整个应用程序都可以完美运行。最糟糕的是我完全没有错误,而且大多数人都知道,这比得到错误更糟糕。

以下是有问题的方法:

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
        }

调试器的变量转储:

  • sPath:"C:\\Users\\Jacob Jewett\\Downloads\\func1"
  • dPath:"C:\\Users\\Jacob Jewett\\AppData\\Roaming\\.minecraft\\saves\\data\\functions\\"
  • 文件:[0] "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

2 个答案:

答案 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跳转到一条线。