Si vous ne vous décidez vraiment besoin d' une comparaison octet par octet complet (voir d' autres réponses pour la discussion de hashing), la solution la plus simple est:
• pour les System.IO.FileInfo
instances:
public static bool AreFileContentsEqual(FileInfo fi1, FileInfo fi2) =>
fi1.Length == fi2.Length &&
(fi1.Length == 0 || File.ReadAllBytes(fi1.FullName).SequenceEqual(
File.ReadAllBytes(fi2.FullName)));
• pour les System.String
noms de chemin:
public static bool AreFileContentsEqual(String path1, String path2) =>
AreFileContentsEqual(new FileInfo(path1), new FileInfo(path2));
Contrairement à d'autres réponses postées, c'est formellement correct pour tout type de fichier: binaire, texte, médias, exécutable, etc., mais comme un complet binaire comparaison , les fichiers qui diffèrent uniquement par des moyens « sans importance » (comme nomenclature , ligne -envoi , encodage de caractères , métadonnées multimédia, espaces, remplissage, commentaires de code source, etc.) seront toujours considérés comme non égaux .
Ce code charge entièrement les deux fichiers en mémoire, il ne doit donc pas être utilisé pour comparer des fichiers vraiment gigantesques . Au-delà de cette mise en garde importante, le chargement complet n'est pas vraiment une pénalité compte tenu de la conception du .NET GC (car il est fondamentalement optimisé pour garder de petites allocations de courte durée extrêmement bon marché ), et en fait pourrait même être optimal lorsque la taille des fichiers est attendue être inférieur à 85K , car en utilisant un minimum de code utilisateur (comme indiqué ici) implique de déléguer au maximum les problèmes de performances des fichiers au CLR
, BCL
et JIT
à bénéficier de (par exemple) la dernière technologie de conception, le code du système et l' optimisation d'exécution adaptative.
En outre, pour de tels scénarios quotidiens, les préoccupations concernant les performances de la comparaison octet par octet via des LINQ
énumérateurs (comme indiqué ici) sont sans objet, car frapper le disque a̲t̲ a̲l̲l̲ pour les E / S de fichier éclipsera, de plusieurs ordres de grandeur, les avantages des différentes alternatives de comparaison de mémoire. Par exemple, même si nous SequenceEqual
donne en fait "l'optimisation" de l' abandon au premier décalage , cela n'a guère d'importance après avoir déjà récupéré le contenu des fichiers, chacun étant entièrement nécessaire pour confirmer la correspondance.