4

我在使用 Delphi XE2 中的 TidFTP 组件下载文件时遇到问题。我能够连接到 FTP 站点,获取文件列表并执行 get 命令。但是,当我尝试使用 get 命令下载文件时,文件下载的文件总是比源文件大。然后后面的文件就损坏了。

此外,如果我尝试下载多个文件,则会下载第一个文件(大于源文件)并跳过其余文件。get 命令没有抛出错误,它只是退出。我试图挂钩 TidFTP 控件上的一些事件,例如 AfterGet 和 OnStatus,但一切看起来都很正常。

我尝试使用第 3 方 FTP 客户端访问文件并下载它,以确保我们的 FTP 服务器没有问题并且下载按预期工作。所以我认为它可能与 TidFTP 控件有关,或者我做错了什么。

这是我用来下载文件的例程:

var
  ftp: TIdFTP;
  strDirectory: string;
begin
  ftp := TIdFTP.Create(nil);
  try
    ftp.Host := 'ftp.myftpserver.com'
    ftp.Passive := false;
    ftp.Username := 'TestUser';
    ftp.Password := 'TestPassword';
    ftp.ConnectTimeout := 1000;
    ftp.Connect();
    ftp.BeginWork(wmRead);
    ftp.ChangeDir('/TestArea/');
    strDirectory := 'c:\test\';
    if not DirectoryExists(strDirectory) then
      CreateDir(strDirectory);
    ftp.Get('Test.zip', strDirectory + '\' + 'Test.zip', true, false);
   ftp.Disconnect();
  except
    on e: exception do
      showMessage(e.message);
  end;
end;
4

1 回答 1

10

您需要设置TIdFTP.TransferType. 它的默认值为Id_TIdFTP_TransferType,即ftASCII。您需要ftBinary改用,并在执行之前设置它Get

ftp.Connect();
...
ftp.TransferType := ftBinary;
ftp.Get('Test.zip', strDirectory + '\' + 'Test.zip', true, false);
ftp.Disconnect();

的文档TIdFTP.TransferType在一个地方说它会自动设置为ftBinarywhenLogin被执行或 whenConnect被调用 whenAutoLogin设置为 true,但是您没有Login在代码中执行并且没有设置AutoLogin. 紧接在上述声明之后的一段说:

根据下面评论中的@RemyLebeau,引用的文档有误,并且TransferType从未设置为ftBinaryin Login。留下受灾内容以备日后参考。

根据文档:

TransferType 的默认值为 Id_TIdFTP_TransferType,在组件初始化期间分配。

于 2013-09-11T16:12:55.323 回答