**急求-Delphi-多线程下载-FTP客户端-源码(或多线程关键部分)**分数倾囊相送,因此帖给分限制,可另开帖给分
**我主要是不知怎么,向FTP服务器发送命令,切分FTP服务器上的一个大文件,并让每个线程从每一 个特定的位置开始下载,在一个特定的位置结束。**我用的是Delphi7,它的idFTP组件可能没有这样一个属性或是方法可用。
**恳请高手不吝赐教。
**十分感谢!
**我主要是不知怎么,向FTP服务器发送命令,切分FTP服务器上的一个大文件,并让每个线程从每一 个特定的位置开始下载,在一个特定的位置结束。**我用的是Delphi7,它的idFTP组件可能没有这样一个属性或是方法可用。
**恳请高手不吝赐教。
**十分感谢!
procedure TDownThread.Execute;
begin
FreeOnTerminate := True; IsDown := False; ftpClient := TIdFTP.Create(nil); try
ftpClient.RecvBufferSize := 2048;
ftpClient.SendBufferSize := 2048; ftpClient.Host := FServerIp;
ftpClient.Port := FPort;
ftpClient.Username := fUserName;
ftpClient.Password := fPwd; ftpClient.OnWorkBegin := FtpWorkBegin;
ftpClient.OnWork := ftpwork;
ftpClient.OnWorkEnd := FtpWorkEnd; ftpClient.Connect(True,8000); ftpClient.ChangeDir(fDir);
IsDown := True;
ftpClient.Get(FileName,SavePath+'\'+FileName,True);
finally
ftpClient.Free;
end;
end;procedure TDownThread.FtpWork(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
if (AWorkMode = wmRead) and (IsDown = true) then
begin
FCurrentSize := AWorkCount; frm_Main.myLabel[fLines].Caption := fFileName + ' 下载进度:'+IntToStr(AWorkCount div 1024 )+'K/'+IntToStr(AllSize div 1024)+'K';
end;
end;procedure TDownThread.FtpWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
begin
//
end; procedure TDownThread.FtpWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
if (AWorkMode = wmRead) and (IsDown = true) then
begin
if (fCurrentSize + 2048) >= fAllSize then
begin
frm_Main.myLabel[fLines].Caption := fFileName+ ' 下载完毕';
frm_Main.DownCount := frm_Main.DownCount + 1;
IsDown := False;
end
else
begin
frm_Main.myLabel[fLines].Caption := fFileName+ ' 下载意外终端,请重新下载...';
frm_Main.DownCount := frm_Main.DownCount + 1;
IsDown := False;
end;
end;
end;
只有修改IdFTP.pas
或继承IdFTP自己编一个组件并编译才能实现多线程下载,
或是用IdFTP.sendcmd()来自己发送命令,
不过比较麻烦,我写的东西错误百出,对一些知识了解还不够,所以就算修改也不好下手;请高手帮忙!
FDataChannel : TIdTCPClient;
FDataChannel := TIdTCPClient.Create(nil);
FLocalFileSTr:TFileStream;
FLocalFileSTr:=TFileStream.Create('E:\临时文件\abc.doc',fmCreate);IdFTP1.UserName:='anonymous';
IdFTP1.Password:='[email protected]';
IdFTP1.Host:='127.0.0.1';
IdFTP1.Port:=21;
IdFTP1.Connect;IdFTP1.SendCmd('TYPE '+'I',200);
IdFTP1.SendCmd('PASV', 227);IdFTP1.SendPassive(VIP, VPort);//此行要改一下,只为简便起见这样写
with (FDataChannel as TIdTCPClient) do begin
Host := VIP;
Port := VPort;
Connect;
end;
IdFTP1.SendCmd('REST 1024',[350]);//设置下载断点
IdFTP1.WriteLn('RETR'+FileName);
IdFTP1.ReadStream(FLocalFileSTr,-1,True);FLocalFileSTr.Free;
IdFTP1.Abort;
IdFTP1.Quit;希望有高手出来指导;