プロが教える店舗&オフィスのセキュリティ対策術

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の記述ができないとダメなのですよね?
どうぞ、よろしくお願いいたします。

A 回答 (7件)

ご指名ありがとうございます。

(←変な飲み屋みたい)

こんな感じ?
  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でもないので、ソケットのことを考える必要もないし、手順を間違わなければサーバに設定を施さなくてもできると思います。

この回答への補足

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

補足日時:2002/03/06 13:49
    • good
    • 0
この回答へのお礼

ありがとうございました。

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 がちゃんと動きません。

まだ、分かっていないところがあるのだと思います。
またいろいろとやってみますが、何かお気づきのことがありましたらお教えください。取り敢えずお礼まで。

お礼日時:2002/03/06 18:56

なるほど・・・


でも、追記質問部分は自己解決できそうですね^^
サーバの戻りは基本的にStateChangedで行います。

もうひとつの質問
http://oshiete1.goo.ne.jp/kotaeru.php3?q=227737
については、そちらに書いておきます。(回答ではないけど・・・)
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/03/08 20:52

※追記質問1について


ごめんなさい。。。
Inetコントロールでは、「ちょっと勉強」と思って触れたぐらいで、内部構造は予想したこともありません。
内部はwininet.dllを参照したAPI郡だと思うのですが、それを追っていったらわかると思います。
ぼくは(4ヶ月経ってまだ作りかけの)FTPソフトはWSock32.dllを使用しています。権限などがInetではできない(と思っている)からです。

http://www.mitene.or.jp/~sugisita/family/papa/vb/
コンポーネント→FTPクラス

ここのサンプルを解読するか、あるいはクラスファイルになっているので、そのままプロジェクトに追加をしてしまう方がよいかも?


※追記質問2について
すいません。CDもDIRもできたのですが・・・
何がどううまくいかないのかわかりません。
コードと、症状を教えてくれたらわかるかも?

この回答への補足

ありがとうございます。
昨夜、本を改めて読んでみてわたしの使い方が間違っているのだと思いました。
というのは、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通信で送信終了のイベントが発生しない」にもお知恵をいただけないでしょうか?図々しくて申し訳ありませんが。

補足日時:2002/03/08 11:20
    • good
    • 0

>サーバはUnix形OS(Soralis)なのです。



それなら、ユーザー名とパスワードを入れる必要があるのでは?

"ftp://user:pwd@172.20.1.17/home/tmp/test.txt"

で動きませんか?
しかし、この方法はセキリティ上問題があるのでお勧め出来ない。

INETコントロールでユーザー名とパスワードを指定するのは
どうするのでしょうか? >TAGOSAKUさん

この回答への補足

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

補足日時:2002/03/06 13:47
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/03/06 18:59

OpenURLでの取得


これは、ブラウザと同じように
[ファイルにアクセス]して[保存]
という処理です。

どうやらファイル転送とは違い、擬似的な転送と言えます。
なので送信ができません。


FTP接続でのファイル転送は、OpenURLを使用しないで、コマンドで行います。



http://www.microsoft.com/JAPAN/developer/library …

http://www.microsoft.com/JAPAN/developer/library …

に解説とサンプルが出ています。
    • good
    • 0

参考URLと比べてみてもソースに問題はないと思います。



txtURL.text = "ftp://ftp.microsoft.com/developr/drg/Win32/Autor …

としたら動きませんか?

参考URL:http://www.microsoft.com/JAPAN/developer/library …

この回答への補足

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

補足日時:2002/03/06 12:17
    • good
    • 0

今は時間がないのでサンプルを書けないのですが・・・



コードを見るとコマンドボタンのイベントのソースであるように見えますが、ちょっと書くところが違うような気がします。

バッファは何分割かで受信が行われと思ったのですが・・・
Inetの名前を忘れたけどイベント内に
GetBuf() = Inet.OpenURL(txtURL.Text, icByteArray)
を書くように思ったんだけど、違ったらすいません。


それと・・・質問とは無関係の余談ですが・・・
cmdDownload_Click
と書いてあるのを見て、コマンドボタンのクリックイベントだと、すぐわかりました。
コーディング規則に沿ったネーミングをされてると、大変質問も理解しやすいですね。

この回答への補足

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

補足日時:2002/03/05 22:03
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!