Delphi idFTP пример скачивания файла с ftp

Недавно писал себе программулину, сливающую резервные копии с фтп сервера на локальный тазик, и пришлось сесть подразобраться с Indy компонентом idFTP.
Для начала на форму выкинем кнопку, об зовем ее Download, и компонент idFTP из закладки Indy Clients, должно получиться нечто похожее на постер к посту (см. выше 😉 )
Чтож, полпути пройдено, теперь в обработчике событий для нажатия кнопки пишем следующий код:


procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  idFTP.Username:= 'backuper';
  idFTP.Password:= 'xxxxxxxxxxxxx';
  idFTP.Host:= 'ip_ftp_servera';
  idFTP.Passive:= True;
  if idFTP.Connected then
    begin
      idFTP.Disconnect;
try
    idFTP.Connect(True);
  except
    on E : Exception do
      ShowMessage('Ошибка подключения: '+E.Message);
  end;
  if idFTP.Connected then
    try
      idFTP.Get('test.rar', 'c:/temp/test.rar', True);
    except
      on E : Exception do
        ShowMessage('Ошибка скачивания файла: '+E.Message);
    end;
    end
  else
  try
    idFTP.Connect(True);
  except
    on E : Exception do
      ShowMessage('Ошибка подключения: '+E.Message);
  end;
  if idFTP.Connected then
    try
      idFTP.Get('test.rar', 'c:/temp/test.rar', True);
    except
      on E : Exception do
        ShowMessage('Ошибка скачивания файла: '+E.Message);
    end;
end;

В двух словах по коду:
проверяем подключен ли компонент к серверу, если подключен, то отключаем и подключаемся по новой, если не удается подключиться, вылетит сообщение, с описанием ошибки, после пробуем слить файл test.rar, опять же, если что-то не получается, то снова вылетит месага об ошибочке.
Если возникли вопросы по коду, или необходимо просто помочь, буду рад оказать содействие )))))

Оцените статью
( Пока оценок нет )

Добавить комментарий

  1. demon-sheff

    Не работает… Пишет Project Run.exe raised exception class EIdReplyRFCError with message ‘Login or password incorrect!’. Хотя брэндмауэр выключен, антивируса нет, а пользователь есть такой для входа на фтп. с тотала захожу без проблем

    Ответить
  2. username

    Перепроверь логин пароль, тебе четко указало ошибку
    ‘Login or password incorrect!’.
    попробуй копипастом в тотале те данные что используешь в проге

    Ответить
  3. alexvgrey

    >idFTP.Disconnect
    >else
    >try
    Я бы это else убрал, без нее действительно будет работать 🙂
    А в конце, для чистоты кода я бы сделал
    idFTP.Disconnect;

    Ответить
  4. username

    Эм, у каждого свои подходы к программированию, ну убери, и не обрабатывай исключение, если твой компонент уже будет подключен, все в твоих руках))))))

    Ответить
  5. alexvgrey

    нене, если не убрать этот if, то else не сработает при первом запуске, когда процесс не соединен с сетью.

    Ответить
  6. username

    Немного не так, не сработает при втором жмакании на кнопку, т.к. компонент просто отключится от сервера 🙂
    А при первом жмакании, он проверит, подключены мы или нет к севраку, если подключены, от отключаемся, если нет, то конектимся и выкачиваем то что нас интересует.
    Опять же, это просто пример, возможно немного неудачно я проверкой подключения сделал, но тут уже проверка на гика)))))

    Ответить
  7. username

    Поправил в коде, добавил переподключение, если уже подключены 🙂

    Ответить
  8. alexvgrey

    ну смотри: ты выставил все параметры для соединения, потом проверяешь: если соединен — разорвать соединение, иначе скачать файл (со всеми обработками).
    Говоря точнее, надо бы убрать else и один end; в конце. Тогда проверка на соединение отработает и скачивание произойдет. В любом случае спасибо, этот пример взял для работы над своим приложением 🙂

    Ответить
  9. username

    вообще, этоn блок можно вынести в отдельную функцию
    try
    idFTP.Connect(True);
    except
    on E : Exception do
    ShowMessage(‘Ошибка подключения: ‘+E.Message);
    end;
    if idFTP.Connected then
    try
    idFTP.Get(‘test.rar’, ‘c:/temp/test.rar’, True);
    except
    on E : Exception do
    ShowMessage(‘Ошибка скачивания файла: ‘+E.Message);
    end;
    и вызывать когда нужно, перепишу потом, главное что суть ясна

    Ответить
  10. reader

    И это лишнее. Вот так надо (Delphi XE5):
    procedure Form1.acReloadExecute(Sender: TObject);
    begin
    idFTP1.Username:= ‘backuper’;
    idFTP1.Password:= ‘xxxxxxxxxxxxx’;
    idFTP1.Host:= ‘ip_ftp_servera’;
    idFTP1.Passive:= True;
    idFtp1.AutoLogin:=True;
    if idFTP1.Connected then idFTP1.Disconnect;
    try
    idFTP1.Connect();
    except
    on E : Exception do
    ShowMessage(‘Ошибка подключения: ‘+E.Message);
    end;
    if idFTP1.Connected then try
    idFTP1.Get(‘test.rar’, ‘c:/temp/test.rar’, True);
    except
    on E : Exception do
    ShowMessage(‘Ошибка скачивания файла: ‘+E.Message);
    end;
    end;

    Ответить
  11. username

    На делфях уже сто лет не кодил 🙂

    Ответить
  12. DFK

    У меня Antivir Personal после дополнения этого куска кода сразу выдаёт Троян якобы TR/ATRAPS.Gen и хрен запустишь прогу пока не отрубишь антивир. Опять же, если у пользователя тот же AntiVir стоит будут такие же вилы! Значит надо искать другие варианты обновлений… а то нет универсальности решения. Странно, конечно какого лешего Антивир фигнёй страдает на такой безобидный код, но блин не айс получается в плане реализации закачки.

    Ответить
    1. username

      Согласен, а более адекватные антивирусы что говорят?

      Ответить
  13. Adam

    Все бы хорошо, о если в имени файла есть кирилица — то не работает. Как быть?

    Ответить