1

私は外付けドライブが故障し、多くの場合ほとんどすべてを失ったという恐ろしい運がありました。最後に、2台のドライブを自動的に「レイド」するコンソールアプリを作成するというアイデアがありました。今、ディレクトリ情報を取得する限り、私はそれを取得しました。何らかの理由で、一方から他方にコピーしようとすると、アクセスが拒否されたと表示されますか?何か案は?これは私がこれまでに行ったことです。(私は最初にテストのために映画とテレビをやっています)

エラーは「不正なアクセスの例外:パス'D:\ External Backup \ Movies and TV \AlienQuadrilogy'へのアクセスが拒否されました」です。

        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

File.Copyを使用してディレクトリをコピーしようとしているようです。

次のリンクの例のコードを使用してみてください:http: //msdn.microsoft.com/en-us/library/cc148994.aspx

于 2013-02-15T02:57:55.153 に答える
1

ディレクトリをコピーしようとしていますが、コピーできません。各ファイルを繰り返し処理して、個別にコピーする必要があります。また、ターゲットディレクトリに正しいフォルダツリーが複製されていることを確認するためのコードも必要になります

于 2013-02-15T03:00:26.987 に答える
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                                    

はい、それは少し奇妙ですが、それは完全に意図的です。基盤となるwin32APIは、アクセスが拒否されたHRを返し、最終的には.NETUAEになります。

于 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 に答える