2008年3月31日月曜日

FTP でサーバ側ディレクトリの存在をチェックする

少し前のことになりますが、お客様から FTP コンポーネント使用時にサーバ側のディレクトリの存在の有無をチェックする方法は無いか、というお問い合わせをいただきました。

FTP の規格 (RFC959) 自体にはそのようなチェック機能はありませんので、実際にそのディレクトリをアクセスしてみてサーバ側の反応を見ることで対応することになります。

なお FTP プロトコル上のエラーとしてサーバから返されるエラーは、IPWorksFtpException でエラーコード 141 として検出されます。このコードではディレクトリ不在エラー以外のものも検出しますので、サーバ側から返されるメッセージもチェックして判断する必要があります。

以下にサンプルコードを示します。このコードでは、RemotePath に当該ディレクトリを設定して (内部的に) CWD コマンドを発行させます。またディレクトリ /abc/xyz が存在しない場合には、サーバ側からは

550 CWD failed. "/abc/xyz": directory not found

というエラーメッセージが返されると仮定しています。

    try
{
// 確認したいパスを RemotePath に設定
ftp.RemotePath = "/abc/xyz";
}
catch (IPWorksFtpException ipwe)
{
// パスが存在しない場合は FTP Protocol Error を返す。
// FTP Protocol Error は全てエラーコード 141 にされるので、実際のメッセージを確認して
// 判断する。
if ( ipwe.Code == 141 )
{
// サーバから返されたエラーメッセージをチェック
if ( ipwe.Message.Contains("directory not found") )
{
System.Console.WriteLine("*** directory /abc/xyz doesn't exit. ***");
}
}
}
このロジックはサーバの返すメッセージに依存していますので、実際にご利用いただく際には検出ロジックを実際のサーバに合わせて調整する必要があります。

なお、サーバが仕様上「ディレクトリが存在しない場合」と「存在するけれどアクセス権が無い場合」のエラーメッセージをサーバが区別しない場合はクライアント側で両者を区別することはできません。

0 件のコメント: