に2万を超えるファイルがある3レベルのサブフォルダーのセットがありますc:\MyData
。
私のEドライブにはほぼ同じサブフォルダーのセットがあります。e:\projects\massdata
CとEに既に存在するもの(同じフォルダ名、同じファイル名、同じサイズ)をチェックインしたいのですが、Cから削除したいのですが。
このフォルダ構造をトラバースするための最良の方法は何ですか?
に2万を超えるファイルがある3レベルのサブフォルダーのセットがありますc:\MyData
。
私のEドライブにはほぼ同じサブフォルダーのセットがあります。e:\projects\massdata
CとEに既に存在するもの(同じフォルダ名、同じファイル名、同じサイズ)をチェックインしたいのですが、Cから削除したいのですが。
このフォルダ構造をトラバースするための最良の方法は何ですか?
結合演算子を使用するのはどうですか。このようにファイル名に参加する
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回目の編集:キーセレクターが要件を満たしているはずです。私がそれらを誤解した場合。確かに簡単なので、何を変更する必要があるかを確認してください。コメントをドロップしない場合:)
各ディレクトリ内のすべてのファイルを再帰的に通過します。
ハッシュマップ内のE内のファイルの相対パス、ファイルサイズなどを説明する文字列を作成します。次に、Cを通過するときに、特定のファイルの相対パスが存在するかどうかを確認し、存在する場合は削除します。
文字列は、たとえば[FILENAME] ## [FILESIZE]##[LASTEDITER]のようになります。
C#で再帰的に検索する1つの方法は次のとおりです。http: //support.microsoft.com/kb/303974