tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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 の有償サポートに問い合わせてみる。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。