Hi Leute,
ich habe mir ein kleines Tool geschrieben um Dateien übers Internet auszutauschen.
Das funktioniert soweit auch erstmal bis auf das Problem, dass bei "großen" Dateien (z.B. bei knapp 400 MB)
die Meldung kommt: "Zu wenig Arbeitsspeicher".
Kompiliere ich die Anwendung als 64-bit funktioniert es ohne Probleme.
Zur Info, das System hat 16 GB
RAM.
Kann mir jemand sagen, wo ich den Fehler mache?
Bei wirklich großen Dateien hätte ich es ja verstanden aber schon bei 400 MB?
Vielen Dank schonmal!
Hier mal der Quellcode:
CLIENT
Delphi-Quellcode:
procedure TForm1.SendFile(aFileName: String);
var
fs: TFileStream;
begin
with IdTCPClient do
begin
fs := TFileStream.Create(aFileName, fmOpenRead or fmShareDenyWrite);
try
// Dateiname übertragen
IOHandler.WriteLn('FT_FILENAME:' + ExtractFileName(aFileName));
IOHandler.WriteBufferOpen;
try
// Datei übertragen
IOHandler.Write(fs, 0, True);
IOHandler.WriteBufferClose;
except
IOHandler.WriteBufferCancel;
raise;
end;
finally
fs.Free;
end;
end;
end;
SERVER
Delphi-Quellcode:
procedure TForm1.IdTCPServerExecute(AContext: TIdContext);
var
fs: TFileStream;
CommandString: String;
begin
AContext.Connection.IOHandler.CheckForDataOnSource(10);
if not AContext.Connection.IOHandler.InputBufferIsEmpty then
begin
// Befehl empfangen
CommandString := AContext.Connection.IOHandler.ReadLn;
if CommandString.StartsWith('FT_FILENAME:') then
begin
// Dateiname auslesen
CommandString := Copy(CommandString, 13, CommandString.Length - 12);
fs := TFileStream.Create('D:\TEST\' + CommandString,
fmCreate or fmShareExclusive);
with AContext.Connection do
try
// Datei empfangen
IOHandler.ReadStream(fs, -1, False);
finally
fs.Free;
end;
end;
end;
end;