1

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

错误是“未经授权的访问例外:访问路径 '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();
4

5 回答 5

3

如果要复制目录,可以使用命名空间中的方便FileIO方法Microsoft.VisualBasic

    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);
    }
于 2013-02-15T03:05:19.513 回答
1

这不是您认为的“权限”问题。每个说这是因为您将文件夹传递给期望文件的 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 阿联酋。

于 2013-02-15T03:33:12.607 回答
1

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

您的代码不正确。该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

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

于 2013-02-15T03:39:18.977 回答
1

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

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

于 2013-02-15T02:57:55.153 回答
1

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

于 2013-02-15T03:00:26.987 回答