自己用Indy控件组中的IdTCPClient1和IdTCPServer1做了一个文件传输的客户端和服务端程序,可以实现单个文件从服务端到客户端的网络传输功能,但现在在需要传输的文件有很多的情况下,一个个的传输太麻烦了,有没有办法一次性将文件夹d:\aa下包含的所有文件在不压缩的情况下一起进行传输,文件夹d:\aa下还包括文件夹bb和文件夹cc也要一起传输自己写的只能传输单个文件的部分代码:-----服务端主要代码
procedure Tfrmserver.btnsendClick(Sender: TObject);
begin
if not FileExists(edtfile.Text) then //检测文件是否存在
begin
Showmessage('文件不存在,请选择文件!');
exit;
end;
//建立文件流
AFileStream := TFileStream.Create(edtfile.Text, fmOpenRead);
RzProgressBar1.Percent:=0; ButtonBegin; //VCL开始状态设置 //服务器准备好连接
IdTCPServer1.DefaultPort := StrToIntDef(edtport.Text, 9000);
if not IdTCPServer1.Active then IdTCPServer1.Active := True;
end;procedure Tfrmserver.IdTCPServer1Execute(AThread: TIdPeerThread);
var
cmd: string; //接收到客户端的字符串信息
ASize: Integer; //需要传输的流大小
begin
with AThread.Connection do //已经连街上的一个进程
begin
cmd := UpperCase(ReadLn); //客户端发送的命令字符串 if AnsiStartsText('DATA ',cmd) then
begin
WriteLn('服务器端接收请求数据成功!');
Memo1.Lines.Add('接收到客户端请求: '+Copy(cmd,5,Length(cmd)-4));
cmd:='';
end;
if cmd = 'BEGIN' then //开始传输
begin
//告诉远程传输文件的大小和文件名
WriteLn(Format('%d|%s', [AFileStream.Size, ExtractFileName(edtfile.Text)]));
Memo1.Lines.Add('正在传输文件...');
Exit;
end;
if cmd = 'END' then
begin //传输完成
ButtonEnd;
StatusBar1.SimpleText:='';
Memo1.Lines.Add('文件传输完成!');
AFileStream.Free;
Exit;
end;
if cmd = 'CANCEL' then
begin //传输取消
Memo1.Lines.Add('文件传输被取消...[客户端]');
//保持传输状态
Exit;
end; if cmd<>'' then begin //按照指定位置传输文件
AFileStream.Seek(StrToInT(cmd), soFromBeginning); //转到文件流传输的位置
ASize := Min(AFileStream.Size - AFileStream.Position, RecvBufferSize);
//计算需要发送的大小,Min()函数在Math单元
OpenWriteBuffer; //准备发送缓冲
WriteStream(AFileStream, false, false, ASize);
//注意这个函数的参数。
CloseWriteBuffer; //结束发送缓冲
StatusBar1.SimpleText:=Format('当前文件传输位置%s/大小%d', [cmd, AFileStream.Size]); RzProgressBar1.Percent :=Trunc(AFileStream.Position/AFileStream.Size*100);
end;
end;
end;
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
---客户端主要代码
procedure TFrmClient.btnsaveClick(Sender: TObject);
var
cmd: string;
ASize, TotalSize: Int64;
AFileStream: TFileStream;
begin //IdTCPClient1.Connect; //连接
try
IdTCPClient1.WriteLn('BEGIN'); //提示服务器开始接收
Memo1.Lines.Add('正在传输文件...');
cmd := IdTCPClient1.ReadLn;
//以“|”符号分离文件名
SaveDialog1.FileName := Copy(cmd, Pos('|', cmd) + 1, Length(cmd));
if not SaveDialog1.Execute then
begin
IdTCPClient1.WriteLn('CANCEL'); //告诉服务器取消
IdTCPClient1.Disconnect; //断开连接
exit;
end;
TotalSize := StrToInt(Copy(cmd, 0, Pos('|', cmd) - 1)); //分离文件大小
RzProgressBar1.Percent := 0;
//建立文件流准备接收
AFileStream := TFileStream.Create(SaveDialog1.FileName, fmCreate);
try //循环开始接受
repeat
IdTCPClient1.WriteLn(IntToStr(AFileStream.Size));//发送当前传输的位置
ASize := Min(TotalSize - AFileStream.Size, IdTCPClient1.RecvBufferSize);
//选择剩余大小和缓冲区大小小的一个作为传输的大小
IdTCPClient1.ReadStream(AFileStream, ASize); //接收流
StatusBar1.SimpleText:=Format('当前传输位置%d/大小%d', [AFileStream.Size, TotalSize]);
Application.ProcessMessages;
RzProgressBar1.Percent := Trunc(AFileStream.Size/TotalSize*100);
until AFileStream.Size = TotalSize; //大小一致了表示结束
finally
AFileStream.Free; //释放文件流
end;
IdTCPClient1.WriteLn('END'); //提示服务器传输完成
Memo1.Lines.Add('文件传输完成!');
StatusBar1.SimpleText:='';
except
Memo1.Lines.Add('连接服务器失败或者对方已经中断传输!');
end;
IdTCPClient1.Disconnect;
end;
procedure Tfrmserver.btnsendClick(Sender: TObject);
begin
if not FileExists(edtfile.Text) then //检测文件是否存在
begin
Showmessage('文件不存在,请选择文件!');
exit;
end;
//建立文件流
AFileStream := TFileStream.Create(edtfile.Text, fmOpenRead);
RzProgressBar1.Percent:=0; ButtonBegin; //VCL开始状态设置 //服务器准备好连接
IdTCPServer1.DefaultPort := StrToIntDef(edtport.Text, 9000);
if not IdTCPServer1.Active then IdTCPServer1.Active := True;
end;procedure Tfrmserver.IdTCPServer1Execute(AThread: TIdPeerThread);
var
cmd: string; //接收到客户端的字符串信息
ASize: Integer; //需要传输的流大小
begin
with AThread.Connection do //已经连街上的一个进程
begin
cmd := UpperCase(ReadLn); //客户端发送的命令字符串 if AnsiStartsText('DATA ',cmd) then
begin
WriteLn('服务器端接收请求数据成功!');
Memo1.Lines.Add('接收到客户端请求: '+Copy(cmd,5,Length(cmd)-4));
cmd:='';
end;
if cmd = 'BEGIN' then //开始传输
begin
//告诉远程传输文件的大小和文件名
WriteLn(Format('%d|%s', [AFileStream.Size, ExtractFileName(edtfile.Text)]));
Memo1.Lines.Add('正在传输文件...');
Exit;
end;
if cmd = 'END' then
begin //传输完成
ButtonEnd;
StatusBar1.SimpleText:='';
Memo1.Lines.Add('文件传输完成!');
AFileStream.Free;
Exit;
end;
if cmd = 'CANCEL' then
begin //传输取消
Memo1.Lines.Add('文件传输被取消...[客户端]');
//保持传输状态
Exit;
end; if cmd<>'' then begin //按照指定位置传输文件
AFileStream.Seek(StrToInT(cmd), soFromBeginning); //转到文件流传输的位置
ASize := Min(AFileStream.Size - AFileStream.Position, RecvBufferSize);
//计算需要发送的大小,Min()函数在Math单元
OpenWriteBuffer; //准备发送缓冲
WriteStream(AFileStream, false, false, ASize);
//注意这个函数的参数。
CloseWriteBuffer; //结束发送缓冲
StatusBar1.SimpleText:=Format('当前文件传输位置%s/大小%d', [cmd, AFileStream.Size]); RzProgressBar1.Percent :=Trunc(AFileStream.Position/AFileStream.Size*100);
end;
end;
end;
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
---客户端主要代码
procedure TFrmClient.btnsaveClick(Sender: TObject);
var
cmd: string;
ASize, TotalSize: Int64;
AFileStream: TFileStream;
begin //IdTCPClient1.Connect; //连接
try
IdTCPClient1.WriteLn('BEGIN'); //提示服务器开始接收
Memo1.Lines.Add('正在传输文件...');
cmd := IdTCPClient1.ReadLn;
//以“|”符号分离文件名
SaveDialog1.FileName := Copy(cmd, Pos('|', cmd) + 1, Length(cmd));
if not SaveDialog1.Execute then
begin
IdTCPClient1.WriteLn('CANCEL'); //告诉服务器取消
IdTCPClient1.Disconnect; //断开连接
exit;
end;
TotalSize := StrToInt(Copy(cmd, 0, Pos('|', cmd) - 1)); //分离文件大小
RzProgressBar1.Percent := 0;
//建立文件流准备接收
AFileStream := TFileStream.Create(SaveDialog1.FileName, fmCreate);
try //循环开始接受
repeat
IdTCPClient1.WriteLn(IntToStr(AFileStream.Size));//发送当前传输的位置
ASize := Min(TotalSize - AFileStream.Size, IdTCPClient1.RecvBufferSize);
//选择剩余大小和缓冲区大小小的一个作为传输的大小
IdTCPClient1.ReadStream(AFileStream, ASize); //接收流
StatusBar1.SimpleText:=Format('当前传输位置%d/大小%d', [AFileStream.Size, TotalSize]);
Application.ProcessMessages;
RzProgressBar1.Percent := Trunc(AFileStream.Size/TotalSize*100);
until AFileStream.Size = TotalSize; //大小一致了表示结束
finally
AFileStream.Free; //释放文件流
end;
IdTCPClient1.WriteLn('END'); //提示服务器传输完成
Memo1.Lines.Add('文件传输完成!');
StatusBar1.SimpleText:='';
except
Memo1.Lines.Add('连接服务器失败或者对方已经中断传输!');
end;
IdTCPClient1.Disconnect;
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货