2
IdFTP: TIdFTP;
...
procedure TForm1.IdFTPWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
   IdFTP.Disconnect;

   try

      IdFTP.Connect;

      IdFTP.ChangeDir( directory );
      IdFTP.Put( fileName, ExtractFileName( fileName ) );

   except

   end;

end;

这是大部分代码。我希望在 1 上传完成时再启动另一个,但是这段代码似乎会出现错误 10048。

  • 将文件和命令序列上传到服务器是否正确?
  • 为什么这个错误 10048 正在上升,以及如何解决它?
4

2 回答 2

4

不要使用OnWork...事件来驱动您的业务逻辑!它们仅用于状态。在大多数情况下,Indy 不是事件驱动的,除了一些例外。

在这种情况下,OnWorkEnd在原始文件数据传输之后但在服务器对上传的响应已经接收和处理之前触发。上传另一个文件的正确方法是Put()在上一次调用退出后再次调用Put(),例如:

procedure TForm1.UploadFiles;
begin
  try
    IdFTP.Connect;
    try
      while (there is a file to upload) do
      begin
        if (directory is different than current) then
          IdFTP.ChangeDir(directory);
        IdFTP.Put(fileName, ExtractFileName(fileName));
      end;
    finally
      IdFTP.Disconnect;
    end;
  except
    on E: Exception do
      ShowMessage(E.Message);
  end;
end;
于 2011-11-12T16:49:52.980 回答
3

错误 10048 = 套接字已在使用中:信息

您不需要 WorkEnd 事件,Put 语句在完成上传文件后返回:

  // loop
  for I := 0 to files.Count-1 do
  begin
    idFtp1.Connect;
    idFtp1.Put(files[i]);
    idFtp1.Disconnect;
  end;

  // or
  idFtp1.Put('MyFirstFile');
  idFtp1.DisConnect;
  // ......
  idFtp1.Connect;
  idFtp1.ChangeDir('DirSecondFile');
  idFtp1.Put('MySecondFile');
于 2011-11-12T12:39:27.437 回答