1

USB ドライブにあるいくつかのファイル、ディレクトリ、およびサブディレクトリの正確なコピーを作成し、I:/それらを入れたいC:/backup (たとえば)

USB ドライブの構造は次のとおりです。

(これは一例です。私のドライブには、より多くのファイル、ディレクトリ、およびサブディレクトリがあります)

  • コース/データ構造/db.sql

  • ゲーム/pc/pc-game.exe

  • 試験/exam01.doc


さて、これから始める方法はわかりませんが、私の最初のアイデアは、これをすべてfiles行うことです:

string[] files = Directory.GetFiles("I:");

次のステップは、ループを作成しFile.Copyて宛先パスを指定することです。

string destinationPath = @"C:/backup";

foreach (string file in files)
{
  File.Copy(file, destinationPath + "\\" + Path.GetFileName(file), true);
}

この時点で、すべてがうまく機能しますが、フォルダー構造が複製されないため、私が望んでいたわけではありません。また、次のようないくつかのエラーが発生します...

  • 最初のエラーは、私の PC 構成がすべてのフォルダーの隠しファイルを表示し、USB にはAUTORUN.INFもう隠していない隠しファイルがあり、ループがそれをコピーしようとし、その過程でこの例外が生成されるために発生します。

パス「AUTORUN.INF」へのアクセスが拒否されました。

  • 2 つ目は、一部のパスが長すぎる場合に発生し、次の例外が生成されます。

指定されたパス、ファイル名、またはその両方が長すぎます。完全修飾ファイル名は 260 文字未満、ディレクトリ名は 248 文字未満である必要があります。


そのため、これを達成し、考えられるエラーの各ケースを検証する方法がわかりません。これを行う別の方法とその方法(おそらくいくつかのライブラリ)または次の構造を持つ実装されたメソッドのようなより単純なものがあるかどうかを知りたいです:

File.CopyDrive(driveLetter, destinationFolder)

(VB.NET の回答も受け付けます)。

前もって感謝します。

4

3 に答える 3

3
public static void Copy(string src, string dest)
{
    // copy all files
    foreach (string file in Directory.GetFiles(src))
    {
        try
        {
            File.Copy(file, Path.Combine(dest, Path.GetFileName(file)));
        }
        catch (PathTooLongException)
        {
        }
        // catch any other exception that you want.
        // List of possible exceptions here: http://msdn.microsoft.com/en-us/library/c6cfw35a.aspx
    }

    // go recursive on directories
    foreach (string dir in Directory.GetDirectories(src))
    {

        // First create directory...
        // Instead of new DirectoryInfo(dir).Name, you can use any other way to get the dir name,
        // but not Path.GetDirectoryName, since it returns full dir name.
        string destSubDir = Path.Combine(dest, new DirectoryInfo(dir).Name);
        Directory.CreateDirectory(destSubDir);
        // and then go recursive
        Copy(dir, destSubDir);
    }
}

そして、あなたはそれを呼ぶことができます:

Copy(@"I:\", @"C:\Backup");

それをテストする時間がありませんでしたが、私はあなたがアイデアを得るといいのですが...

編集:上記のコードでは、Directory.Existsなどのチェックはありません。宛先パスに何らかのディレクトリ構造が存在する場合は、これらを追加できます。また、ある種の単純な同期アプリを作成しようとすると、もう存在しないファイル/フォルダーを削除したり、他のアクションを実行したりする必要があるため、少し難しくなります。

于 2012-09-13T01:19:15.763 に答える
0

CopyDirectoryオーバーロードされたクラスを調べたいと思うかもしれません

CopyDirectory(String, String, UIOption, UICancelOption)

すべてのサブディレクトリを介して再帰します。

スタンドアロンアプリケーションが必要な場合は、選択したディレクトリから別のディレクトリにコピーし、新しいファイルを上書きし、必要に応じてサブディレクトリを追加するアプリケーションを作成しました。

ただ私にメールしてください。

于 2012-09-13T12:11:02.100 に答える
0

これは通常、再帰降下パーサーから始まります。良い例を次に示します: http://msdn.microsoft.com/en-us/library/bb762914.aspx

于 2012-09-13T00:56:00.653 に答える