簡體   English   中英

如何將目錄和文件從一個外部復制到另一個 C# 控制台

[英]How to copy directories and files from one external to another C# Console

我在外部驅動器失敗的情況下運氣非常糟糕,並且在很多情況下幾乎失去了一切。 最后我有了創建一個控制台應用程序的想法,它可以自動“突襲”我的兩個驅動器。 現在就獲取目錄信息而言,我得到了它。 出於某種原因,當我嘗試從一個復制到另一個時,它說訪問被拒絕? 有任何想法嗎? 這是我迄今為止所做的。 (我只是先做我的電影和電視以進行測試)

錯誤是“未經授權的訪問例外:拒絕訪問路徑 '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();

如果您想復制目錄,您可以使用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);
    }

看起來您正在使用 File.Copy 來嘗試復制目錄。

嘗試使用以下鏈接中示例中的代碼: http : //msdn.microsoft.com/en-us/library/cc148994.aspx

您正在嘗試復制目錄,但您不能這樣做。 您需要遍歷每個文件並單獨復制它們。 您還需要一些代碼來確保在目標目錄中復制正確的文件夾樹

這不是您認為的“權限”問題。 每個說這是因為您將文件夾傳遞給需要文件的 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 阿聯酋。

現在我回到我的辦公桌,我可以完全回答。

您的代碼不正確。 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

我已驗證您的代碼適用於上述修復程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM