TIdFTPでPut中にAbortするには?

解決


INDY  2005-02-19 02:22:58  No: 13302

TIdFTPのPutメソッドでサイズの大きいファイルを送信中に任意で中断したいので、Abortメソッドを使用してみたのですが「Connection Close Gracefully」例外が発生し、それ以降Connect/Quitができなくなってしまいます。どなたか助けてください。


にしの  2005-02-19 06:52:13  No: 13303

「Connection Close Gracefully」を訳すとわかるかと思います。
例外といっても、エラーとして使うほか、tryから抜けたいときに使いますよ。
ヘルプにも出ています。
EIdConnClosedGracefullyを調べてみてください。

それとも、Abortした後、Connectできないのでしょうか。
どのようなコーディングをしていますか?
予想では、例外が発生してConnectに行かない or Connectするためのボタン/メニューなどをEnabled=Trueにしていないのだと思いますが・・・。


にしの  2005-02-19 06:59:18  No: 13304

単純な接続・中断・切断のサンプルです。
Abortの後、DisconnectしないとConnectedがTrueのままになります。
# ソケットはAbortした時点で切断しているみたいです。

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    IdFTP1.Host := 'サーバ名';
    IdFTP1.Username := 'ユーザID';
    IdFTP1.Password := 'パスワード';
    IdFTP1.Connect;
    ShowMessage('Connected');
    IdFTP1.Abort;
    ShowMessage('Abort');
    ShowMessage('Connected:' + BoolToStr(IdFTP1.Connected) );
    IdFTP1.Disconnect;
    ShowMessage('Disconnected');
  except
    on e: Exception do ShowMessage('Exception:' + e.Message);
  end;
end;


INDY  2005-02-19 07:19:40  No: 13305

返答ありがとうございます。
Abort後にDisconnectをしているのですが、ConnectedプロパティがTrueのままになってしまいます。
実装としてはこんな感じです。

procedure TfrmMain.Button1Click(Sender: TObject);
begin
  try
    IdFTP1.Connect;
  except
    Exit;
  end;
  try
    IdFTP1.OnWork := ProcessMessage;
    IdFTP1.Put('D:\temp\aaa.dat','aaa.dat')
  finally
    IdFTP1.DisConnect;
  end;
end;

procedure TfrmMain.ProcessMessage(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer);
begin
  IdAntiFreeze1.Process;
end;

procedure TfrmMain.Button2Click(Sender: TObject);
begin
  IdFTP1.Abort;
end;

Button1をクリックしてPutしている最中に、Button2をクリックするとConnectが切れない状態で中断してしまいます(T_T)


にしの  2005-02-21 19:56:59  No: 13306

Delphi7pro+WindowsXPで試してみましたが、例外が発生する以外は問題なさそうですよ。

 try
    IdFTP1.OnWork := ProcessMessage;
    IdFTP1.Put('D:\temp\aaa.dat','aaa.dat')
  finally
    IdFTP1.DisConnect;
  end;

を、
try
 try
    IdFTP1.OnWork := ProcessMessage;
    IdFTP1.Put('D:\temp\aaa.dat','aaa.dat')
  finally
    IdFTP1.DisConnect;
  end;
except

end;
というように、例外をトラップしてみてはどうでしょう。


INDY  2005-02-22 05:14:21  No: 13307

Delphi5+INDY10+Win2kで、上記のコードだとやっぱうまくいきません。
ですが、DisConnectの位置を変えたらうまくいきました。

procedure TfrmMain.Button1Click(Sender: TObject);
begin
  try
    IdFTP1.Connect;
  except
    Exit;
  end;
  try
    IdFTP1.OnWork := ProcessMessage;
    IdFTP1.Put('D:\temp\aaa.dat','aaa.dat')
  finally
//    IdFTP1.DisConnect;
  end;
end;

procedure TfrmMain.Button2Click(Sender: TObject);
begin
  IdFTP1.Abort;
  IdFTP1.DisConnect;
end;

あとでもうちょっとINDYのソースを追って原因調べます。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加