2010-12-08 2 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); 

Hier i zwei Dateien basierend auf Namen ist im Vergleich und in einer Textdatei zu schreiben ... Aber ich brauche Namen wie diese comparing two folders for non identical files? zusammen mit Verzeichnisnamen zu schreiben ...zwei Ordner für nicht identische Dateien mit Mengenlehre # Differenz und Komplement Vergleich

Irgendwelche Vorschläge?

EDIT: Ich habe zwei Ordner A und B..inside dass zwei Ordner viele Ordner und Dateien gibt es ... ich diese zwei Ordner für nicht identische Dateien mit symmetrischen Differenz am Vergleichs- und den Namen schreiben und Verzeichnisname in eine Textdatei ... mein Problem ist symmetrischer Unterschied funktioniert gut und schreibt beide nicht identische Dateinamen in eine Protokolldatei ... Aber ich muss Dateiname mit diesem Verzeichnisnamen schreiben ...

Dieser Code funktioniert einwandfrei.

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); 

Hier kann ich nicht geben, wie diese

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

@Ani: Nein, wenn ich gebe wie diese var dir1Files = dir1.GetFiles ("*", SearchOption.AllDirectories) .Wählen Sie (x => new {x.Name}); – bala3569

+0

@Ani: es ist Vergleichen und geben nicht identische Dateien..anderenfalls gibt es das gesamte Suchergebnis – bala3569

+0

@ bala3569: Ein Beispiel würde wirklich helfen. – Ani

Antwort

2

Ich denke, die beste Art und Weise, dies zu tun wäre, um Ihre eigene IEqualityComparer<FileInfo> Implementierung zu schreiben, die Ihre Definition der Gleichheit zwischen zwei Dateien erzwungen.

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(); 
    } 
} 

Und dann der Rest würde in etwa so aussehen (ungetestet):

// 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); 
+0

@Ani: das hat für mich funktioniert..danke – bala3569

+0

@Ani: wenn die Länge unterschiedlich ist, muss ich Länge zusammen mit Verzeichnisnamen schreiben oder wenn die letzte Schreibzeit sich unterscheidet muss ich die letzte Schreibzeit zusammen mit dem Verzeichnisnamen schreiben ... ist es möglich ?? – bala3569

+0

@Ani: ist es möglich ?? – bala3569

Verwandte Themen