Я пытаюсь отправить файл, используя TServerSocket
/ TClientSocket
.Файл отправляется полностью, пока я нигде не освобождаю файловый поток и нигде не имею в виду событие form.OnCreate
.Если я делаю бесплатно где-нибудь, отправляется только 1 или 2 процента.
Я также должен поместить строку кода TFileStream.Create
на стороне сервера OnCreate
.Если я создаю поток в TForm2.ServerSocket1ClientRead
, то получаю EFcreateerror
: «процесс не может получить доступ к файлу, потому что он используется другим процессом».
procedure TForm2.FormCreate(Sender: TObject);
begin
FStream := TFileStream.Create('c:\temp\log.txt', fmCreate or
fmShareDenyWrite);
end;
procedure TForm2.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
var
fs: TFileStream;
begin
fs := TFileStream.Create('c:\log.txt', fmOpenRead);
socket.SendStream(fs);
end;
procedure TForm2.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
iLen: Integer;
Bfr: Pointer;
begin
iLen := Socket.ReceiveLength;
GetMem(Bfr, iLen);
Socket.ReceiveBuf(Bfr^, iLen);
FStream.Write(Bfr^, iLen);
FreeMem(bfr);
//fstream.free
end;
Даже если я добавлю свой код, этопуть:
if fstream.Size = fstream.position then
fstream.free
Даже тогда это доставляет мне проблемы.
Что это за странные явления?Это ошибка в Delphi?Если да, есть ли обходной путь?Если это имеет значение: я использую Delphi 2010.
Обновление : извините, я имел в виду, если я поставил свой код таким образом:
if fileSize = fstream.position then
fstream.free
Извините, но не fstream.size
но filesize
.Я уже инициализировал размер файла как 300000 (размер файла, который будет получен).
Решено: Решено заменой
FStream := TFileStream.Create('c:\temp\log.txt',
fmCreate or fmShareDenyWrite);
на
if not FileExists('c:\temp\log.txt') then
FStream := TFileStream.Create('c:\temp\log.txt',
fmCreate or fmShareDenyWrite);