TIdFTP.GET, как правильно обращаться к файлу в удаленной папке? - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь использовать TIdFTP.Get (версия 10) для загрузки файла (ssleay32.dll) с удаленного сервера, на котором у меня есть учетная запись.

Файл действительно существует в папке на сервереи я могу использовать TIdFTP для подключения ОК.Тем не менее, независимо от того, как я ссылаюсь на путь к файлу ITFF.Get продолжает выдавать ошибку, Не могу открыть: нет такого файла или каталога.

Если я сначала пытаюсь изменить каталог на каталог, в котором находится файл, изатем просто используйте имя файла. Я получаю ту же ошибку при попытке сменить каталог.

Как правильно ссылаться на файл, чтобы он загружался правильно?

Для получения информации, когда я вхожуна сервер, используя Filezilla и те же учетные данные, что и TIdFTP, Filezilla, кажется, показывает путь как / MAMbase.Я пытался с / MAMbase, ../MAMbase, ./MAMbase, / MAMbase / и другие варианты без успеха.

((ssleay32.dll)

Код яиспользуя, после установки параметров подключения хоста, пост, имя пользователя и пароль ниже.Использование пути в соединении и получении только с именем файла или получение с полным путем выдает ту же ошибку с любым из форматов пути, которые я использовал.

if (not fileexists(pathToCommonFiles + 'libeay32.dll'))  or (not fileexists(pathToCommonFiles + 'ssleay32.dll')) then
     begin
     try
       try
       IdFTP1.Connect ;
  //   IdFTP1.ChangeDir('MAMbase/');
  //   IdFTP1.Get('ssleay32.dll', pathToCommonFiles + 'libeay32.dll',true); 
       IdFTP1.Get('./MAMbase/ssleay32.dll',pathToCommonFiles + 'ssleay32.dll',true); 
       except on E: Exception do
            showmessage ( 'Could not make ftp connection for SSL files'  +slinebreak +
                          'Exception class name = '+E.ClassName+ slinebreak
                       +  'Exception message = '+E.Message);
       end;
     finally
        IdFTP1.quit ;
     end;

     end;

Я смотрел на похожие вопросы здесь и здесь , но дальше идти не буду.

(кстати, pathToCommonFiles содержит косую черту и существует)

1 Ответ

1 голос
/ 23 мая 2019

Прежде всего, вы должны заранее подготовить локальные имена файлов:

LocalLibeayFile := IncludeTrailingPathDelimiter(pathToCommonFiles) + 'libeay32.dll';
LocalSsleayFile := IncludeTrailingPathDelimiter(pathToCommonFiles) + 'ssleay32.dll';

Или:

LocalLibeayFile := TPath.Combine(pathToCommonFiles, 'libeay32.dll');
LocalSsleayFile := TPath.Combine(pathToCommonFiles, 'ssleay32.dll');

Тогда любой из них должен работать:

if (not FileExists(LocalLibeayFile)) or (not FileExists(LocalSsleayFile)) then
begin
  ...
  IdFTP1.ChangeDir('/MAMbase');
  IdFTP1.Get('libeay32.dll', LocalLibeayFile, True);
  IdFTP1.Get('ssleay32.dll', LocalSsleayFile, True);
  ...
end;
if (not FileExists(LocalLibeayFile)) or (not FileExists(LocalSsleayFile)) then
begin
  ...
  IdFTP1.Get('/MAMbase/libeay32.dll', LocalLibeayFile, True);
  IdFTP1.Get('/MAMbase/ssleay32.dll', LocalSsleayFile, True);
  ...
end;

Если сервер изначально перенаправит вас в папку /, вы можете пропустить ведущую /:

IdFTP1.ChangeDir('MAMbase');
IdFTP1.Get('libeay32.dll', LocalLibeayFile, True);
IdFTP1.Get('ssleay32.dll', LocalSsleayFile, True);
IdFTP1.Get('MAMbase/libeay32.dll', LocalLibeayFile, True);
IdFTP1.Get('MAMbase/ssleay32.dll', LocalSsleayFile, True);

Если вы все еще получаете сообщение об ошибке, вам необходимо определить, откуда оно на самом деле: FTP-сервер или локальный компьютер. Каков фактический тип класса для Exception, который поднимается? Если это EIdReplyRFCError, ошибка приходит с FTP-сервера. В противном случае ошибка исходит от локального компьютера.

...