我正在尝试使用TIdFTP.Get(版本10)从我有帐户的远程服务器上下载文件(ssleay32.dll)。
该文件确实存在于服务器上的文件夹中,我可以使用TIdFTP进行连接。但是,无论我如何引用fileTIdFTP的路径。Get都会不断显示错误,无法打开:没有这样的文件或目录。
如果我尝试先将目录更改为文件所在的目录,然后仅使用文件名,则尝试更改目录时会遇到相同的错误。
正确引用文件以正确下载的方法是什么?
有关信息,当我使用Filezilla和TIdFTP使用的相同凭据登录服务器时,Filezilla似乎将路径显示为/ MAMbase。我尝试使用/MAMbase、../MAMbase、./MAMbase、/MAMbase/和其他变体而没有成功。
设置主机,帖子,用户名和密码的连接参数后,我正在使用的代码如下。使用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;
(顺便说一句,pathToCommonFiles包含一个斜杠并且存在)
答案 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服务器。否则,错误是来自本地计算机。