Was ist der einfachste Weg herauszufinden, ob zwei Dateien programmatisch unterschiedlich sind?

7

Was ist der einfachste Weg, um herauszufinden, ob zwei Textdateien programmatisch unterschiedlich sind? Bei zwei Dateien muss ich nur wissen, ob sie unterschiedlich sind oder nicht. Dies ist für ein schnelles Werkzeug, um mit einer besonders fiesen Zusammenführung zu helfen (wechselte Sprachen von VB zu C # in einem Zweig (yay!) Und machte viele Änderungen in dem anderen), es wird nicht in die Produktion gehen.

Mögliche Lösungen:

  1. Hasht beide Dateien und vergleicht den Hash
  2. Ziehen Sie die Dateien ein und machen Sie einfach einen Stringvergleich
  3. Rufen Sie ein externes Diff-Tool auf (leider hat Winmerge dafür kein CLI)

Wenn es möglich wäre, den Leerraum zu ignorieren, wäre das toll, aber das ist mir egal. Die Hauptsache ist, dass es schnell und einfach gehen muss.

Ich benutze .Net 3.5sp1 übrigens. Danke für Ideen oder Hinweise.

    
Bryan Anderson 29.01.2010, 16:16
quelle

8 Antworten

11

Es gibt einen Artikel in der Microsoft Knowledge Base, hoffe, es hilft. Sie vergleichen die Bytes, um festzustellen, ob zwei Dateien unterschiedlich sind - Erstellen einer Dateivergleichsfunktion in Visual C #

    
Steffen 29.01.2010, 16:20
quelle
10

Der schnellste Weg, dies zu tun, ist das Vergleichen von Byte zu Byte der in einem Stream geladenen Dateien. Das Hacken beider Dateien dauert bei großen Dateien, String-Vergleichen und externen Tools zu lange.

Das Vergleichen von Byte zu Byte ist das Beste für Sie, da es nur den EOF der Dateien erreicht, wenn beide identisch sind.

Wenn Sie Hash-Vergleiche, Zeichenkettenvergleiche oder externe Tools ausführen, müssen Sie bei allen Vergleichen die gesamten Dateien durchgehen. Beim Vergleichen von Byte zu Byte wird dies nur dann gemacht, wenn sie identisch sind.

>     
Tufo 29.01.2010 16:19
quelle
4

Überprüfen Sie byteweise, hier ist ein Code:

%Vor%     
Alex LE 29.01.2010 16:25
quelle
3

Würden Sie mit einem MD5-Hash-Algorithmus die Ergebnisse vergleichen? Hier ist ein Beispiel .

    
t0mm13b 29.01.2010 16:20
quelle
1

Es hängt auch davon ab, was Sie zu lösen versuchen. Versuchen Sie, die Frage zu beantworten: Finden Sie in diesem Verzeichnis von N Dateien alle exakten Duplikate? Oder sind diese beiden Dateien genau gleich?

Wenn Sie nur zwei Dateien vergleichen, ist die Verwendung einer byteweisen Überprüfung effizienter.

Wenn Sie jedoch versuchen, alle doppelten Paare in N-Dateien zu finden, ist ein MD5-Hash besser, da Sie den MD5-Hashwert einmal erstellen und speichern und diesen viel kleineren Wert mit jedem Dateipaar vergleichen können. Andernfalls würden Sie jeden Datei-Byte-Stream für jede andere Datei im Verzeichnis durchlaufen.

    
Turbo 29.01.2010 16:46
quelle
1

Ich habe vor einem Jahr eine sehr spezielle Version von diff implementiert (ich hatte Dateien mit mehr als 6GB und musste dann vergleichen). Also kenne ich die internen Funktionen von diff (natürlich kopieren und einfügen). Einige Gedanken:

  • Wenn Sie einfach wissen wollen, ob sie unterschiedlich sind, vergleichen Sie sie Byte für Byte. Optimieren Sie, indem Sie überprüfen, ob ihre Größen (Längen) unterschiedlich sind, und lesen Sie dann die Dateien ein Byte nach dem anderen und prüfen Sie, ob sie unterschiedlich sind. Sie müssen sich nicht um die Pufferung kümmern, da Ihre Datei-API das für Sie tun sollte (.Net tut es).
  • Wenn es einige Regeln gibt, die Sie auf den Vergleich anwenden möchten:
    • Wenn Sie Whitespace oder ein anderes Zeichen ignorieren, während Sie das Byte lesen, prüft es, ob es ignoriert werden soll. Wenn es sollte, lesen Sie den nächsten, aber nur für diese Datei.
    • Wenn es Regeln gibt, die zeilenweise angewendet werden , lesen Sie die Datei Zeile für Zeile. Dann hasse die Zeile und ignoriere alles, was du ignorieren willst.
    • Denken Sie daran, dass diese Zeile als Datensatz variabler Länge mit einem Zeilenumbruch als Terminator (Trennzeichen) definiert werden kann. Sie können also die Zeile so definieren, dass sie genau das ist, was Sie wollen und genau das lesen, sie hashen und vergleichen.

Ich kann mit Code beitragen, wenn Sie möchten. Das Difffilieren von Dateien ist komplexer, weil Sie auch ausgeben, was anders ist.

    
Bruno Brant 29.01.2010 16:52
quelle
0

Aus der Frage - Einfachste & amp; Textdatei

%Vor%

Es ist nicht schnell oder hübsch, aber es ist einfach

    
Russell Steen 29.01.2010 16:24
quelle
0
%Vor%

Natürlich variiert das zwischen VB und C #

    
polbek 29.01.2010 16:44
quelle

Tags und Links