FtpCommandでLIST

解決


ねろ  2004-02-11 20:30:23  No: 81959  IP: [192.*.*.*]

Win2k,VB6でwininet.dllのFtpcommandを使って
プロバイダーのFtpサーバーからカレントディレクトリー
のファイル一覧を取得しようとしています。
Ftpで接続して、'PASV'でIPアドレス+ポート番号が
返ってくるところまではいいのですが、その後
WinSockに帰ってきたIPアドレスとポート番号を
セットしてコネクトし、FtpCommandで'LIST'を
送っています。WinSockにカレントディレクトリー
のファイル一覧が返ってくることを期待しているのでですが
'LIST'を送った瞬間にプログラムがハングして待てど暮らせど
何も起こりません。
WinSockでは駄目だと言う事はなんとなく分かるのですが
他にいい方法が思い浮かびません。どなたか分かる方。

編集 削除
電気  2004-02-12 16:05:18  No: 81960  IP: [192.*.*.*]

>WinSockでは駄目だと言う事はなんとなく分かるのですが

逆に全てWinSockでやるのであれば以下のサンプルが参考になると思います。

http://www.comel.or.jp/~akira/index.html

ここから
SOFT >  FTP(ダウンロード)サンプルソフト1(VB5.0)

ダウンロードのサンプルではありますが、"LIST"にも簡単に対応出来るかと
思います。(別ポートで受取るというのは同じですから)

編集 削除
ねろ  2004-02-12 18:09:31  No: 81961  IP: [192.*.*.*]

電気さんありがとうございます、早速やってみます
ちょっと時間がかかるかもしれませんが、結果は追って報告します。

編集 削除
ねろ  2004-02-12 22:26:03  No: 81962  IP: [192.*.*.*]

試してみましたがちゃんとLISTが取れました。
WinSockを2つ使う所以外は私のやろうとしていた事と同じでした。
多少コードを変更しました、変更箇所は以下です私のコードではないので
全文を載せることは出来ませんが、もし後で試してみる方の為に。

Case "125 "
        ↓
Case "125 " , "150 "

Case "226 "                     
        ↓  
Case "226 ", "226-"
 

FtpSend ("RETR " & Text5.Text)      'ダウンロードファイル名を送信
  ↓
FtpSend ("LIST")

これをもとにもう少しFtpCommandの方を突っ込んで見ます。
電気さんGoodなサンプルありがとうございました。

編集 削除
電気  2004-02-13 11:18:08  No: 81963  IP: [192.*.*.*]

>Case "226 ", "226-"
ちなみに私のほうですが、"-"が付いているステータスは
226-xxxxxx
226-xxxxxx
226 xxxxx
のように、最後に"-"無しで帰ってくるステータスだけを拾えば
良いので、3桁の数値+1字の空白の時のみSelect分を行うようにしています。
又、3桁のステータスについてですが、
最初の1桁目がステータスとしては重要で、
残りの2桁に関してはFTPサーバーによって異なる事があります
そこで、私は1桁目だけでステータス判定するように改良しています。
まぁ、この辺はそれぞれの環境次第でしょうけど。

>電気さんGoodなサンプルありがとうございました。
いえいえ、作ったのは私では無いので(笑)
私も以前にこのサンプルに助けられた事があるという事です。

編集 削除
ねろ  2004-02-15 16:47:56  No: 81964  IP: [192.*.*.*]

電気さんのおっしゃる通りですね
USER名からPASSまでは、一桁目だけ見て4,5が出なければ
次から次に進めても良い気がします。

ところで一番初めの私の質問ですが、色々やっているうちの
FtpCommandの宣言ではこの様になっているのですが、
Public Declare Function FtpCommand Lib "wininet.dll" Alias "FtpCommandA" _
        (ByVal hFtpSession As Long, _
        ByVal fExpectResponse As Boolean, _
        ByVal dwFlags As Long, _
        ByVal lpszCommand As String, _
        ByVal lContext As Long, _
        phFtpCommand As Long) As Boolean
このByVal lContext As Longが何なのか判らなかったのですが、
MSDNで見ると
dwContext 
An application-defined value that associates the FTP command in a status callback. 
そこでもしやと思い
InternetReadFileで最初の引数にセットしてみたところ何と接続を新しく開かなくても
'LIST'の結果が入っていました。接続を2つ開かなくてはいけないと思ったのは
単に私の思い込みだった様です。お騒がせしました。

編集 削除