Danke, Stevie, du hast mich auf die Idee gebracht. Mir ist gerade wieder ein Parameter von WriteStream eingefallen der das, was du gemacht hast, von selbst erledigt. Und zwar
AWriteByteCount. Wenn dieser true ist, wird die Größe des Streams nämlich automatisch mit WriteInteger (mal nebenbei, WriteInteger hättest du auch verwenden können
) verschickt. Nun muss man nur noch vor der ReadStream Methode die Größe mit ReadInteger abfangen und ReadStream als Parameter übergeben. Bingo.
Die Größe von SendBufferSize zu verändern nützt reichlich wenig, zumahl die Maximalgröße bei 32768 Bytes liegt. Diese Eigenschaft gibt nur an, wieviel Bytes (maximal) immer auf einmal gesendet werden.
Also, der Finale Code:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
fs: TFileStream;
begin
if not OpenDialog1.Execute then exit;
with IdTCPClient1 do
begin
fs := TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareDenyWrite);
Connect;
try
OpenWriteBuffer;
try
WriteStream(fs, true, true, 0); //das 2. true ist das entscheidende
CloseWriteBuffer;
except
CancelWriteBuffer;
raise;
end;
finally
Disconnect;
fs.Free;
end;
end;
end;
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
fs: TFileStream;
SizeOfIncomingStream: integer;
begin
if not SaveDialog1.Execute then exit;
fs := TFileStream.Create(SaveDialog1.Filename, fmCreate or fmShareExclusive);
with AThread.Connection do
try
SizeOfIncomingStream := ReadInteger;
ReadStream(fs, SizeOfIncomingStream);
finally
Disconnect;
fs.Free;
end;
end;
Also nochmal vielen Dank Stevie!