【问题标题】:Indy FTP Client rising error, after trying to start another upload?尝试开始另一个上传后,Indy FTP 客户端上升错误?
【发布时间】:2011-11-12 08:44:14
【问题描述】:
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 会上升,以及如何解决它?

【问题讨论】:

  • 如何配置连接哪个服务器和端口?你如何配置用户名和密码?主动VS被动? Binmode vs ascii? i 曾经为您做什么?这里的代码不多,感觉应该有更多的地方有错误。
  • i - 离开过程中的其他代码段。 (删除)。服务器连接在 21 端口,传输类型为二进制,主动模式,配置为接受所有连接 - 匿名模式。
  • IdFTP 的 onWorkEnd 过程中发生的事情。

标签: delphi indy indy10


【解决方案1】:

不要使用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;

【讨论】:

  • 另一个很好的例子。非常非常感谢 Remy Leaeau aswel :) 你的评论很棒而且注意到了 :)
【解决方案2】:

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

您不需要 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');

【讨论】:

  • 这也可以,但是有没有办法按照我尝试的方式进行-在每个上传的文件之后进行某种断开连接和重新连接?
猜你喜欢
  • 1970-01-01
  • 2015-05-10
  • 2012-09-25
  • 2018-06-07
  • 2019-04-26
  • 2015-06-22
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多