**急求-Delphi-多线程下载-FTP客户端-源码(或多线程关键部分)**分数倾囊相送,因此帖给分限制,可另开帖给分
**我主要是不知怎么,向FTP服务器发送命令,切分FTP服务器上的一个大文件,并让每个线程从每一 个特定的位置开始下载,在一个特定的位置结束。**我用的是Delphi7,它的idFTP组件可能没有这样一个属性或是方法可用。
**恳请高手不吝赐教。
**十分感谢!

解决方案 »

  1.   

    我也在搞ftp开发,我是要求每天定时从服务器上下载文件
      

  2.   

    我的线程代码,不过没有分割大文件,呵呵
    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;
      

  3.   

    谢谢各位,IdFTP的Get函数不能实现多线程下载一个大文件,
    只有修改IdFTP.pas
    或继承IdFTP自己编一个组件并编译才能实现多线程下载,
    或是用IdFTP.sendcmd()来自己发送命令,
    不过比较麻烦,我写的东西错误百出,对一些知识了解还不够,所以就算修改也不好下手;请高手帮忙!
      

  4.   

    对照IdFTP.pas的Get过程和FlashGet下载工具的下载jet信息,照我的理解,基本的多线程下载模块如下:IdFTP1: TIdFTP;
    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;希望有高手出来指导;