タイトル : Re^9: FTPのGetFileSizeでエラーがでる 投稿日 : 2010/05/07(Fri) 20:18 投稿者 : 魔界の仮面弁士
> サーバー自体はSIZEコマンドをサポートしているということはわかりました。 一歩前進ですね。 > あとはそれをVBで実装させるだけなのですが、 次は、そもそも FtpWebRequest がそれに対応しているのかどうか…ですね。 まずは、No10083 で示した "Microsoft Network Monitor" を使って、 FtpWebRequest が送出している内容を追ってみては如何でしょう。 で、手元の環境(IIS)で見たところ、GetFileSize を投げると ★GetFileSize 開始★ "USER アカウント名" "PASS パスワード" "OPTS utf8 on" … Unicode 対応のサーバーなら Unicode を使う "PWD" … 現在のディレクトリを調べている "CWD 階層" … 対象ファイルのディレクトリに移動 "SIZE ファイル名" "QUIT" … 切断 という手順が行われているのみで、バイナリモードへの変更は行われて いないように見えました。(そちらの環境でも試してみて下さい) しかし当方のサーバーでは、以下のようにすると TYPE I で SIZE が送出されました。 (他のサーバーではどうなるか分かりませんが) 手順としては、GetFileSize(SIZE コマンド)を送出する前に、先んじて DownloadFile(RETR コマンド)などの「UseBinary が利きそうなコマンド」を 同一接続で送出しておくというものです。 通信内容を Network Monitor で監視してみたところ、このようになりました。 ★DownloadFile開始★ … UseBinary = True、KeepAlive = True "USER アカウント名" "PASS パスワード" "OPTS utf8 on" "PWD" "CWD 階層" "TYPE I" … UseBinary が利いて、バイナリモードに変換される "RETR ファイル名" … サイズの小さなファイルを取得しておく ★GetFileSize 開始★ … UseBinary = 任意、KeepAlive = False "SIZE ファイル名" … 前回が KeepAlive = True なので、先ほどの接続が使われる "QUIT" … 今回は KeepAlive = False なので、通信完了後に QUIT される ということで、次に調査すべき点は: (1) 上記の手順が、現在のサーバーに通用するのかを検証する。 (2) どの WebRequestMethods.Ftp であれば、"TYPE I" が送出されるのかを順に調べる。 (3) 今回の要件を、(2) のコマンドを事前に送出する運用で回避できるかを検討する。 これで回避できれば、今回の問題は解決かと思います。 一方、事前送出では都合が悪い場合には: (4) FtpWebRequest クラス以外の別ライブラリの利用を検討する。 http://support.microsoft.com/kb/832679 http://www.hi-ho.ne.jp/babaq/basp21.html http://www.grapecity.com/japan/support/database/p7_369.htm (5) クラスを変更することさえもできない事情がある場合には、 FtpWebRequest が、SIZE をバイナリモードで送出できないという点について、 Microsoft の有償サポートに問い合わせてみる。 |