我用indy分片断点传文件,客户端每次发送32K,但是在服务器端接收之后,每次写入都将原来的覆盖了,如何解决?望高手不吝赐教!服务器端处理源码:
If sCommand='StreamContent' Then
Begin
//接收文件大小
sCommand:=AThread.Connection.ReadLn();
TotalSize:=StrToInt(sCommand); //当前大小
fs:=TFileStream.Create('TestReceive.exe',fmOpenRead);
NowSize:=fs.Size;
fs.Free;
lbRecord.Items.Add(IntToStr(NowSize) + '/' + sCommand); //接收流
fs:=TFileStream.Create('TestReceive.exe',fmOpenReadWrite);
AThread.Connection.ReadStream(fs,Min(TotalSize-NowSize,AThread.Connection.RecvBufferSize),False);
//*******问题就出在上面这行,我换过打开方式为fmCreate,也不行******
fs.Free; //发送当前字节大小,如果已经完成,则发送FILEEND
fs:=TFileStream.Create('TestReceive.exe',fmOpenRead);
NowSize:=fs.Size;
If NowSize>=TotalSize Then AThread.Connection.WriteLn('FILEEND') Else
Begin
AThread.Connection.WriteLn(IntToStr(NowSize));
end;
fs.Free; //发送提示继续
AThread.Connection.WriteLn('GOON');
end;
If sCommand='StreamContent' Then
Begin
//接收文件大小
sCommand:=AThread.Connection.ReadLn();
TotalSize:=StrToInt(sCommand); //当前大小
fs:=TFileStream.Create('TestReceive.exe',fmOpenRead);
NowSize:=fs.Size;
fs.Free;
lbRecord.Items.Add(IntToStr(NowSize) + '/' + sCommand); //接收流
fs:=TFileStream.Create('TestReceive.exe',fmOpenReadWrite);
AThread.Connection.ReadStream(fs,Min(TotalSize-NowSize,AThread.Connection.RecvBufferSize),False);
//*******问题就出在上面这行,我换过打开方式为fmCreate,也不行******
fs.Free; //发送当前字节大小,如果已经完成,则发送FILEEND
fs:=TFileStream.Create('TestReceive.exe',fmOpenRead);
NowSize:=fs.Size;
If NowSize>=TotalSize Then AThread.Connection.WriteLn('FILEEND') Else
Begin
AThread.Connection.WriteLn(IntToStr(NowSize));
end;
fs.Free; //发送提示继续
AThread.Connection.WriteLn('GOON');
end;
CurrentFile: TFileStream ;
NextFile: TFileStream;
UpdateFile: File;
begin
//建立一个临时文件
if FileExists('NextTestReceive.exe') then
begin
DeleteFile('NextTestReceive.exe');
FileCreate('NextTestReceive.exe');
AssignFile(UpdateFile,'NextTestReceive.exe');
Rewrite(UpdateFile,1);
CloseFile(UpdateFile);
end; CurrentFile := TFileStream.Create('TestReceive.exe',fmOpenwrite);
CurrentFile.Seek(0,soFromEnd); NextFile := TFileStream.Create('NextTestReceive.exe',fmOpenRead);
AThread.Connection.ReadStream(NextFile, -1, True);//读
NextFile.Seek(0, soFromBeginning); CurrentFile.CopyFrom(NextFile, NextFile.Size); //追尾 CurrentFile.Free;
NextFile.Free;
end;
if FileExists('NextTestReceive.exe') then
DeleteFile('NextTestReceive.exe'); FileCreate('NextTestReceive.exe');
AssignFile(UpdateFile,'NextTestReceive.exe');
Rewrite(UpdateFile,1);
CloseFile(UpdateFile);