Delphi-Funktion vergleicht den Inhalt von zwei TStream?

8

Ich muss vergleichen, ob zwei TStream Nachkommen denselben Inhalt haben . Das einzige interessante Ergebnis für mich ist das boolesche Ja / Nein.

Ich werde eine einfache Schleife codieren, die Byte um Byte den Inhalt des Streams prüft.

Aber ich bin neugierig um zu wissen, ob es eine bereits existierende Funktion gibt. Ich habe keine internen DelphiXE oder JCL / JVCL-Bibliotheken gefunden.

Natürlich haben die beiden Streams die gleiche Größe!

    
TridenT 05.01.2011, 15:39
quelle

4 Antworten

12

Genau, wie Nickolay O sagte, sollten Sie Ihren Stream in Blöcken lesen und CompareMem verwenden. Hier ist ein Beispiel (einschließlich der Größe Test) ...

%Vor%     
user532231 05.01.2011, 16:18
quelle
6

Die Funktion IsIdenticalStreams , die von daemon_x gepostet wird, ist ausgezeichnet - benötigt jedoch eine Anpassung, um ordnungsgemäß zu funktionieren. (Uwe Raabe hat das Problem bereits bemerkt.) Es ist kritisch, dass Sie die Stream-Positionen vor dem Start der Schleife zurücksetzen - oder diese Prozedur wird wahrscheinlich eine falsche TRUE zurückgeben, wenn auf die zwei Streams bereits außerhalb dieser Funktion zugegriffen wurde.

Dies ist die endgültige Lösung, die jedes Mal funktioniert. Ich habe die Funktion umbenannt, um sie an meine Namenskonventionen anzupassen. Danke daemon_x für die elegante Lösung.

%Vor%     
Mike 27.05.2011 01:38
quelle
5

Es gibt keine solche eingebaute Funktion. Nur eins kann ich empfehlen - Lese nicht Byte für Byte, sondern Blöcke von 16-64kbytes, das wäre viel schneller.

    
Nickolay Olshevsky 05.01.2011 15:41
quelle
4

Antworten von user532231 und Mike funktionieren in 99% der Fälle, aber es müssen zusätzliche Prüfungen durchgeführt werden !

Nachkommen von TStream können fast alles sein, also es ist nicht garantiert, dass Stream.Read die gleiche Menge an Daten zurückgibt , auch wenn Streams die gleiche Länge haben (Stream-Nachkommen können auch Daten herunterladen, also kann readed = 0 Bytes zurückgeben, während auf den nächsten Chunk gewartet wird). Streams können sich auch auf völlig anderen Medien befinden und Stream-Lesefehler können nur bei einem auftreten.

Bei 100% Arbeitscode sollten alle diese Prüfungen durchgeführt werden. Ich habe die Funktion von Mike modifiziert.

Wenn diese Funktion zum Beispiel verwendet wird, um Stream 2 neu zu schreiben, wenn nicht identisch mit Stream1, sollten alle Fehler überprüft werden. Wenn das Funktionsergebnis True ist, ist alles in Ordnung, aber wenn es False ist, wäre es sehr schlau zu überprüfen, ob Streams tatsächlich verschieden sind oder nur ein Fehler aufgetreten ist.

Bearbeitet: Einige zusätzliche Prüfungen, FilesAreIdentical-Funktion basierend auf dem Beispiel von StreamsAreIdentical und Verwendung hinzugefügt.

%Vor%     
david 26.12.2013 13:43
quelle

Tags und Links