2008-10-17 9 views

Antwort

1

Oder Sie können die beiden Dateien Byte-für-Byte ....

+0

Es ist schneller für NUR 2 Dateien als Hash-Code-Computing. Du hast eins. – TcKs

25

Hier ist eine einfache Lösung, vergleichen, die nur die beiden Dateien liest und vergleicht die Daten. Es sollte nicht langsamer als die Hash-Methode sein, da beide Methoden die gesamte Datei lesen müssen. EDIT Wie von anderen bemerkt, ist diese Implementierung wegen ihrer Einfachheit tatsächlich etwas langsamer als die Hash-Methode. Siehe unten für eine schnellere Methode.

static bool FilesAreEqual(string f1, string 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; 
} 

Sie können es ändern, mehr als ein Byte zu einem Zeitpunkt, zu lesen, aber der interne Dateistrom sollte bereits die Daten werden Pufferung, so dass selbst diese einfache Code sollte relativ schnell sein.

EDIT Danke für die Rückmeldung über die Geschwindigkeit hier. Ich behaupte immer noch, dass die Compare-all-bytes-Methode genauso schnell wie die MD5-Methode sein kann, da beide Methoden die gesamte Datei lesen müssen. Ich würde vermuten (aber nicht sicher wissen), dass, sobald die Dateien gelesen wurden, die Compare-all-bytes-Methode weniger tatsächliche Berechnung erfordert. In jedem Fall habe ich Ihre Leistungsbeobachtungen für meine erste Implementierung dupliziert, aber als ich einige einfache Pufferung hinzugefügt habe, war die Compare-all-bytes-Methode genauso schnell. Unten ist die Pufferung-Implementierung, fühlen Sie sich frei, weiter zu kommentieren!

BEARBEITEN Jon B macht noch einen guten Punkt: Wenn die Dateien tatsächlich unterschiedlich sind, kann diese Methode stoppen, sobald sie das erste andere Byte findet, während die Hash-Methode die Gesamtheit beider Dateien lesen muss in jedem Fall.

static bool FilesAreEqualFaster(string f1, string 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; 
} 
+1

Was mir besonders gefällt ist, dass Sie schon früh einen binären Unterschied feststellen, wenn Sie große Dateien gleicher Länge vergleichen. –