2010-12-14 5 views
2

Je suis tombé sur ce code http://support.microsoft.com/kb/320348 qui m'a fait me demander quelle serait la meilleure façon de comparer 2 fichiers afin de savoir s'ils diffèrent.Comparer les fichiers octet par octet ou lire tous les octets?

L'idée principale est d'optimiser mon programme qui doit vérifier si un fichier est égal ou non pour créer une liste de fichiers modifiés et/ou de fichiers à supprimer/créer. Actuellement, je compare la taille des fichiers s'ils correspondent je vais aller dans une somme de contrôle md5 des 2 fichiers, mais après avoir regardé ce code lié au début de cette question, je me suis demandé si cela vaut vraiment la peine pour l'utiliser sur la création d'une somme de contrôle des 2 fichiers (ce qui est essentiellement après avoir obtenu tous les octets)?

Aussi quelles autres vérifications dois-je faire pour réduire le travail de vérifier chaque fichier?

+0

Je pense que cela dépend fortement de ce que vous voulez dire par égal. Voulez-vous tester l'égalité du texte dans le fichier ou les octets réels? Quel est le contenu du fichier? Les espaces sont-ils importants (égalité des textes)? La somme de contrôle MD5 trouverait un diff entre 2 espaces et 1 espace à la fin d'une ligne, où une comparaison de texte simple pourrait ne pas. – linuxuser27

+0

MD5 nécessite la lecture complète des deux fichiers, puis le hachage, ce qui peut prendre du temps pour les fichiers volumineux. – Aliostad

+0

C'est pourquoi je m'interrogeais sur la question et Aliostad et Anon ont fait valoir les points que je voulais savoir. – Prix

Répondre

4

lire les deux fichiers dans un petit tampon (4K ou 8K) qui est optimisé pour la lecture et ensuite comparer les tampons qui est optimisé pour on compare en mémoire (octet par octet). Cela vous donnera des performances optimales pour tous les cas (où la différence est au début, au milieu ou à la fin).

Bien sûr, la première étape consiste à vérifier si la longueur du fichier diffère et si tel est le cas, les fichiers sont en effet différents ..

+0

+ 1 merci, au départ, je vérifie déjà la taille des fichiers avant de passer à la somme de contrôle. Mais maintenant je vais être sûr de le changer de somme de contrôle à un flux avec un petit tampon, en tout cas je vais détecter si un fichier est iqual ou pas droit? Je binaire, texte ou w/e le fichier est ... – Prix

0

Si vous ne l'avez pas déjà calculés hash des fichiers, alors vous pourriez aussi bien faites une comparaison correcte (au lieu de regarder les hachages), car si les fichiers sont identiques, c'est la même quantité de travail, mais s'ils sont différents, vous pouvez vous arrêter beaucoup plus tôt.

Bien sûr, comparer un octet à la fois est probablement un gaspillage - probablement une bonne idée de lire des blocs entiers à la fois et de les comparer.