1

に2万を超えるファイルがある3レベルのサブフォルダーのセットがありますc:\MyData

私のEドライブにはほぼ同じサブフォルダーのセットがあります。e:\projects\massdata

CとEに既に存在するもの(同じフォルダ名、同じファイル名、同じサイズ)をチェックインしたいのですが、Cから削除したいのですが。

このフォルダ構造をトラバースするための最良の方法は何ですか?

4

2 に答える 2

3

結合演算子を使用するのはどうですか。このようにファイル名に参加する

public void cleanUp()
    {
        var cFiles = Directory.GetFiles(@"c:\MyData","*.*",SearchOption.AllDirectories);
        var fFiles = Directory.GetFiles(@"e:\projects\massdata","*.*",SearchOption.AllDirectories);
        Func<string, string, Tuple<string, long>> keySelector = (path, root) =>
            new Tuple<string, long>(path.Replace(root, ""), new FileInfo(path).Length);

        foreach (var file in cFiles.Join(fFiles, f => keySelector(f,@"e:\projects\massdata"), c => keySelector(c,@"c:\MyData"), (c, f) => c))
        {
            File.Delete(file);
        }
    }

更新後の2回目の編集:キーセレクターが要件を満たしているはずです。私がそれらを誤解した場合。確かに簡単なので、何を変更する必要があるかを確認してください。コメントをドロップしない場合:)

于 2010-09-10T19:03:45.623 に答える
2

各ディレクトリ内のすべてのファイルを再帰的に通過します。

ハッシュマップ内のE内のファイルの相対パス、ファイルサイズなどを説明する文字列を作成します。次に、Cを通過するときに、特定のファイルの相対パスが存在するかどうかを確認し、存在する場合は削除します。

文字列は、たとえば[FILENAME] ## [FILESIZE]##[LASTEDITER]のようになります。

C#で再帰的に検索する1つの方法は次のとおりです。http: //support.microsoft.com/kb/303974

于 2010-09-10T18:58:32.243 に答える