如何把FTP上传这个事件写在线程里?如果一次传多个文件怎么办?这个上传用的是WIN32 INTERNET API
procedure TForm1.btnUploadClick(Sender: TObject);
var
    RemoteFile: String ;
    LocalFile: String ;
    sFile: String ;
    FTPPath: String ;
    i: integer ;
    blnReturn: boolean ;
    dwInternetFlags: DWORD ;
begin
    if (hConnect <> nil) then
    begin
        FTPPath := GetFTPDirectory(hConnect) ;
        SFILE(要上传的文件名)
        LocalFile := localDir + sFile ;
        RemoteFile := FTPPath + sFile ;
        StatusBar1.Panels[0].Text := 'Uploading' ;
        blnReturn := FtpPutFile(hConnect,
                          pchar(LocalFile),
                          pchar(RemoteFile),
                          dwInternetFlags,
                          $0) ;
       end ;
    end ;
end;

解决方案 »

  1.   

    参考,一个开源的局域网LanExplorer 源代码,多线程,复制网络文件,应该有所帮助吧!!!
      

  2.   

    unit U_FtpTool;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
      IdTCPClient, IdFTP, FileCtrl,IdFTPCommon, ExtCtrls, ComCtrls,IdFTPList,
      ImgList,IdGlobal,StrUtils, ShellCtrls, Buttons, xmldom, XMLIntf,
      msxmldom, XMLDoc,comobj,activex;type
      TMyFirstThread = class(TThread)
      private  protected
        procedure Execute;override;
        procedure fail;
        procedure succeed;
      end;type
      TForm1 = class(TForm)
        IdFTP1: TIdFTP;
        ImageList1: TImageList;
        ImageList2: TImageList;
        Panel4: TPanel;
        ListBox1: TListBox;
        OpenDialog1: TOpenDialog;
        Panel1: TPanel;
        Button2: TButton;
        Button1: TButton;
        Panel2: TPanel;
        ProgressBar2: TProgressBar;
        Panel5: TPanel;
        ProgressBar1: TProgressBar;
        Label1: TLabel;
        Label2: TLabel;
        XMLDocument1: TXMLDocument;
        procedure Button2Click(Sender: TObject);
        procedure IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
          const AWorkCount: Integer);
        procedure FormCreate(Sender: TObject);
        procedure IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
          const AWorkCountMax: Integer);
        procedure IdFTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
        procedure Button1Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        ByteCount:Integer;
        YUpLoadByte:integer;
        FileSize:Integer;
        vsFileName:string;
        j:integer;
        procedure Update(Sender:TObject);
        procedure NewXML(xmlfilename:string);
      public
        Thread1:TMyFirstThread;
      end;var
      Form1: TForm1;implementationuses U_ModalDialog;{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject);
    var i:integer;
    begin
      Button1.Enabled:=False;
      Button2.Enabled:=False;
      for i:=0 to ListBox1.Items.Count-1 do
      begin
        ProgressBar2.Max:=ProgressBar2.Max+FileSizeByName(ListBox1.Items[i]);
      end;
      if not Assigned(Form2) then
         Form2:=TForm2.Create(Application);
      Form2.Show;
      Thread1:=TMyFirstThread.Create(False);
      Thread1.Priority:=tpNormal;
      Thread1.OnTerminate:=Update;
      Thread1.FreeOnTerminate:=True;
    end;
    procedure TForm1.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    begin
      ProgressBar1.Position:=AWorkCount;
      ProgressBar2.Position:=AWorkCount+YUpLoadByte;
    end;procedure TForm1.FormCreate(Sender: TObject);
    var Ls:TStringList;
    begin
      ByteCount:=0;
      YUpLoadByte:=0;
      IdFTP1.Host:='220.192.76.64';
      IdFTP1.Port:=2020;
      IdFTP1.Username:='aa';
      IdFTP1.Password:='123';
      try
        IdFTP1.Connect;
      except
        Application.MessageBox('连接服务器失败,请检查与服务器的连接','提示',64);
        Close;
      end;
      Ls:=TStringList.Create;
      IdFTP1.List(Ls);
      Ls.Free;
    end;{ TMyFirstThread }procedure TMyFirstThread.Execute;
    var i:integer;
        vsStr:string;
    begin
      for i:=0 to Form1.ListBox1.Items.Count-1 do
      begin
        Form1.ProgressBar1.Position:=0;
        Form1.ByteCount:=FileSizeByName(Form1.ListBox1.Items[i]);
        Form1.ProgressBar1.Max:=Form1.ByteCount;
        try
          Form1.IdFTP1.Put(Form1.ListBox1.Items[i],Form1.IdFTP1.RetrieveCurrentDir+'/UpLoad/'+ExtractFileName(Form1.ListBox1.Items[i]));
          Form1.vsFileName:=ExtractFileName(Form1.ListBox1.Items[i]);
          vsStr:=Copy(Form1.vsFileName,1,LastDelimiter('.',Form1.vsFileName)-1);
          Form1.NewXML(vsStr);
          Form1.IdFTP1.Put(ExtractFilePath(Application.Exename)+'XML\'+vsStr+'.xml',Form1.IdFTP1.RetrieveCurrentDir+'/UpLOad/'+vsStr+'.xml');
          Form1.IdFTP1.Quote('ExecXML');
          Form1.j:=i;
          Synchronize(succeed);
        except
          Synchronize(fail);
        end;
        Sleep(1);
      end;
    end;procedure TForm1.IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
    begin
      FileSize:=AWorkCountMax;
    end;procedure TForm1.IdFTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
    begin
      YUpLoadByte:=YUpLoadByte+FileSize;
    end;procedure TMyFirstThread.succeed;
    begin
      Form1.ListBox1.Items[Form1.j]:='@_@   '+Form1.vsFileName+'上传成功!';
    end;procedure TMyFirstThread.fail;
    begin
      Form1.ListBox1.Items[Form1.j]:=':o   '+Form1.vsFileName+'上传失败!';
    end;procedure TForm1.Button1Click(Sender: TObject);
    var i:integer;
    begin
      if OpenDialog1.Execute then
      begin
        for i:=0 to OpenDialog1.Files.Count-1 do
        begin
          ListBox1.Items.Add(OpenDialog1.Files[i]);
        end;
        Button2.Enabled:=True;
      end
      else
      begin
        Application.MessageBox('请选择要上传的文件','提示',64);
        Exit;
      end;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      if Form2<>nil then
      begin
        if Application.MessageBox('正在上传文件,是否要终止上传?','提示',MB_OkCancel+MB_IconQuestion)=ID_CANCEL then
           Action:=caNone
        else
           Action:=caFree;
      end;
    end;procedure TForm1.Update(Sender: TObject);
    begin
      Form2.Close;
      Form1.Button1.Enabled:=True;
      Form1.Button2.Enabled:=True; 
    end;procedure TForm1.NewXML(xmlfilename:string);
    var i:integer;
        node:IXMLNode;
    begin
      CoInitialize(nil);
      XMLDocument1.Active:=True;
      node:=XMLDocument1.DocumentElement;
      if node.NodeName='File' then
      begin
        for i:=0 to node.ChildNodes.Count-1 do
        begin
          node.ChildNodes[i].Text:='ssss';
        end;
      end;
      XMLDocument1.SaveToFile(ExtractFilePath(Application.Exename)+'XML\'+xmlfilename+'.xml');
      CoUnInitialize;
    end;end.楼主,这是我写的上传的代码,把上传文件写到线程里了.