我在使用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;
答案 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
时或Login
在Connect
被调用时自动设置为AutoLogin
}设置为true,但您没有在代码中执行Login
并且未设置AutoLogin
。紧接上述声明之后的段落说:
根据@RemyLebeau在下面的评论中,引用的文档有误,TransferType
从未在ftBinary
中设置为Login
。留下受伤的内容以备将来参考。
根据文件:
TransferType的默认值是Id_TIdFTP_TransferType,在组件初始化期间分配。