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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q[VB6.0] Inet OpenURLのエラー検出

VB6.0

InetコントロールでOpenURLを実行した時、404(File Not Found)等のエラーを検出する方法はありますか?

Aベストアンサー

すみません、ResponseCode や ResponseInfo はクライアント側のエラーでした。
GetHeaderでHTTPレスポンスのヘッダを取得できます。
HTTPヘッダの1行目がHTTPステータスなので、「HTTP/1.0 404 Not Found」などが入ります。

以下を試してみてください。

-----------------------------------
Private Sub Command1_Click()

  Dim strURL As String

  '存在しないアドレス
  strURL = "http://www.msn.co.jp/hadfhg.htm"

  Inet1.OpenURL strURL
  Debug.Print Inet1.GetHeader

End Sub
-----------------------------------
※存在しないURL「http://www.msn.com/hadfhg.htm」は、msn.comサーバーの仕様なのか、なぜかバイナリデータを返してくるようです。
バイナリを受け取るようにすれば良いと思いますが、上記ではとりあえずmsn.co.jpにしてあります。

すみません、ResponseCode や ResponseInfo はクライアント側のエラーでした。
GetHeaderでHTTPレスポンスのヘッダを取得できます。
HTTPヘッダの1行目がHTTPステータスなので、「HTTP/1.0 404 Not Found」などが入ります。

以下を試してみてください。

-----------------------------------
Private Sub Command1_Click()

  Dim strURL As String

  '存在しないアドレス
  strURL = "http://www.msn.co.jp/hadfhg.htm"

  Inet1.OpenURL strURL
  Debug.Print Inet1.GetHeader

E...続きを読む

QVB6.0でFTPでのファイルの送受信

VB6.0でFTPでのファイルの送受信(下記(1))をしようと考えております。
尚、コンポーネントは、インターネットトランスファコントロール(Inet)を使用しております。
(1)"リモートサーバーに対して、複数件のファイルを送信し、無事転送が完了したら(リモートサーバー
の指定フォルダに送信された複数件のファイルがあるのを確認後)、
 クライアント側のファイル(リモートサーバーに送信が済んだファイル)を消す"
という処理を考えております。

ここで、質問なのですが
(1)vbを使ったFTP転送で、複数件のファイルを一括転送(mputコマンドの使用)は、可能か?
 (2)もし、(1)が不可能の場合、
   "送信するファイルをputコマンドで1つ送って、リモート側にそのファイルがあるのを
   getコマンドで確認して、もしgetであれば、クライアント側のそのファイルを消す"
という処理を送信するファイル数分繰り返すことになるんですか?
   
   1つのファイルの場合に、Inet1_State_Changeイベントで、ループさせstate = 12 の時(
リモート側に正常に送信されたと考えて)、クライアント側のファイルを消していいのでしょうか?
   VBのヘルプを見ると、state = 12 は、get処理で使用するというようなことを書いてありますが。
   
以上 

VB6.0でFTPでのファイルの送受信(下記(1))をしようと考えております。
尚、コンポーネントは、インターネットトランスファコントロール(Inet)を使用しております。
(1)"リモートサーバーに対して、複数件のファイルを送信し、無事転送が完了したら(リモートサーバー
の指定フォルダに送信された複数件のファイルがあるのを確認後)、
 クライアント側のファイル(リモートサーバーに送信が済んだファイル)を消す"
という処理を考えております。

ここで、質問なのですが
(1)vbを使ったFTP転送で、...続きを読む

Aベストアンサー

フリーソフトのFFFTPを使用したことがありますか?
あれを見てみてはいかがでしょうか?
ソフトが送っているコマンドが見ることができます。

(1)一括は無理です。1ファイルずつの転送になります。
(2)そのとおりです、消して送信の処理が望ましいですが、消さないでも送信することができたと思います。

ちなみにFTPソフトを作成するのであればWinSockを使用したほうがよいと思います。未検証ですが、権限など更新(755みたいに設定すること)の情報はInetでは無理のような気が・・・
未検証なのでなんとも言えませんが、ぼくもFTPソフトを個人で作成中ですが、WinSockのコマンドを使用しています。

QInetでHTTPのPOST設定方法

Inetコントロールで、HTTPサーバにPOSTを使用しデータを送信しようと考えているのですが、
いろいろ調べたところ、できるようになりました。

ソースは以下の通りです。
Inet1.Execute "アドレス"
_, "POST"
_, "msg=あああ"
_, "Content-Type: application/x-www-form-urlencoded"

上記のソースでサーバ側でmsgと指定し「あああ」という値を
取得することができました。

しかし、POSTで複数のデータを送ることができません。
例えば値をnameとmsgの二つを送る場合、
"msg=あああ"の部分にどのように記述すればよいのでしょうか?
それとも根本的に何か違うのでしょうか?

よろしくお願いします。

Aベストアンサー

Content-TypeとしてURL encoded www formを指定しているのだから、その型式でデータを渡してやるとよいです。
こんな感じ:

"msg=aaa&data=0124&command=go"

QFTPサーバからファイルをダウンロードするには?

WINDOWS2000、VB6.0、SP5で開発しています。

FTPサーバからファイルをダウンロードするやり方がわからなくて、困っています。

例えば、コマンドボタンを押した時に、指定したファイルをダウンロードしたいのです。

色々と調べてみたのところ、Winsockコントロールを使うとできるかもしれない、
というところまでは分かったのですが、そこからさっぱりです。
今日一日、調べていますがわかりません。
どうか、先輩方のアドバイス、よろしくお願いしますm(_ _)m

Aベストアンサー

こんにちは。


ルータとか使ってますか?
どういう環境でどの程度の事がしたいのか分らないので、
以下のURLにあるサンプルを見てみてください。

■WININET
 FTPクライアント (WININET使用)
 http://www.mitene.or.jp/~sugisita/vb6_net.html
トップページはこちら。
■PAPA'n VB (ぱぱんぶぃびぃ) - HOME
 http://www.mitene.or.jp/~sugisita/

■その他
 http://oshiete1.goo.ne.jp/kotaeru.php3?q=229365


それでは。

QSocket通信で、通信終了のイベントが発生しない

クライアント(Windows)とサーバ(Unix)とSocket通信をするアプリを作っています。処理内容はクライアントのデータファイルをサーバに送信(アップデイト)し、サーバ側でデータを解析し、その結果を印刷するという手順です。
WinSockを使って、送信そのものはうまくいくのですが、サーバでデータを解析し結果を印刷するのに時間がかかり(10秒以上)、その間は送信終了のイベントが発生しません。これはサーバ側での処理を exec関数とwait関数で行っているので、正しい事態なのですが、データの送信が終わったら後はサーバ側で勝手にやって欲しいのです。サーバでの処理を system関数に置換えたり、バックグランド処理にしてもやはり処理が終わるまで送信終了のイベントが発生しません。何かいい方法をお教えください。

Aベストアンサー

なるほどー
うーむ難しいですねー

Winsock1.SendData HogeHoge
DoEvents
とすると、どうですか?

またはサーバーが解析処理に入る前に、DoEventsみたいなものをUNIX側で実行することは無理ですか?
非同期で実行はしているけど、その解析処理が占有しているために、クライアントに届かないなんてことは無いですか?

すいません。かなり推測でお話をさせていただいてます。_(._.)_

QVBでフォルダ単位のFTP

VBでフォルダ単位のFTP(GET,PUT)はできるのでしょうか?
また、そのサンプルファイルがありましたら、教えて下さい。
ファイル単位での、サンプルファイルはあったのですが、
それを、フォルダ単位に改造する知識がまだないのです。
よろしくお願い致します。

Aベストアンサー

こんにちは 田吾作7@通信苦手です。。。

二つ例を挙げておきますね。
kernel32.dllを使用した場合
http://www.mitene.or.jp/~sugisita/family/papa/vb/
上記URLのコンポーネントの中のFTPクラスにサンプルがあります。

Wininet.dllを使用した場合
http://www.int21.co.jp/pcdn/vb/onepoint/knvol0812.html

ちなみにフォルダを丸ごとのアップというのは無理だったような・・・
何かFTPソフトを使用してますよね?
ぼくもの使用してるFTPソフトは、処理状況をステータスバーで表示してあるので、処理内容が何となく想像がつきます。
ローカルディスクと同じ構造でアップロードするというボタンがあるのですが、やってる事は、ファイルを1つずつアップして、フォルダがあれば作成して、その中のファイルをアップして・・・というようなことを最も下位層のフォルダ内のファイルまでのループ(再帰法?)をしてるようです。

QFTPサーバーから受信したファイル一覧からファイル名だけを取得したいです

こんばんは。いつもお世話になっております。

VB.NET+WinXPなのですが、
FTPサーバーにログインして、
LISTコマンドでファイル一覧を要求すると
「drwxrwxr-x 2 53 53 4096 Feb 28 2006 abc」
などというファイルやフォルダの一覧がかえって来ると思うのですが、
この中からファイル名やフォルダ名だけを取得するには
どうしたらよいでしょうか。
TABやコンマが入っていないので、文字列関数で切り取るにも
区切りがわからないと思うのです。
ローカルドライブのDir関数なら、FileAttribute.Nomalや.Directoryの指定でファイル名だけや
ディレクトリー名だけを指定して
取得することが出来るのですが、FTPサーバーの場合からの場合はどういった方法があるでしょうか。
参考程度でも構いませんので教えて頂けるとたすかります。m(__)m

Aベストアンサー

#1>ファイル名やディレクトリ名にスペースが使われている場合もあって難しいかなと思うのですが、
全然問題なし♪
例えば
件のリストの1行はスペースで区切られた9のフィールドと考えられますけど、その場合
$line="-rwxrwxr-x 2 53 53 4096 Feb 28 2006 include space 1.jpg";
@field = split(/\s+/, $line, 9);#フィールド数をしていすると、最後はまとめられる

print $field[8];# 9番目のフィールドにスペースがあっても大丈夫

QForm_Load と Form_Activate のタイミング

あるデータ入力アプリを作っています。
親フォーム(Form0)で番号を決め、子フォーム(Form1,Form2,Form3,Form4) でデータ入力し、それぞれの子フォームを出るとき(Unload Me) に、変数にsaveしています。それを親フォーム(Form0)で登録を選択したとき、入力データをチェックしてDBに格納しています。
すでにDB格納済のデータの場合、親フォームでDBから変数に読み込み、子フォームのForm_Loadで展開しています。
そこで困っているのは、親と子のフォームを行き来するときにデータの表示で前のが残っていたり、消えてしまったりします。
Form_LoadとForm_Activateを通過するタイミングが、ちゃんと理解できていないためコードの記述位置が不適切なのだと思います。

Form_Load と Form_Activate の実行タイミングについて、お教えください。

Aベストアンサー

Form_Loadは、フォームがロードされたときです。
ロードされる条件は、
1.フォームがスタートアップに指定されているとき、アプリが実行された直後。
2.Show メソッドが呼ばれたとき
3.Loadメソッドが呼ばれたとき
4.フォームに貼り付けられたコントロールのプロパティが参照されたとき
5.フォームに貼り付けられたコントロールのメソッドが呼ばれたとき
です。

ただし、一度ロードされると、Unloadされるまで呼ばれません。


Form_Activateは、フォームがアクティブになったとき、つまり、キャプション(ウィンドウのタイトルバー)の色が変わったときです。

Qモーダルフォームとモードレスフォーム

この二つの違いはどういう違いがあるのでしょうか?
どなたか教えてください。お願いいたします。

Aベストアンサー

実際にフォーム1とフォーム2を作成し、フォーム1に二つのコマンドボタンを用意して、以下のコードを貼り付けて見てください。

Private Sub Command1_Click()
Form2.Show vbModal, Me
MsgBox "vbModal"
End Sub

Private Sub Command2_Click()
Form2.Show vbModeless, Me
MsgBox "vbModeless"
End Sub

Command1でもCommand2でもフォーム2が開きます。しかしMsgBoxが表示するタイミングが変わってるはずです。
Command1の場合はフォーム2が閉じたあと
Command2の場合はフォーム2が表示されたあと
にメッセージボックスが表示されます。
つまりCommand1はShowのあとのロジックを、フォーム2が閉じるまで、未処理のままとなるわけです。

画面上はフォーム2が前面、フォーム1が背面になるどちらも似たような表示に見えますが、
Command1の場合はフォーム1はフォームをクリックしても、フォーカスを持たない
Command2の場合はフォーム1はフォームをクリックすると、フォーカスを持ちえる
という点も違います。


簡単にまとめると、
vbModalの場合はフォーム2だけに作業処理を固定させたい時に使用します。vbModelessの場合はフォーム2はポップアップ的な使用方法の時に使います。

実際にフォーム1とフォーム2を作成し、フォーム1に二つのコマンドボタンを用意して、以下のコードを貼り付けて見てください。

Private Sub Command1_Click()
Form2.Show vbModal, Me
MsgBox "vbModal"
End Sub

Private Sub Command2_Click()
Form2.Show vbModeless, Me
MsgBox "vbModeless"
End Sub

Command1でもCommand2でもフォーム2が開きます。しかしMsgBoxが表示するタイミングが変わってるはずです。
Command1の場合はフォーム2が閉じたあと
Command2の場合はフォー...続きを読む

QInetのResponseCodeについて

Inetコントロールでdatファイルを送信するプログラムを作成しています。
SENDした時、エラーだとStateChangedサブルーチンでicError(11)が返ってきます。
そこで、ResponseCodeでサーバの応答を見ているのですが・・・
「12003」と返ってきます。
この数値がさっぱりわかりません。

エラーの原因はサーバにある読み取り専用のファイルと同じファイルを送信するためです。
上書きできないということでエラーが出ていると思います。
この数値についてわかる人はいますか?
説明がわかりにくいかと思いますがよろしくお願いします。

Aベストアンサー

手元のソースによると

' Internet Errors
Public Const INTERNET_ERROR_BASE = 12000

Public Const ERROR_INTERNET_OUT_OF_HANDLES = (INTERNET_ERROR_BASE + 1)
Public Const ERROR_INTERNET_TIMEOUT = (INTERNET_ERROR_BASE + 2)
Public Const ERROR_INTERNET_EXTENDED_ERROR = (INTERNET_ERROR_BASE + 3)


ERROR_INTERNET_EXTENDED_ERRORで検索すると
http://msdn.microsoft.com/library/en-us/wininet/wininet/wininet_errors.asp

ERROR_INTERNET_EXTENDED_ERROR
An extended error was returned from the server. This is typically a string or buffer containing a verbose error message. Call InternetGetLastResponseInfo to retrieve the error text.

InternetGetLastResponseInfoを呼べば、"xxxに書き込めません。"と言ったメッセージを得るのでは?

手元のソースによると

' Internet Errors
Public Const INTERNET_ERROR_BASE = 12000

Public Const ERROR_INTERNET_OUT_OF_HANDLES = (INTERNET_ERROR_BASE + 1)
Public Const ERROR_INTERNET_TIMEOUT = (INTERNET_ERROR_BASE + 2)
Public Const ERROR_INTERNET_EXTENDED_ERROR = (INTERNET_ERROR_BASE + 3)


ERROR_INTERNET_EXTENDED_ERRORで検索すると
http://msdn.microsoft.com/library/en-us/wininet/wininet/wininet_errors.asp

ERROR_INTERNET_EXTENDED_ERROR
An extended error was re...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング