FTPでファイルの一覧を取得する(パッシブモード)

.NET (VB)の内容
【注意書き】
●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-2006 Ai Net Makoto 記事・情報の無断転載を禁止します。