从 FTP-Lazarus 的服务器下载文件

Download File from FTP-Server in Lazarus

我需要使用 Lazarus 从 FTP- 服务器下载文件。我已经有连接到服务器的功能,但不知道如何从中下载文件。

我希望有人能给我一个代码示例。

正在连接到 FTP-服务器:

function connect(Host, Username, Password : string) : boolean;
var
FTP: TFTPSend;
begin
FTP := TFTPSend.Create;

FTP.TargetHost := Host;
FTP.TargetPort := Port;
FTP.AutoTLS := true;
FTP.Username := username;
FTP.Password:= Password;
FTP.Login;

您可以通过 TFTPSend.RetrieveFile 功能下载文件

function RetrieveFile(const FileName: string; Restore: Boolean): Boolean; virtual;

var
 FTP: TFTPSend;
begin
  FTP := TFTPSend.Create;
  try
    ....
      FTP.DirectFileName := LocalPath;
      FTP.DirectFile     := True;
      FTP.RetrieveFile(RemotePath, True);
    ....
  finally
    FTP.Free;
  end;
end;

你也可以使用这个功能FtpGetFile

function FtpGetFile(const IP, Port, FileName, LocalFile, User, Pass: string): Boolean;


更新 要下载给定目录中的所有文件,您需要执行如下循环:

  FTP.DirectFile:=True;
  if FTP.List('', False) then
    for I := 0 to FTP.FtpList.Count-1 do begin
        FTP.DirectFileName := FTP.FtpList[I].FileName;
        FTP.RetrieveFile(FTP.FtpList[I].FileName, True);
    end;        

查看 TFTPSend.List 了解更多信息。

如果命令 PASV(当 FTP.Passive:=true)错误地返回到远程服务器防火墙配置中的私有地址会怎样?例如“227 进入被动模式 (192,168,148,37,129,44)”。我们收到错误 425 无法打开数据连接! 我正在使用 synapse 4.0 和 Lazarus 2.0.10。在最著名的 ftp 客户端(filezilla、winscp 等)中,用户可以在向 ftp 服务器发送数据命令之前替换或更好地强制远程服务器的 public ip。在 Class TFTPSend 单元 ftpsend 中添加少量代码行,我们可以重新建立丢失的数据连接。 a) 将布尔变量添加到 class 的受保护部分,例如 FForceIP: Boolean; b) 添加布尔值 属性 到 class 的已发布部分,例如 property ForceIP: Boolean read FForceIP write FForceIP; 允许更改上述变量 c) 在 function TFTPSend.DataSocket: boolean; 命令 FDSock.CloseSocket; 之后,在被动模式下,函数的第一部分添加以下命令 if FForceIP then FDataIP:=FTargetHost;,将 PASV 命令给出的私有 IP 替换为远程 ftp 的 IP服务器。 d) 要启用强制远程主机 IP 地址,只需设置 FTP.Passive:= True;FTP.ForceIP:= True;。 ▼数据通道正在恢复并正常运行!