gpt4 book ai didi

delphi - 为什么通过 FTP 传输后,文件有时会出现大小不同或损坏的情况?

转载 作者:行者123 更新时间:2023-12-03 15:19:59 32 4
gpt4 key购买 nike

我在使用 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;

最佳答案

您需要设置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 的文档在一个地方说它会自动设置为 ftBinaryLogin执行或当 Connect 时当 AutoLogin 时调用设置为 true,但您没有执行 Login在您的代码中并且尚未设置 AutoLogin 。紧接着上述声明的段落是:

根据下面评论中的@RemyLebeau,引用的文档是错误的,TransferType从未设置为ftBinaryLogin 。留下受影响的内容以供将来引用。

根据文档:

The default value for TransferType is Id_TIdFTP_TransferType, as assigned during initialization of the component.

关于delphi - 为什么通过 FTP 传输后,文件有时会出现大小不同或损坏的情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18745994/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com