Zwei Dateien miteinander vergleichen



  • Ja das klingt alles sehr logisch. Ist MD5 denn soviel schneller?? Es muss doch auch erstmal diesen Wert berechnen und die Datei muss ja auch eingelesen werden.



  • Ein zeichenweiser Vergleich ist schneller sein als ein Hash. (Hätte man vielleicht vorher dran denken dürfen 🙄). Insbesondere, wenn Du erwartest, dass die Dateien in der Regel unterschiedlich sind. Dann liest Du ja nur bis zum ersten unterschiedlichen Zeichen ein.

    Der Hash ist genau dann hilfreich, wenn Du den Vergleich mehrfach ausführen musst, weil Du den Hash nur einmal berechnen musst. (Z.B. doppelte Dateien auf der Festplatte finden)



  • Öffne die Dateien binär und lese sie in einen buffer rein mit read().
    Dann einfach mit gcount() schauen ob die Länge des eingelesenen ungleich ist wenn ja dann sind die Dateien halt ungleich.

    Wenn nicht halt einfach den Inhalt der beiden Puffer vergleichen und das solange bis das ende der Dateien erreicht wurde 😃

    char buf1[1024], buf2[1024];
    
    ...
    
    do {
         datei1.read((char*)buf1, sizeof(buf1));
         datei2.read((char*)buf2, sizeof(buf2));
    
         if(datei1.gcount() != f2.gcount())
         {
              cout <<"Ungleich";
              // Dateien schließen
              return 0;
         }
    
         //Puffer Inhalte vergleichen
    
         for(int i=0;i<datei1.gcount();++i)
             if(buf1[i] != buf2[i]
             {
                cout <<"Ungleich";
                // Dateien schließen
                return 0;
             }
       } while (!datei1.eof() && !datei2.eof());
    
       cout <<"Gleich";
    
      // blablabla
    

    EDIT:: Irgendwie schaffe ich es immer der letzte auf einer Seite zu sein 😃 😃



  • Ich würde es so machen

    1. Vergleich der größe ( wenn unterschiedlich gleich stoppen )
    2. datei öffnen und

    solange true zeilenweise einlesen
    die akt. zeile von a mit b vergleichen, falls ungleich dann FLAG gleich auf FALSE setzen und nicht weiter prüfen



  • ich machs immer so:

    -größe vergleichen... wenn ungleich abbrechen
    -schaun ob beide leer sind... wenn ja abbrechen
    -buffer mit größe dateigröße * 2 anlegen
    -die eine in die erste hälfte kopiern, die zweite in die zweite hälfte
    -memcmp aufrufen um den speicherbereich zu vergleichen

    wenn ich viele dateien vergleich leg ich außerdem noch n extrabuffer von 1mb an und allokier nur neuen speicher wenn dateigröße * 2 > 1mb



  • Ich glaube es ist schneller wenn man in kleineren Blöcken vergleicht, dann muss man nicht immer die ganze Datei einlesen. Z.b. immer 128bytes oder so...



  • hmm stimmt
    vorausgesetzt die dateien unterscheiden sich nich am ende



  • Ich glaube der Threaderstelle wollte nur wissen ob "gleich" oder "ungleich".

    😃



  • Thomas Millan schrieb:

    Hallo,
    ich wuerde gern eine noch schnellere Methode haben

    nö denk ich nich :p



  • 128Bytes sind zu klein -> zu viele Plattenzugriffe

    Wenns optimal sein soll immer die komplette übertragbare Blockgröße einlesen.



  • frosty schrieb:

    128Bytes sind zu klein -> zu viele Plattenzugriffe

    Wenns optimal sein soll immer die komplette übertragbare Blockgröße einlesen.

    Gibts nen Unterschied zwischen der max. übertragbaren Blockgröße und der Blockgröße des Dateisystems?



  • Ja gibt es. Die Blockgröße innerhalb des Dateisystems kann eigentlich fast beliebig gewählt werden. Dafür muß man sich nur mal verschiedene Betriebssysteme und die FS Blockgrößen ansehen. Bestes Beispiel UNIX/Linux: Unix SVR3 512Bytes, Linux 4096Bytes. Kann aber bei Linux auch verändert werden.


Anmelden zum Antworten