TIdFTPのPutメソッドでサイズの大きいファイルを送信中に任意で中断したいので、Abortメソッドを使用してみたのですが「Connection Close Gracefully」例外が発生し、それ以降Connect/Quitができなくなってしまいます。どなたか助けてください。
「Connection Close Gracefully」を訳すとわかるかと思います。
例外といっても、エラーとして使うほか、tryから抜けたいときに使いますよ。
ヘルプにも出ています。
EIdConnClosedGracefullyを調べてみてください。
それとも、Abortした後、Connectできないのでしょうか。
どのようなコーディングをしていますか?
予想では、例外が発生してConnectに行かない or Connectするためのボタン/メニューなどをEnabled=Trueにしていないのだと思いますが・・・。
単純な接続・中断・切断のサンプルです。
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;
返答ありがとうございます。
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)
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;
というように、例外をトラップしてみてはどうでしょう。
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のソースを追って原因調べます。
ありがとうございました。
ツイート | ![]() |