【】Top
【】VB.NET
【】VB6.0
【】メールマガジンの購読
【】メールマガジンの解除
【】会社概要
【】お問い合わせ
姉妹サイト「バーチャルコネクション!」はこちらです。
姉妹サイト「七福神のメールでビンゴ!」はこちらです。
●24時間365日の安心をあなたにAT-LINK専用サーバ・サービスお勧めのサーバです。
|
|
|
|
|
FTPでファイルの一覧を取得する(パッシブモード)
|
|
【注意書き】 ●VB.NET を使っているものとします。 ●動作環境は、Windows XX を使用しているとします。
.NET でも、FTPでファイルの一覧を取得することが可能です。
この機能を使えば、簡単に、アプリケーション側で FTP接続で、データのやりとりを行いたい場合などに活用できます。
フォームに次の様なコードを記述します
-----------VB.NETコーディングここから-------------------
1.フォームに、ラベルコントロール 、テキストボックスコントロール 、リストボックスコントロール 、ボタンコントロール を配置します。 下記は、デフォルトのオブジェクトの名前と配置を示しています。
┏━━━━━━━━┓┏━━━━━━━━━━━━━━━━┓ ┃Label1 ┃┃TextBox1 ┃ ┗━━━━━━━━┛┗━━━━━━━━━━━━━━━━┛ ┏━━━━━━━━┓┏━━━━━━━━━━━━━━━━┓ ┃Label2 ┃┃TextBox2 ┃ ┗━━━━━━━━┛┗━━━━━━━━━━━━━━━━┛ ┏━━━━━━━━┓┏━━━━━━━━━━━━━━━━┓ ┃Label3 ┃┃TextBox3 ┃ ┗━━━━━━━━┛┗━━━━━━━━━━━━━━━━┛ ┏━━━━━━━━┓┏━━━━━━━━━━━━━━━━┓ ┃Label4 ┃┃TextBox4 ┃ ┗━━━━━━━━┛┗━━━━━━━━━━━━━━━━┛ ┏━━━━━━━━┓┏━━━━━━━━┓ ┃Button1 ┃┃Button2 ┃ ┗━━━━━━━━┛┗━━━━━━━━┛ ┏━━━━━━━━┓┏━ェ━━━━━━━━━━━━━━┓ ┃Label5 ┃┃ListBox1 ┃ ┗━━━━━━━━┛┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━┛ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃TextBox5 ┃ ┃※複数行 ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━┛
2.テキストボックスコントロール TextBox5は、 複数行の入力とするため、 Multiline プロパティを True にします。(複数行) ScrollBars プロパティを Vertical にします。 (スクロールバー)
3.ボタンコントロールの Button1 text プロパティに「接続」と記述します。 Button2 text プロパティに「切断」と記述します。 ラベルコントロールの Label1 text プロパティに「ホスト名」と記述します。 Label2 text プロパティに「ポート番号」と記述します。 Label3 text プロパティに「ユーザー」と記述します。 Label4 text プロパティに「パスワード」と記述します。 Label5 text プロパティに「ファイル一覧」と記述します。
※説明用のためです。必須ではありません。
┏━━━━━━━━┓┏━━━━━━━━━━━━━━━━┓ ┃ホスト名 ┃┃TextBox1 ┃ ┗━━━━━━━━┛┗━━━━━━━━━━━━━━━━┛ ┏━━━━━━━━┓┏━━━━━━━━━━━━━━━━┓ ┃ポート番号 ┃┃TextBox2 ┃ ┗━━━━━━━━┛┗━━━━━━━━━━━━━━━━┛ ┏━━━━━━━━┓┏━━━━━━━━━━━━━━━━┓ ┃ユーザー ┃┃TextBox3 ┃ ┗━━━━━━━━┛┗━━━━━━━━━━━━━━━━┛ ┏━━━━━━━━┓┏━━━━━━━━━━━━━━━━┓ ┃パスワード ┃┃TextBox4 ┃ ┗━━━━━━━━┛┗━━━━━━━━━━━━━━━━┛ ┏━━━━━━━━┓┏━━━━━━━━┓ ┃ 接続 ┃┃ 切断 ┃ ┗━━━━━━━━┛┗━━━━━━━━┛ ┏━━━━━━━━┓┏━━━━━━━━━━━━━━━━┓ ┃ファイル一覧 ┃┃ListBox1 ┃ ┗━━━━━━━━┛┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━┛ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃TextBox5 ┃ ┃※複数行 ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━┛
4.ボタンコントロールをダブルクリックして、 ボタンのクリックイベントの編集を開始して、 フォームの宣言部に、次のコードを記述します。
Imports System.Net Imports System.Text
さらに、次のコードを記述します。
Const C_SENDMODE_TEXT = 10 Const C_SENDMODE_LIST = 20
Const C_FTPPORT_SOC = 21
Const C_MJSOC_1 = 1 Const C_MJSOC_2 = 2
Dim Mjsoc As Sockets.Socket Dim Mjip As IPAddress Dim Mjipe As IPEndPoint
Dim Mjsocdata As Sockets.Socket Dim Mjipdata As IPAddress Dim Mjipedata As IPEndPoint
Dim MjipdataIp As String Dim MjipdataPort As String
Dim MjstrFilePath As String
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click
Dim strSev As String 'ホスト名 Dim strSevp As String 'ポート
Dim strUser As String 'ユーザー Dim strPass As String 'パスワード
Dim strRetString As String
strSev = TextBox1.Text strSevp = TextBox2.Text strUser = TextBox3.Text strPass = TextBox4.Text
mjsoc = New Sockets.Socket( _ Net.Sockets.AddressFamily.InterNetwork, _ Net.Sockets.SocketType.Stream, _ Net.Sockets.ProtocolType.Tcp)
Try Mjip = Dns.Resolve(strSev).AddressList(0) Mjipe = New IPEndPoint(Mjip, strSevp)
Mjsoc.Connect(Mjipe) strRetString = SED_DATA(Mjsoc, "", _ C_SENDMODE_TEXT, C_MJSOC_1) TextBox5.AppendText(strRetString & vbCrLf) Application.DoEvents()
strRetString = SED_DATA(Mjsoc, "USER " & strUser, _ C_SENDMODE_TEXT, C_MJSOC_1) TextBox5.AppendText(strRetString & vbCrLf)
strRetString = SED_DATA(Mjsoc, "PASS " & strPass, _ C_SENDMODE_TEXT, C_MJSOC_1) TextBox5.AppendText(strRetString & vbCrLf)
'アスキーモード strRetString = SED_DATA(Mjsoc, "TYPE A", _ C_SENDMODE_TEXT, C_MJSOC_1) TextBox5.AppendText(strRetString & vbCrLf)
'パッシブモード strRetString = SED_DATA(Mjsoc, "PASV", _ C_SENDMODE_TEXT, C_MJSOC_1) TextBox5.AppendText(strRetString & vbCrLf) Call FtpPasvGet(strRetString)
Mjsocdata = New Sockets.Socket( _ Net.Sockets.AddressFamily.InterNetwork, _ Net.Sockets.SocketType.Stream, _ Net.Sockets.ProtocolType.Tcp)
Mjipdata = Dns.Resolve(MjipdataIp).AddressList(0) Mjipedata = New IPEndPoint(Mjipdata, MjipdataPort)
Mjsocdata.Connect(Mjipedata)
'リストを取得する strRetString = SED_DATA(Mjsoc, "NLST -all", _ C_SENDMODE_TEXT , C_MJSOC_1) TextBox5.AppendText(strRetString & vbCrLf)
strRetString = SED_DATA(Mjsocdata, "", C_SENDMODE_LIST _ , C_MJSOC_2)
Mjsocdata.Shutdown(Sockets.SocketShutdown.Both) Mjsocdata.Close()
Call SED_DATA(Mjsoc, "QUIT " _ , C_SENDMODE_TEXT, C_MJSOC_1)
Mjsoc.Shutdown(Sockets.SocketShutdown.Both) Mjsoc.Close()
Catch ex As Exception TextBox5.AppendText(ex.Message) End Try
End Sub
Function SED_DATA(ByVal Soc As Sockets.Socket, _ ByVal strData As String, ByVal intMode As Integer, _ ByVal intSoc As Integer) As String
SED_DATA = ""
Dim strD As String Dim strDB() As String
Dim intRet As Integer Dim bytRetBuf(1024) As Byte Dim bytWBuf() As Byte
Dim strString As String Dim strIP As String
Dim strDW As String
Dim strWStr() As String
If strData <> "" Then bytWBuf = Encoding.ASCII.GetBytes( _ strData & vbCrLf) Soc.Send(bytWBuf) End If
Do Do
bytRetBuf.Initialize() intRet = Soc.Receive(bytRetBuf)
strDW = Encoding.ASCII.GetString( _ bytRetBuf, 0, intRet) strD &= strDW If Soc.Available = 0 Then If intSoc = C_MJSOC_2 _ And intMode = C_SENDMODE_LIST Then If Soc.Poll(100, _ Sockets.SelectMode.SelectRead) _ Then Exit Do End If Else Exit Do End If
End If
Loop
If intSoc = C_MJSOC_1 Then strWStr = Split(strD, vbCrLf) If UBound(strWStr) = 0 Then Exit Do End If If Trim(strWStr(UBound(strWStr) - 1).Substring( _ 3, 1)) = "" Then Exit Do End If Else Exit Do End If
Loop SED_DATA = strD
If intSoc = C_MJSOC_2 Then strWStr = Split(strD, vbCrLf) ListBox1.Items.AddRange(strWStr) End If
If Nothing = SED_DATA Then SED_DATA = "" End If
End Function
Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load TextBox1.Text = "" TextBox2.Text = C_FTPPORT_SOC TextBox3.Text = "" TextBox4.Text = "" TextBox4.PasswordChar = "*" TextBox5.Text = ""
ListBox1.Items.Clear()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click
Try Call SED_DATA(Mjsoc, "QUIT " _ , C_SENDMODE_TEXT, C_MJSOC_1)
Mjsoc.Shutdown(Sockets.SocketShutdown.Both) Mjsoc.Close()
Catch ex As Exception TextBox5.AppendText(ex.Message)
End Try
End Sub
Sub FtpPasvGet(ByVal GetMessage As String) 'PASVにてFTPサーバへの接続ポートを取得
Dim wk1 As String Dim wk2 As String
Dim wk3 As String Dim pos1 As Integer Dim pos2 As Integer
pos2 = InStr(1, GetMessage, ")", 1) pos1 = pos2
Do pos1 = pos1 - 1 If Mid(GetMessage, pos1, 1) = "," Then wk2 = Mid(GetMessage, pos1 + 1, _ pos2 - pos1 - 1) Exit Do End If Loop pos2 = pos1 Do pos1 = pos1 - 1 If Mid(GetMessage, pos1, 1) = "," Then wk1 = Mid(GetMessage, pos1 + 1, _ pos2 - pos1 - 1) Exit Do End If Loop
Dim i As Integer Dim istr As Integer
pos2 = InStr(1, GetMessage, "(", 1) pos1 = pos2 Do istr = istr + 1 pos1 = pos1 + 1 If Mid(GetMessage, pos1, 1) = "," Then i = i + 1 If i >= 4 Then Exit Do End If
Loop wk3 = Mid(GetMessage, pos2 + 1, istr - 1) wk3 = wk3.Replace(",", ".")
MjipdataIp = wk3
MjipdataPort = _ CLng(wk1) * 256 + CLng(wk2) 'FTPサーバから取得したポート番号で接続します。
End Sub
5.ビルドして実行します。
6.ホスト名に、FTPサーバー名を入力します。 例) localhost.com
7.ポート番号に、ポート番号を入力します。 例)21
8.ユーザーに、FTPログオンユーザー名を入力します。 例)loginuser
9.パスワードに、FTPログオンパスワードを入力します。 例)loginpass
10.フォームに表示された「接続」ボタンを押します。
11.FTPサーバーへの接続動作が行われたことを確認できます。
12.さらに、サーバーよりファイルと一覧を 表示出来る事を確認できます。
-----------VB.NETコーディングここまで-------------------
本サンプルでは、ファイルのアップロード、ダウンロードの機能は 実装していません。
パスワードの入力は、"*"で伏せるようにしております。
本サンプルの 例) の入力値は、あくまで例題であり、 接続が行えるものではありませんでの、 接続が可能な サーバー に書き換えてご使用ください。
本サンプルでは、 パッシブモードでダウンロードするようにしています。
|
http://anetm.com/dev/d.cgi?SC=DTDTL&o=l3l
Copyright(c)2001-2004 Ai Net Makoto 記事・情報の無断転載を禁止します。
|
|
|
|
|
|
|