• ベストアンサー

FTP対応のアプリケーション

INETコントロールを使って、サーバとファイルの送受信をするアプリを作りたいのですが、基本的なところでつまづいています。 サンプルプログラムを見つけたので試してみているのですが。 以下。 Private Sub cmdDownload_Click() Dim GetBuf() As Byte Dim FileNum As Integer GetBuf() = Inet.OpenURL(txtURL.Text, icByteArray) FileNum = FreeFile Open txtSavePath.Text For Binary Access Write As FileNum Put #FileNum, , GetBuf() Close #FileNum MsgBox "ダウンロード終了" End Sub ここで、txtURL.Text に何を記述したらいいのか、はっきり分かりません。 サーバー名にファイルのあるディレクトリを付けた形、 ftp://servername/home/tmp/test.txt サーバーのIPアドレスにファイルのあるディレクトリを付けた形、 ftp://172.20.1.17/home/tmp/test.txt を試してみたのですが、うまくダウンロードできません。 目的のプログラムは Executeメソッドを使ってファイルの送受信をしたいのですが、どちらにしてもURLの記述ができないとダメなのですよね? どうぞ、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.5

ご指名ありがとうございます。(←変な飲み屋みたい) こんな感じ?   With Inet1     .URL = "ftp://ftp.hoge.com"     .UserName = "TAGOSAKU7"     .Password = "内緒"     .Execute , " DIR"   End With UserNameとPasswordは、ExecuteかOpenURLを発行すると同時に送られているようです。 UserNameが空状態であれば "anonymous"を送っているようです。 でも、 >"ftp://user:pwd@URL" 使用方法によってはいいと思いますよ。 画面にさえ表示しなければ・・・ それと、、、 受けのサーバのポートは特に意識する必要はないと思います。 WinSockでもないので、ソケットのことを考える必要もないし、手順を間違わなければサーバに設定を施さなくてもできると思います。

lily02
質問者

お礼

ありがとうございました。 Inet.OpenURL ではうまくいかないのですが、Inet.Execute ではうまくいきました。一行で書くと Inet.Execute "ftp://username:password@hostname", "GET test.lzh e:\tmp\test.lzh" みたいな感じです。 GET(ダウンロード)もPUT(アップロード)もこれでいけました。 もちろん   With Inet1     .URL = "ftp://ftp.hoge.com"     .UserName = "TAGOSAKU7"     .Password = "内緒"     .Execute , " DIR"   End With の書き方でもOKでした。 ところが、問題点がふたつ。 1.ダウンロードやアップロードが終わってアプリケーションを終了するときに、   Inet.Cancel を記述しているのですが、5秒ぐらいかかります。   Private Sub Inet.StateCanged(Byval State As Integer) を記述すると   なぜかすぐ終わります。解せません。 2.GET と PUT はうまくいくのですが、CD や DIR がちゃんと動きません。 まだ、分かっていないところがあるのだと思います。 またいろいろとやってみますが、何かお気づきのことがありましたらお教えください。取り敢えずお礼まで。

lily02
質問者

補足

ありがとうございます。 早速試してみます。 仕事先のことなので結果のご報告は夕方になりますが。

その他の回答 (6)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.7

なるほど・・・ でも、追記質問部分は自己解決できそうですね^^ サーバの戻りは基本的にStateChangedで行います。 もうひとつの質問 http://oshiete1.goo.ne.jp/kotaeru.php3?q=227737 については、そちらに書いておきます。(回答ではないけど・・・)

lily02
質問者

お礼

どうもありがとうございました。 お蔭様で同期をとることですべて解決しました。 アドバイスはとても有難かったです。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.6

※追記質問1について ごめんなさい。。。 Inetコントロールでは、「ちょっと勉強」と思って触れたぐらいで、内部構造は予想したこともありません。 内部はwininet.dllを参照したAPI郡だと思うのですが、それを追っていったらわかると思います。 ぼくは(4ヶ月経ってまだ作りかけの)FTPソフトはWSock32.dllを使用しています。権限などがInetではできない(と思っている)からです。 http://www.mitene.or.jp/~sugisita/family/papa/vb/ コンポーネント→FTPクラス ここのサンプルを解読するか、あるいはクラスファイルになっているので、そのままプロジェクトに追加をしてしまう方がよいかも? ※追記質問2について すいません。CDもDIRもできたのですが・・・ 何がどううまくいかないのかわかりません。 コードと、症状を教えてくれたらわかるかも?

lily02
質問者

補足

ありがとうございます。 昨夜、本を改めて読んでみてわたしの使い方が間違っているのだと思いました。 というのは、OpenURL のサンプルコードを改変して Execute をやっていたので、次のようなコードで試していました。 Private Sub cmdDownload_Click()   Dim FileName As String   Inet.URL = "ftp://hostname"   Inet.UserName = "username"   Inet.Password = "password"   Inet.Execute , "GET test.lzh " & filename   MsgBox "ダウンロード終了" End Sub みたいな感じで。ところが本をよく読んでみたら Private Sub cmdDownload_Click()   Dim FileName As String   Inet.URL = "ftp://hostname"   Inet.UserName = "username"   Inet.Password = "password"   Inet.Execute , "GET test.lzh " & filename   Do While Inet.StillExecuting = True     DoEvents   Loop   MsgBox "ダウンロード終了" End Sub のような感じで、同期をとって終了確認をしています。DIR も CD もそうです。わたしはただ単に Execute を発行していただけなのでここが原因だったかな、と午後にまた仕事先で確認したいと思います。 それと、ついでといっては申し訳ないのですがTAGOSAKU7さんはWinSockの方もお詳しそうなので「質問13」の「Socket通信で送信終了のイベントが発生しない」にもお知恵をいただけないでしょうか?図々しくて申し訳ありませんが。

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.4

>サーバはUnix形OS(Soralis)なのです。 それなら、ユーザー名とパスワードを入れる必要があるのでは? "ftp://user:pwd@172.20.1.17/home/tmp/test.txt" で動きませんか? しかし、この方法はセキリティ上問題があるのでお勧め出来ない。 INETコントロールでユーザー名とパスワードを指定するのは どうするのでしょうか? >TAGOSAKUさん

lily02
質問者

お礼

どうもありがとうございました。 当所の目的(アップロードとダウンロード)の半分はクリアーできました。 問題点をNo5.のTAGOSAKUさんの方へ書きました。 よろしくご指導をお願いいたします。

lily02
質問者

補足

ありがとうございます。 早速試してみます。 仕事先のことなので結果のご報告は夕方になりますが。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

OpenURLでの取得 これは、ブラウザと同じように [ファイルにアクセス]して[保存] という処理です。 どうやらファイル転送とは違い、擬似的な転送と言えます。 なので送信ができません。 FTP接続でのファイル転送は、OpenURLを使用しないで、コマンドで行います。 http://www.microsoft.com/JAPAN/developer/library/Inet98/vbmthinetexecutemethod.htm http://www.microsoft.com/JAPAN/developer/library/Inet98/vbmthexecutex.htm に解説とサンプルが出ています。

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.2

参考URLと比べてみてもソースに問題はないと思います。 txtURL.text = "ftp://ftp.microsoft.com/developr/drg/Win32/Autorun.zip" としたら動きませんか?

参考URL:
http://www.microsoft.com/JAPAN/developer/library/Inet98/vbmthopenurlx.htm
lily02
質問者

補足

ありがとうございます。 サーバはUnix形OS(Soralis)なのです。 ネットワークが繋がっていて、ホスト名(もしくはIPアドレス)が分かっていればFTPポート(21)を使って、FTP送受信できると思っているのですが違うのでしょうか?

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

今は時間がないのでサンプルを書けないのですが・・・ コードを見るとコマンドボタンのイベントのソースであるように見えますが、ちょっと書くところが違うような気がします。 バッファは何分割かで受信が行われと思ったのですが・・・ Inetの名前を忘れたけどイベント内に GetBuf() = Inet.OpenURL(txtURL.Text, icByteArray) を書くように思ったんだけど、違ったらすいません。 それと・・・質問とは無関係の余談ですが・・・ cmdDownload_Click と書いてあるのを見て、コマンドボタンのクリックイベントだと、すぐわかりました。 コーディング規則に沿ったネーミングをされてると、大変質問も理解しやすいですね。

lily02
質問者

補足

ありがとうございます。 返事をいただけて嬉しいです。 お時間のあるときにサンプルもいただけるとなお嬉しいです。 今日も色々と試しているのですがうまくいきません。 何らかのエラーが生じていると思うのですが、 On Error GoTo でも検出されず手がかりがなくて困っています。 どうぞよろしくお願いいたします。

関連するQ&A

専門家に質問してみよう