2010-12-14 6 views
2

Ich stieß auf diesen Code http://support.microsoft.com/kb/320348, der mich fragte, was der beste Weg wäre, 2 Dateien zu vergleichen, um herauszufinden, ob sie sich unterscheiden.Dateien byteweise vergleichen oder alle Bytes lesen?

Die Hauptidee besteht darin, mein Programm zu optimieren, das überprüfen muss, ob eine Datei gleich ist oder nicht, um eine Liste geänderter Dateien und/oder Dateien zum Löschen/Erstellen zu erstellen.

Derzeit vergleiche ich die Größe der Dateien, wenn sie übereinstimmen, werde ich in eine MD5-Prüfsumme der 2 Dateien gehen, aber nach dem Blick auf den Code zu Beginn dieser Frage fragte mich, ob es wirklich wert ist um es zu verwenden, um eine Prüfsumme der 2 Dateien zu erstellen (was ist im Grunde, nachdem Sie alle Bytes erhalten)?

Auch was andere Überprüfungen sollte ich machen, um die Arbeit in der Kontrolle jeder Datei zu reduzieren?

+0

Ich denke, das hängt stark davon ab, was du mit gleich meinst. Möchten Sie die Gleichheit des Textes in der Datei oder die tatsächlichen Bytes testen? Was ist der Inhalt der Datei? Sind Leerzeichen wichtig (Textgleichheit)? Die MD5-Prüfsumme würde einen Unterschied zwischen 2 Leerzeichen und 1 Leerzeichen am Ende einer Zeile finden, wo ein einfacher Textvergleich möglicherweise nicht möglich ist. – linuxuser27

+0

MD5 erfordert, dass beide Dateien vollständig gelesen werden und dann der Hash-Vorgang ausgeführt wird, was bei großen Dateien zeitaufwendig sein kann. – Aliostad

+0

Deshalb habe ich mich über die Frage gewundert, und Aliostad und Anon haben die Punkte gemacht, die ich wissen wollte. – Prix

Antwort

4

Lesen beide Dateien in einen kleinen Puffer (4K oder 8K), die für Lesen und dann vergleichen in Puffer-Speicher (byteweise) optimiert ist, die für den Vergleich optimiert ist.

Damit erhalten Sie eine optimale Leistung für alle Fälle (wobei der Unterschied am Anfang, in der Mitte oder am Ende liegt).

Natürlich erste Schritt ist, wenn Dateilänge unterscheidet sich zu überprüfen, und wenn das der Fall ist, Dateien sind in der Tat anders ..

+0

+1 danke, zunächst überprüfe ich bereits die Größe der Dateien, bevor Sie in die Prüfsumme gehen. Aber jetzt werde ich sicher sein, es von der Prüfsumme zu einem Strom mit einem kleinen Puffer zu ändern, auf jeden Fall werde ich beide feststellen, ob eine Datei gleich ist oder nicht, oder? Ich binär, Text oder w/e die Datei ist ... – Prix

0

Wenn Sie nicht bereits berechnet Hashes der Dateien, dann könnten Sie auch Machen Sie einen korrekten Vergleich (anstatt auf Hashes zu schauen), denn wenn die Dateien gleich sind, ist es die gleiche Menge an Arbeit, aber wenn sie anders sind, können Sie viel früher aufhören.

Natürlich ist das Vergleichen eines Bytes zu einer Zeit wahrscheinlich ein wenig verschwenderisch - wahrscheinlich eine gute Idee, ganze Blöcke auf einmal zu lesen und sie zu vergleichen.