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);