TIdFTP.GET,引用远程文件夹中文件的正确方法是什么?

时间:2019-05-23 10:31:20

标签: delphi get ftp indy

我正在尝试使用TIdFTP.Get(版本10)从我有帐户的远程服务器上下载文件(ssleay32.dll)。

该文件确实存在于服务器上的文件夹中,我可以使用TIdFTP进行连接。但是,无论我如何引用fileTIdFTP的路径。Get都会不断显示错误,无法打开:没有这样的文件或目录。

如果我尝试先将目录更改为文件所在的目录,然后仅使用文件名,则尝试更改目录时会遇到相同的错误。

正确引用文件以正确下载的方法是什么?

有关信息,当我使用Filezilla和TIdFTP使用的相同凭据登录服务器时,Filezilla似乎将路径显示为/ MAMbase。我尝试使用/MAMbase、../MAMbase、./MAMbase、/MAMbase/和其他变体而没有成功。

((ssleay32.dll)

设置主机,帖子,用户名和密码的连接参数后,我正在使用的代码如下。使用connect中的路径并仅使用文件名获取或使用完整路径时,使用我使用的任何路径格式都会产生相同的错误。

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;

我查看了类似的问题herehere,但没有进一步的介绍。

(顺便说一句,pathToCommonFiles包含一个斜杠并且存在)

1 个答案:

答案 0 :(得分:1)

首先,您应该提前准备本地文件名:

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服务器。否则,错误是来自本地计算机。