Hallo,<p>
ich versuche mit folgender Funktion zwei Dateien zu vergleichen:<p>
<pre>
<b>function</b> FilesEqual(<b>const</b> Filename1, Filename2: <b>string)</b>: boolean;
<b>var</b>
fs1, fs2: TFileStream;
buffer1, buffer2: pointer;
buffersize: integer;
IsEqual: boolean;
ReadSize: integer;
<b>begin</b>
Result := false;
buffersize := 100;
GetMem(buffer1, BufferSize);
GetMem(buffer2, BufferSize);
<b>try</b>
fs1 := TFileStream.Create(filename1, fmOpenRead);
<b>try</b>
fs2 := TFileStream.Create(filename, fmOpenRead);
<b>try</b>
IsEqual := true;
<b>repeat</b>
ReadSize := fs1.Read(buffer1, BufferSize);
<b>* Hier passiert's... *</b>
ReadSize := fs2.Read(buffer2, BufferSize);
<b>if</b> not CompareMem(buffer1, buffer2, ReadSize) <b>then</b>
IsEqual := false;
<b>until</b>(not IsEqual) or (ReadSize < BufferSize);
<b>finally</b>
fs2.free;
<b>end</b>;
<b>finally</b>
fs1.Free;
<b>end</b>;
<b>finally</b>
FreeMem(buffer1, BufferSize);
FreeMem(buffer2, BufferSize);
<b>end</b>;
Result := IsEqual;
<b>end</b>;
</pre><p>
Dabei wird an der markierten Stelle (*) immer ein Zugriffsfehler erzeugt, d.h. die erste Zuweisung an Readsize scheint korrekt zu funktionieren, aber egal was dann kommt, die nächste Anweisung erzeugt die Zugriffsverletung - wieso? (Ich weiß, daß die doppelte Zuweisung an readsize überflüssig sein müßte, hab's nur für meine Übersicht mit reingepackt).<br>
Kann mir da irgendjemand sagen, was da falsch läuft, bitte?
<p>
Vielen Dank und viele Grüße<p>
Sascha
ich versuche mit folgender Funktion zwei Dateien zu vergleichen:<p>
<pre>
<b>function</b> FilesEqual(<b>const</b> Filename1, Filename2: <b>string)</b>: boolean;
<b>var</b>
fs1, fs2: TFileStream;
buffer1, buffer2: pointer;
buffersize: integer;
IsEqual: boolean;
ReadSize: integer;
<b>begin</b>
Result := false;
buffersize := 100;
GetMem(buffer1, BufferSize);
GetMem(buffer2, BufferSize);
<b>try</b>
fs1 := TFileStream.Create(filename1, fmOpenRead);
<b>try</b>
fs2 := TFileStream.Create(filename, fmOpenRead);
<b>try</b>
IsEqual := true;
<b>repeat</b>
ReadSize := fs1.Read(buffer1, BufferSize);
<b>* Hier passiert's... *</b>
ReadSize := fs2.Read(buffer2, BufferSize);
<b>if</b> not CompareMem(buffer1, buffer2, ReadSize) <b>then</b>
IsEqual := false;
<b>until</b>(not IsEqual) or (ReadSize < BufferSize);
<b>finally</b>
fs2.free;
<b>end</b>;
<b>finally</b>
fs1.Free;
<b>end</b>;
<b>finally</b>
FreeMem(buffer1, BufferSize);
FreeMem(buffer2, BufferSize);
<b>end</b>;
Result := IsEqual;
<b>end</b>;
</pre><p>
Dabei wird an der markierten Stelle (*) immer ein Zugriffsfehler erzeugt, d.h. die erste Zuweisung an Readsize scheint korrekt zu funktionieren, aber egal was dann kommt, die nächste Anweisung erzeugt die Zugriffsverletung - wieso? (Ich weiß, daß die doppelte Zuweisung an readsize überflüssig sein müßte, hab's nur für meine Übersicht mit reingepackt).<br>
Kann mir da irgendjemand sagen, was da falsch läuft, bitte?
<p>
Vielen Dank und viele Grüße<p>
Sascha
Comment