4

Delphi XE2 で TidFTP コンポーネントを使用してファイルをダウンロードする際に問題が発生しました。FTP サイトへの接続を取得し、ファイルのリストを取得して、get コマンドを実行できます。ただし、get コマンドを使用してファイルをダウンロードしようとすると、ファイルは常にソース ファイルよりも大きくダウンロードされます。その後、後続のファイルが破損しています。

さらに、複数のファイルをダウンロードしようとすると、最初のファイル (ソースよりも大きいファイル) がダウンロードされ、残りのファイルはスキップされます。get コマンドからエラーはスローされず、終了するだけです。AfterGet や OnStatus などの TidFTP コントロールのいくつかのイベントにフックしようとしましたが、すべて正常に表示されます。

サードパーティの 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();

のドキュメントには、が実行されたとき、またはが true に設定されたときに呼び出されたときにTIdFTP.TransferType自動的に設定されるとある場所で述べられていますが、コードで実行されておらず、設定されていません。上記のステートメントの直後の段落は、次のように述べています。ftBinaryLoginConnectAutoLoginLoginAutoLogin

以下のコメントの @RemyLebeau によると、引用されたドキュメントは誤りであり、in にTransferType設定されたことはありません。今後の参考のために、被災した内容を残しておきます。ftBinaryLogin

ドキュメントによると:

TransferType のデフォルト値は Id_TIdFTP_TransferType で、コンポーネントの初期化中に割り当てられます。

于 2013-09-11T16:12:55.323 に答える