Gestion de fichier C #

Comment détecter en C # si deux fichiers sont absolument identiques (taille, contenu, etc.)?

Voici une solution simple, qui lit simplement les deux fichiers et compare les données. Cela ne devrait pas être plus lent que la méthode de hachage, car les deux méthodes devront lire le fichier entier. EDIT Comme noté par d’autres, cette implémentation est en réalité un peu plus lente que la méthode du hash, à cause de sa simplicité. Voir ci-dessous pour une méthode plus rapide.

static bool FilesAreEqual( ssortingng f1, ssortingng f2 ) { // get file length and make sure lengths are identical long length = new FileInfo( f1 ).Length; if( length != new FileInfo( f2 ).Length ) return false; // open both for reading using( FileStream stream1 = File.OpenRead( f1 ) ) using( FileStream stream2 = File.OpenRead( f2 ) ) { // compare content for equality int b1, b2; while( length-- > 0 ) { b1 = stream1.ReadByte(); b2 = stream2.ReadByte(); if( b1 != b2 ) return false; } } return true; } 

Vous pouvez le modifier pour lire plus d’un octet à la fois, mais le stream de fichiers interne devrait déjà mettre les données en mémoire tampon, de sorte que même ce code simple devrait être relativement rapide.

EDIT Merci pour les commentaires sur la vitesse ici. Je maintiens toujours que la méthode de comparaison de tous les octets peut être aussi rapide que la méthode MD5, car les deux méthodes doivent lire le fichier entier. Je soupçonne (mais je ne le sais pas avec certitude) qu’une fois les fichiers lus, la méthode de comparaison tout octet nécessite moins de calculs. Dans tous les cas, j’ai dupliqué vos observations de performances pour ma mise en œuvre initiale, mais lorsque j’ai ajouté une simple mise en mémoire tampon, la méthode de comparaison de tous les octets était tout aussi rapide. Ci-dessous, la mise en œuvre de la mise en mémoire tampon, n’hésitez pas à commenter davantage!

EDIT Jon B souligne un autre point positif: dans le cas où les fichiers sont réellement différents, cette méthode peut s’arrêter dès qu’elle trouve le premier octet différent, alors que la méthode de hachage doit lire l’intégralité des deux fichiers dans tous les cas.

 static bool FilesAreEqualFaster( ssortingng f1, ssortingng f2 ) { // get file length and make sure lengths are identical long length = new FileInfo( f1 ).Length; if( length != new FileInfo( f2 ).Length ) return false; byte[] buf1 = new byte[4096]; byte[] buf2 = new byte[4096]; // open both for reading using( FileStream stream1 = File.OpenRead( f1 ) ) using( FileStream stream2 = File.OpenRead( f2 ) ) { // compare content for equality int b1, b2; while( length > 0 ) { // figure out how much to read int toRead = buf1.Length; if( toRead > length ) toRead = (int)length; length -= toRead; // read a chunk from each and compare b1 = stream1.Read( buf1, 0, toRead ); b2 = stream2.Read( buf2, 0, toRead ); for( int i = 0; i < toRead; ++i ) if( buf1[i] != buf2[i] ) return false; } } return true; } 

Ou vous pouvez comparer les deux fichiers octet par octet ….