2010-12-11 6 views
0

J'ai deux dossiers A et B..pendant que deux dossiers beaucoup de dossiers et de fichiers sont là ... Je compare ces deux dossiers pour les fichiers non identiques avec la différence symétrique et écris le nom et le nom du répertoire dans un fichier texte. ..Je ont utilisé ce codecomparez deux dossiers pour des fichiers non identiques avec SymmetricDifference?

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 && x.LastWriteTime== y.LastWriteTime; 
     } 

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

ce que j'ai besoin est si la longueur diffère je dois écrire la longueur avec le nom de répertoire et si le nom i est différent doivent écrire le nom ainsi que le nom du répertoire ou si LastWriteTime diffère je dois écrire lastwrittime avec le nom du répertoire ... Une suggestion ??

Dans ce format:

Missed Files detail : 
--------------------- 
File Name   Size   Date  Path  


Discrepancies in File Size: 
-------------------------- 

Size     Path 


Discrepancies in File Date: 
-------------------------- 
date     path 
+0

http://msdn.microsoft.com/en-us/library/bb546137.aspx –

+0

http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_25141664.html –

+0

Un excellent exemple de mise en œuvre Linq dans comparer le contenu du fichier de deux dossiers: http://msdn.microsoft.com/en-us/library/bb882649.aspx Il a besoin de quelques ajustements. – Stefan

Répondre

1

Il me sent comme vous êtes à la recherche de choses différentes, vraiment:

  • fichiers qui sont présents dans un répertoire, mais pas l'autre (si utiliser la différence symétrique)

  • Les fichiers où ils sont présents dans les deux répertoires, mais ensuite:

    • Ceux qui diffèrent par la longueur
    • Ceux qui diffèrent par la dernière fois d'écriture

Je traiterais séparément. Vous savez déjà comment faire la première partie. Pour obtenir la deuxième partie, vous avez besoin de l'intersection des deux ensembles de noms de fichiers (utilisez simplement la méthode d'extension Intersect). A partir de là, vous pouvez lister les différences:

var differentLengths = from name in intersection 
         let file1 = new FileInfo(directory1, name) 
         let file2 = new FileInfo(directory2, name) 
         where file1.Length != file2.Length 
         select new { Name = name, 
            Length1 = file1.Length, 
            Length2 = file2.Length }; 

... vous pouvez les imprimer. Vous pouvez ensuite faire la même chose pour les dernières durées d'écriture. En d'autres termes, vous n'avez pas réellement besoin d'un comparateur qui compare toutes les propriétés à la fois.

+0

@Jon Skeet: pouvez-vous ajouter une méthode d'extension dans votre code? – bala3569

+1

@ bala3569: Non, je ne serais probablement pas dérangé par une méthode d'extension supplémentaire ici. Je crains de ne pas continuer à vous donner du code pour chaque situation que vous rencontrerez. Vous avez vraiment besoin d'apprendre LINQ pour vous maintenant. –

+0

'Intersect' fait partie de la norme LINQ - vous n'avez pas besoin d'une méthode supplémentaire pour cela. –

Questions connexes