Ошибка FTP-клиента Indy, после попытки начать другую загрузку? - PullRequest
2 голосов
/ 12 ноября 2011
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 поднимается и как ее исправить?

Ответы [ 2 ]

4 голосов
/ 12 ноября 2011

НЕ используйте события 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;
3 голосов
/ 12 ноября 2011

Ошибка 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');
...