• ベストアンサー

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

  • inetコントロールを使用したFTP送信の質問その1

    ローカルにあるファイルを、FTPサーバに送信するプログラムを作成しました。 inetコントロールを使用して、以下のようなプログラムを組みました。 Private sub ftp()  Inet1.Protocol=icFTP  Inet1.Url="ftp://xxx.xxx.xxx.xxx/"  Inet1.UserName="aaaa"  Inet1.Password="bbbb"  Inet1.Execute , "SEND x:\xxx\xxx.txt xxx/xxx.txt" End sub Private sub Inet1_StateChanged(Byval State As Integer) Dim sMsg As String  Select Case State   Case icRequestSent    sMsg = "送信完了"    TCall LogWrite(sMsg) ログをファイルに書く(自作関数)   Case icError    sMsg = Inet1.ResponseCode & " " & Inet1.ResponseInfo    Call LogWrite(sMsg) エラーログをファイルに書く(自作関数)  End Select End Sub ファイルを複数送信するため、「sub ftp()」は複数回呼び出されます。 上記プログラムにCLOSEコマンドとCANCELメソッドを追加して、以下のようにしたほうがよいのでしょうか? CLOSEコマンドとCANCELメソッドの使い方がよくわからず、悩んでいます。 Private sub ftp()  Inet1.Protocol=icFTP  Inet1.Url="ftp://xxx.xxx.xxx.xxx/"  Inet1.UserName="aaaa"  Inet1.Password="bbbb"  Inet1.Execute , "SEND x:\xxx\xxx.txt xxx/xxx.txt"  Inet1.Execute , "CLOSE" End sub Private sub Inet1_StateChanged(Byval State As Integer) Dim sMsg As String  Select Case State   Case icRequestSent    sMsg = "送信完了"    TCall LogWrite(sMsg) ログをファイルに書く(自作関数)   Case icError    sMsg = Inet1.ResponseCode & " " & Inet1.ResponseInfo    Call ErrLogWrite(sMsg) エラーログをファイルに書く(自作関数)    Inet1.Cancel  End Select End Sub

  • FTP接続での不具合

    以下のコードでFTPへの接続を行っていますが、わからないところがあります。 (1)「リモートホストに接続できません」とエラーが出てしまいます。 どのあたりが怪しいのかわからず困っています。 (2)GET の書き方について "GET test.txt C:\Test\test.txt"    ******** 受信するファイル名の指定の仕方ですが、上記の*******印部分ですが、 たとえばURLがpc000のTempフォルダの下にあるtest.txtを受信したい場合はディレクトリの指定の書き方がわかりません。 "GET /Temp/test.txt C:\Test\test.txt" と書いたりもしていますが、はたしてこの書き方があっているのかわかりません。 ご教示ねがえませんでしょうか? よろしくお願いいたします。     'FTP接続------------------------------------- Inet1.URL = "FTP://pc000" Inet1.Password = "xxx" Inet1.UserName = "yyy" Text1.Text = Inet1.OpenURL Inet1.Execute Inet1.URL, _ "GET test.txt C:\Test\test.txt" '-------------------------------------

  • 日本語混じりのファイルをランダムアクセスで読みこむ場合

    ファイルを1024バイトずつ読みこみ、その内容をソケットでホストへ送るというアプリがあります。 ファイルを「1024バイト読んで→送信」を繰り返すのですが、ファイルを読みこむところ(Get)で日本語が混じったときにエラーを生じます。 「レコード長が一致しません」というエラーメッセージです。 日本語がはいる桁数だけバイト数は減るためだと思いますが、ランダムアクセスで読みこむと場合の記述の仕方で、何とかならないものかと思案しています。 どなたかご教授ください。よろしくお願いします。 <プログラム記述例>   Dim filenum As Integer   Dim filename As String   Dim buffer As String * 1024   filename = "e:\tmp\file.txt"   filenum = FreeFile   Open filename For Random Access Read As #filenum Len = 1024   Do While Not EOF(filenum)     Get #filenum, , buffer   Loop   Close #filenum

  • FTPサーバからダウンロードするには?

    windowsXP,VB6,SP5で開発しています。 下のコードはヘルプからなんですが、 これをURLとファイル名を変更してやってみても、全然できません。 Private Sub Form_DblClick() Inet1.AccessType = icUseDefault Dim b() As Byte Dim strURL As String ' この URL は有効な URL であると仮定します。 strURL = "ftp://ftp.microsoft.com/" & _ "developr/drg/Win32/Autorun.zip" ' ファイルをバイト配列として取得します。 b() = Inet1.OpenURL(strURL, icByteArray) Open "C:\Temp\Autorun.zip" For Binary Access Write As #1 Put #1, , b() Close #1 MsgBox "完了しました。" End Sub ここの部分でタイムアウトになってしまいます。 b() = Inet1.OpenURL(strURL, icByteArray) FTPサーバのアドレスとかちゃんとあってます。 どなたか、解決方法をご教授くださいませm(_ _)m

  • VB.NETでサーバーからFILEを取得する

    サーバー上にあるテキストファイルを FTPで取得したいのですが VBであればInetを使用して↓のように取得が可能 だったのですがVB.NETでのInetの使用方法がわかりません どなたかご存知の方がいらしたらご教授願えますか? また、別の方法がありましたらアドバイスをお願いします。 宜しくお願いいたします。 ==================== Dim FileName As String Inet.URL = "ftp://hostname/home/temp/" Inet.UserName = "username" Inet.Password = "password" Inet.Execute(, "GET test.txt " & FileName) Do While Inet.StillExecuting = True DoEvents() Loop MsgBox("ダウンロード終了") ====================

  • FTPで見えるファイルと見えないファイルがあります。

    FTPで見えるファイルと見えないファイルがあります。 CentOS5.4にvsftpdをインストールして、PCからFTP転送を行おうとしています。 /tmpディレクトリにファイルを転送すると、FTPツールに転送したファイルは表示されますが、 元々/tmpにあったファイルはFTP転送ツールに表示され無い状態となっています。 ・FTP転送ツールを再起動しましたが、転送したファイルしか見えません。 又、FTP転送ツールではなく、DOS窓上でFTP接続して、DIRで見た時も転送したファイルしか見えません。 このことから、FTPツールの問題ではなく、FTPサーバー側の問題を判断しました。 ・Linuxサーバを再起動しても、転送したファイルしか見えません。 ・Linuxサーバ上で、転送したファイルを"cp -p"でコピーした場合、コピーしたファイルはFTPツール上見えません。 現在Linux上では、 tmp>ll -rw-r--r-- 1 root root 2 5月 13 17:20 a1.txt -rw-r--r-- 1 root root 2 5月 13 17:20 a2.txt -rw-r--r-- 1 root root 2 5月 13 17:20 b1.txt となっているのですが、 a1.txt:FTP転送したファイル a2.txt:a1.txtを cp -p a1.txt a2.txtでコピーした b1.txt:viで作成した FTPコマンドで見ると、 ftp> dir 200 PORT command successful. Consider using PASV. 150 Here comes the directory listing. -rw-r--r-- 1 0 0 2 May 13 08:20 a1.txt というようにa1.txtしか見えません。 原因はわかりましたらご教授ください。よろしくお願いいたします。

  • テキスト文書(.txt)→エクセルにインポート

    エクセルから、テキスト文書(.txt)をインポートする機能を VBAで作成しているのですが、1つのセルに複数の行を 入力する方法がわからず、困っています。ご存知の方い らっしゃいましたら、ご教授よろしくお願いします。 ↓途中までのコードです。↓ Sub ボタン1_Click() Dim dir_name As String, file_name As String Dim rn As Integer dir_name = Application.GetOpenFilename( _ "テキストファイル (*.txt),*.txt", 1, _ "読み込み元のファイルをどれか一つ開いてください" _ ) If dir_name = "False" Then Exit Sub file_name = Dir("*.txt", vbNormal) rn = 1 ' 開始行 - 1 を設定 Do Until file_name = "" rn = rn + 1 Call ImportText(file_name, rn) file_name = Dir() Loop End Sub '------------------------------------------------------- Sub ImportText(file_name As String, rn As Integer) Dim FileNum As Integer Dim TextLine As String Dim cn As Integer FileNum = FreeFile() Open file_name For Input Access Read As #FileNum Application.StatusBar = "ファイル""" & file_name & """の内容を読み込んでいます。" On Error GoTo CloseFile Do Until EOF(FileNum) Line Input #FileNum, TextLine If cn < 6 Then cn = cn + 1 Cells(rn, cn).Value = Trim(TextLine) Else ★★★★★★★★★★★★★★★ End If Loop End Sub 『 ★★★★★★★★★★★★★★★』となっているところに、 Cells(rn, cn).Value = Trim(TextLine) と書いて、1つのセル に残りの文章を全て入れようとしたのですが、このままでは上書 きされてしまい、最後の1行しか残っていません。 [例]残りの文字 こんにちは こんばんは おかえり。 ↓これをそのまま1つのセルに↓ こんにちは こんばんは おかえり。 と入れるには、どのような記述をすれば良いのでしょうか? (Excel2007を使用しています。)

  • WSHファイルからFTPを利用してダウンロードする

    batファイル,もしくはWSHファイルを使用してのFTPサーバからのファイルダウンロードを行う際の記述方法について質問致します。 行いたいことはFTPサーバ側に日毎のディレクトリが作成され その中に格納されるテキストファイルを自動でローカルの指定ディレクトリに上書きする手順になります。 WSHに関しては全くの素人なので非常に苦戦しております… FTPサーバ側 /@day/*.txt @dayには本日の日付が2桁で入ります。 1月1日なら01、2月23日なら23 Local保存側 D:\temp お手すきの時にでもご教授頂ければ幸いです。

  • VB2005でのファイル操作について

        Dim filedata As String Dim fileNum As Integer Dim fileName As String Dim i As Integer fileName = "C:\Paradata.txt" fileNum = FreeFile() FileOpen(fileNum, fileName, OpenMode.Output) For i = 0 To 9 filedata = data(i, 0) & "," & data(i, 1)・・・・・ PrintLine(fileNum, filedata) Next FileClose あるボタンを押しますと上記のようにテキストファイルにデータを保存しようとしているのですが、1回目のボタンクリックではエラーが無いのですが2回目以降は"別のプロセスで使用されているため、プロセスはファイル 'C:\Paradata.txt' にアクセスできません。"のエラーが発生してしまいます。いろいろと調べているのですがまだわからないのでどこがおかしいか教えてください。よろしくお願い致します。

  • VBAでFTPサーバーへのアップデート

    BASP21でのFTPサーバーへのアップデートが出来ないです。 BASP21をインストールし、サーバーのユーザー名やパスワードも あっている状態です。 しかし、アップデートすると 「を送信できませんでした。」 と表示され、アップデートできませんでした。 「FTP接続できませんでした。」は抜けているので、 それ以外が原因だとは思うのですが分かりません。 Visual Basicのサンプルから書きました。 以下の通りです。 初心者のため質問に不備があるかもしれません。 予めお許しください。 Sub FTPサーバーにUP() Dim FTP, rc As Long, Server As String, User As String, Pass As String Dim Target As String, Folder As String Set FTP = CreateObject("basp21.FTP") ''FTPオブジェクト Server = "ftp.●●●●●●.jp" ''ホストアドレス User = "●●●●●●" ''ユーザー名 Pass = "●●●●●●●●" ''パスワード Target = "C:\Users\●●\Desktop.エクセルファイル.xls" ''送信ファイル If Target = "False" Then Exit Sub Folder = "/home/●●●●●●/●●●●/●●●/状況" rc = FTP.Connect(Server, User, Pass) If rc <> 0 Then MsgBox "FTP接続できませんでした。", vbCritical FTP.Close Exit Sub End If rc = FTP.PutFile(Target, Folder) If rc <> 1 Then MsgBox Dir(Target) & "を送信できませんでした。", vbCritical FTP.Close Exit Sub End If MsgBox Dir(Target) & "を送信しました。", vbInformation FTP.Close End Sub

専門家に質問してみよう