【问题标题】:TIdFTP.GET, What is the correct way to refer to the file in the remote folder?TIdFTP.GET,引用远程文件夹中文件的正确方法是什么?
【发布时间】:2023-03-13 04:27:02
【问题描述】:

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

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

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

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

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

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

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 包含一个斜杠并且它存在)

【问题讨论】:

    标签: delphi get ftp indy


    【解决方案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 服务器。否则,错误来自本地机器。

    【讨论】:

    • 恐怕我仍然使用您提供的代码得到错误(这可能并不奇怪,因为它与我所拥有的没有太大不同)错误类是EIdReplyRFCError所以它来了从服务器。但很明显,文件就在那里,正如您在我的 Filezilla 屏幕截图中看到的那样。 filezilla 日志显示我用于 filezilla 和 delphi 的连接参数最初将我放在 / 文件夹中,因此 /MAMbase 应该是正确的路径。我用 TIdFTP1.Passive:=True, :=false 尝试过,根本没有提到 TIdFTP1.Passive。同样的错误。
    • 啊,作为测试,我尝试让 TIdFTP1 在连接后立即列出目录内容,它向我显示了我没想到的文件。似乎 Indy 将我放入父文件夹,因为我可以看到 .bash_logout public_html、www 等文件名,包括 MAMbase 的父文件夹。所以我添加了IdFTP1.ChangeDir('ApplicationUpdates/MAMbase'); 行,然后GET 只使用'libeay32.dll' 和'ssleay32.dll'。不知道为什么 Indy 把我放在一个地方,而 filezilla 把我放在另一个地方,但现在问题已经解决了。感谢您的时间。已接受答案。
    • "Indy 似乎将我放入父文件夹" - 这是由服务器控制的,而不是由 Indy 控制的。服务器决定您最初放入哪个文件夹。您可能需要使用 TIdFTP.ClientInfo 属性来模拟 Filezilla 如何向服务器标识自己。默认情况下,TIdFTP 将自己标识为 Indy。可能服务器无法识别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2013-07-24
    • 2018-01-05
    相关资源
    最近更新 更多