【问题标题】:How to copy directories and files from one external to another C# Console如何将目录和文件从一个外部复制到另一个 C# 控制台
【发布时间】:2013-01-31 00:13:13
【问题描述】:

我在外部驱动器出现故障时非常幸运,并且在很多情况下几乎失去了一切。最后,我有了创建一个控制台应用程序的想法,该应用程序可以自动“突袭”我的两个驱动器。现在就获取目录信息而言,我得到了它。出于某种原因,尽管当我尝试从一个复制到另一个时,它说访问被拒绝?有任何想法吗?这是我到目前为止所做的。 (我只是先做我的电影和电视测试)

错误是“未经授权的访问例外:对路径'D:\External Backup\Movies and TV\Alien Quadrilogy'的访问被拒绝。”

        string _movieDIR = @"D:\External Backup\Movies and TV";
        string _movieDIR2 = @"G:\TEMP";
        string[] movies = Directory.GetDirectories(_movieDIR);


        foreach(string movie in movies)
        {
            File.Copy(movie, _movieDIR2);
        }
        Console.ReadLine();

更新完成的代码

        string _movieDIR = @"D:\External Backup\Movies and TV";
        string _movieDIR2 = @"G:\Movies and TV";
        string[] movies = Directory.GetDirectories(_movieDIR);

        if(Directory.Exists(@"G:\Movies and TV")){
            Console.WriteLine("Purging old Movies Folder in G:");
            Directory.Delete(@"G:\Movies and TV",true);
        }
        Console.WriteLine("Creating New Movies Folder in G:");
        Directory.CreateDirectory(@"G:\Movies and TV");

        double size = movies.Length;
        double percent = 0.00;
        double counter = 0;

        foreach(string movie in movies)
        {

           Console.Write("\n\nCopying " + movie.ToString());
           int pos = movie.IndexOf(@"V\");
           Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory(movie, _movieDIR2+ @"\" + movie.Substring(pos+2).ToString(),true);

           counter++;               
           percent = (counter / size)*100;
           percent = Math.Round(percent,2);
           Console.WriteLine("\n\nPercent Copied " + percent + "%\n\n");
        }
        Console.ReadLine();

【问题讨论】:

  • 您正在调用GetDirectories 并假设它们是文件来迭代结果。我想你在GetFiles..
  • 你是对的,上面的代码不起作用。我只是在两个本地目录中尝试过,但失败并显示“空白是目录而不是文件”的错误,但是这与未经授权的访问错误不同,所以还有其他事情正在进行中。
  • 出于好奇,如果在目录字符串中添加另一个反斜杠会怎样? (例如@"G:\TEMP\")
  • @SimonWhitehead 想法不错,但仍然是访问问题。
  • 非编程答案 - 考虑现有工具,如 xcopy(Windows 的一部分)或 robocopy 是否可以完成这项工作......

标签: c# file directory copy


【解决方案1】:

看起来您正在使用 File.Copy 尝试复制目录。

尝试使用以下链接中示例中的代码: http://msdn.microsoft.com/en-us/library/cc148994.aspx

【讨论】:

  • 正如我上面提到的——你是正确的,上面的代码不起作用。我只是在两个本地目录中尝试过,但失败并显示“空白是目录而不是文件”的错误,但是这与未经授权的访问错误不同,所以还有其他事情正在进行中。
  • 似乎存在权限问题
  • 很有可能。确保您可以使用 Windows 资源管理器手动复制文件。如果您要将控制台应用程序作为服务运行,请确保运行它的任何帐户也对驱动器具有权限。
  • 我拥有对这两个驱动器以及所有帐户的读/写/删除的完全访问权限。至于一项服务,我考虑过安排它,但现在只要我想双击它就足够了
【解决方案2】:

您正在尝试复制目录,但您不能。您需要遍历每个文件并单独复制它们。您还需要一些代码来确保在您的目标目录中复制了正确的文件夹树

【讨论】:

  • 再一次...我已经更正了目录问题。该错误是权限问题而不是目录问题。
  • 你说得对,我的权限是错误的,但是这个答案仍然不正确。
【解决方案3】:

如果您想复制目录,您可以使用来自Microsoft.VisualBasic 命名空间的方便的FileIO 方法。

    string _movieDIR = @"D:\External Backup\Movies and TV";
    string _movieDIR2 = @"G:\TEMP";
    string[] movies = Directory.GetDirectories(_movieDIR);

    foreach(string movie in movies)
    {
        Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory(_movieDIR, _movieDIR2);
    }

【讨论】:

  • 这仍然不是“权限”问题。有某些 API 在期望文件时传递文件夹时,您将获得未经授权的访问异常。它们具有误导性,但却是故意的。
  • 感谢@sa_ddam213 和所有帮助实现这个梦想的人
  • 正如@x0n 提到的,这些错误是由很多事情引起的。你不应该依赖这个答案来实现它。
  • @SimonWhitehead,使用Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory 遍历每个文件有什么问题?
  • @SimonWhitehead,它并不真正依赖库,它只是使用适合工作的库,我更喜欢 VB 库来处理文件,因为它干净简单,而且它具有功能向用户显示进度和选项,如覆盖、重命名和取消提示,当框架准备好时,没有必要重新发明轮子。但这只是我的看法,有些人可能更喜欢从 scratc 编写完全相同的函数并拉入 WinAPI 以显示进度对话框,这完全取决于开发人员他们喜欢什么
【解决方案4】:

这不是您认为的“权限”问题。每个说这是因为您将文件夹传递给期望文件的 API 的人都是正确的。这可以很简单地验证(在此处使用 powershell):

ps c:\temp> [io.file]::openwrite("c:\temp")
Exception calling "OpenWrite" with "1" argument(s): "Access to the path 'c:\temp' is denied."
At line:1 char:1                                                                             
+ [io.file]::OpenWrite("c:\temp")                                                            
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                                                            
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException                
    + FullyQualifiedErrorId : UnauthorizedAccessException                                    

是的,这有点奇怪,但这完全是故意的。底层的 win32 API 将返回一个访问被拒绝的 HR,最终成为 .NET 阿联酋。

【讨论】:

    【解决方案5】:

    现在我回到办公桌前,我可以完全回答了。

    您的代码不正确。 File.Copy方法的定义是:

    string sourceFileName, string destFileName
    

    您需要为两者提供完整路径。因此:

    foreach(string movie in movies)
    {
        File.Copy(movie, _movieDIR2 + "\\" + Path.GetFileName(movie));
        //                          ^^^^^ Extract the filename and append it to the directory
    }
    

    基本上,你是在说:

    Copy D:\file.avi to G:\
    

    当你应该说:

     Copy D:\file.avi to G:\file.avi
    

    我已验证您的代码适用于上述修复。

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 2012-02-15
      • 2021-02-15
      • 2021-04-13
      • 2013-06-01
      • 2014-08-12
      • 2013-10-24
      • 2011-10-24
      相关资源
      最近更新 更多