2010-12-08 59 views
2
var dir1Files = dir1.GetFiles("*", SearchOption.AllDirectories); 
var dir2Files = dir2.GetFiles("*", SearchOption.AllDirectories); 

var difference = dir1Files.ToHashSet(); 
difference.SymmetricExceptWith(dir2Files); 

string[] foo1 = difference.Select(c => c.Name).ToArray(); 
File.WriteAllLines(@"d:\log1.txt", foo1); 

我在這裏根據名稱,然後在文本文件中寫入比較兩個文件...但我需要用目錄名一起寫的名字是這樣comparing two folders for non identical files? ......比較非完全相同的文件,兩個文件夾與對稱差

有何建議?

編輯: 我有兩個文件夾A和B..inside這兩個文件夾的文件夾地段和文件是否有... 我對非完全相同的文件,這兩個文件夾比較對稱差和寫名字和目錄名成一個文本文件...我的問題是對稱的區別是工作正常,並將兩個不相同的文件名寫入一個日誌文件...但我必須用該目錄名寫入文件名...

此代碼工作正常

var dir1Files = dir1.GetFiles("*", SearchOption.AllDirectories).Select(x => new { x.Name, x.Length }); 
var dir2Files = dir2.GetFiles("*", SearchOption.AllDirectories).Select(x => new { x.Name, x.Length }); 
var difference = dir1Files.ToHashSet();  
difference.SymmetricExceptWith(dir2Files); 
string[] foo1 = difference.Select(c => c.Name).ToArray(); 
File.WriteAllLines(@"d:\log1.txt", foo1); 

在這裏我不能放棄這樣的

string[] foo1 = difference.Select(c => c.Name+""+c.DirectoryName).ToArray(); 
+0

@Ani:沒有,如果我給這樣的VAR dir1Files = dir1.GetFiles( 「*」,SearchOption.AllDirectories ).Select(x => new {x.Name}); – bala3569 2010-12-08 14:19:33

+0

@Ani:它是比較並給出不相同的文件。其他它是給整個搜索結果 – bala3569 2010-12-08 14:20:41

回答

2

我認爲這樣做是寫自己的IEqualityComparer<FileInfo>實施強迫兩個文件之間的平等定義的最佳途徑。

public class FileInfoNameLengthEqualityComparer : EqualityComparer<FileInfo> 
{ 
    public override bool Equals(FileInfo x, FileInfo y) 
    { 
     if (x == y) 
      return true; 

     if (x == null || y == null) 
      return false; 

     // 2 files are equal if their names and lengths are identical. 
     return x.Name == y.Name && x.Length == y.Length; 
    } 

    public override int GetHashCode(FileInfo obj) 
    { 
     return obj == null 
       ? 0 : obj.Name.GetHashCode()^obj.Length.GetHashCode(); 
    } 
} 

然後它的其餘部分會看起來像(未經測試):

// Construct custom equality-comparer. 
var comparer = new FileInfoNameLengthEqualityComparer(); 

// Create sets of files from each directory. 
var sets = new[] { dir1, dir2 } 
       .Select(d => d.GetFiles("*", SearchOption.AllDirectories)) 
       .Select(files => new HashSet<FileInfo>(files, comparer)) 
       .ToArray(); 

// Make the first set contain the set-difference as determined 
// by the equality-comparer. 
sets[0].SymmetricExceptWith(sets[1]); 

// Project each file to its full name and write the file-names 
// to the log-file. 
var lines = sets[0].Select(fileInfo => fileInfo.FullName).ToArray(); 
File.WriteAllLines(@"d:\log1.txt", lines); 
相關問題