为什么文件在通过FTP传输后有时会有不同的大小或损坏?

时间:2013-09-11 15:58:11

标签: delphi delphi-xe2 indy

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

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

我尝试使用第三方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;

1 个答案:

答案 0 :(得分: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的文档在一个地方说,执行ftBinary时或LoginConnect被调用时自动设置为AutoLogin }设置为true,但您没有在代码中执行Login并且未设置AutoLogin。紧接上述声明之后的段落说:

根据@RemyLebeau在下面的评论中,引用的文档有误,TransferType从未在ftBinary中设置为Login。留下受伤的内容以备将来参考。

根据文件:

  

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