プログラミング


FTP のプロトコルの取得方法について

最終更新日 2005 年 12 月 16 日

サンプル コードのダウンロード (vbmigtips_FTPPro.msi, 483 KB)

FTP サーバーへ接続する FTP クライアントアプリケーションを作成したい場合があると思います。そこで今回は、FTP プロトコルを使用したファイルリストの取得方法ついて紹介します。図1のように、URL 欄に接続する FTP サーバーの URL を指定し、[接続]ボタンをクリックすると、FTP サーバーのファイル名を下部にリスト表示します。


 図 1

Visual Basic 6.0 や Visual Basic .NET では、ネットワークへの接続のための WebRequest クラス(Visual Basic .NET)がサポートされていましたが、FTP サーバーへの接続は行うことができませんでした。一方、Visual Basic 2005 では、WebRequest クラスの Create メソッドを使用して FTP サーバーに接続することができるようになりました。また、System.Net.WebRequestMethods.Ftp.ListDirectoryDetails で FTP のリスト プロトコルを取得します。実装コードは以下のとおりです。

Imports System.Net
Imports System.IO

Private strOldUrl = Nothing

Private Sub ToolConnectionButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolConnectionButton.Click
    ViewFTPList(ToolHostTextBox.Text)
End Sub

Private Sub ViewFTPList(ByVal strFTPUrl As String)
    Dim reader As StreamReader = Nothing
    ListBox1.Items.Clear()
    Try
        Dim listRequest As FtpWebRequest = WebRequest.Create(strFTPUrl)
        listRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails
        Dim listResponse As FtpWebResponse = listRequest.GetResponse()
        reader = New StreamReader(listResponse.GetResponseStream())
        Dim strData As String
		
        Do
            strData = reader.ReadLine()
            If strData IsNot Nothing Then
                If strData.StartsWith("d") Then
                    ListBox1.Items.Add(strData.Substring(strData.LastIndexOf(" ") + 1) + " " + "<DIR>")
                Else
                    ListBox1.Items.Add(strData.Substring(strData.LastIndexOf(" ") + 1))
                End If
            End If
        Loop While Not strData Is Nothing
    Catch ex As UriFormatException
        ex.ToString()
    Catch ex As WebException
        ex.ToString()
    Finally
        If reader IsNot Nothing Then
            reader.Close()
        End If
    End Try
End Sub

Private Sub ListBox1_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.DoubleClick
    Try
        Dim strData As String = ListBox1.SelectedItem.ToString()
        Dim strNewUrl = Nothing
        Dim sep() As String = {" "}
        If strData <> Nothing Then
            Dim strSep() = strData.Split(sep, StringSplitOptions.RemoveEmptyEntries)
            If strSep.Length = 2 Then
                If ToolHostTextBox.Text.LastIndexOf("/") = ToolHostTextBox.Text.Length - 1 Then
                    strNewUrl = ToolHostTextBox.Text + strSep(0)
                Else
                    strNewUrl = ToolHostTextBox.Text + "/" + strSep(0)
                End If
            End If
            If strNewUrl <> Nothing Then
                strOldUrl = ToolHostTextBox.Text
                ToolHostTextBox.Text = strNewUrl
            End If
        End If
    Catch ex As Exception
        ex.ToString()
    End Try
End Sub

リスト1

上記(リスト1)の「ViewFTPList(ToolHostTextBox.Text)」では、ViewFTPList メソッドによって FTP サーバーに接続し、リストを表示します。ViewFTPList メソッド(「Private Sub ViewFTPList(ByVal strFTPUrl As String) ... EndSub」)の「Dim listRequest As FtpWebRequest = WebRequest.Create(strFTPUrl)」で、指定した FTP の URL に接続し、「listRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails」で、取得する FTP リスト プロトコルを作成し、「Dim listResponse As FtpWebResponse = listRequest.GetResponse()」で、FTP リスト プロトコルを取得します。取得した FTP リスト プロトコルは、StreamReader オブジェクト(reader)に格納します。reader には、図2 のような型式でファイル情報が格納されます。


 図 2

図2 では分かりづらい部分があるため、「Do ... Loop While Not strData Is Nothing」で、フォルダ名とファイル名を表示取得し、リストボックスに表示します。「ListBox1.Items.Add(strData.Substring(strData.LastIndexOf(" ") + 1) + " " + "<DIR>")」では、reader に格納されているリストプロトコルからフォルダ名取得し、語尾にフォルダであることを示すため「<DIR>」をつけます。「ListBox1.Items.Add(strData.Substring(strData.LastIndexOf(" ") + 1))」ではファイル名を取得し、リストボックスに表示します。上記を実装し、URL 欄に FTP サーバーの URL を指定し、[接続]ボタンをクリックします。すると、図3 のように、フォルダ名とファイル名がリスト表示されます。


 図 3

上記(リスト1)の「Private Sub ListBox1_DoubleClick( ... End Sub」では、リスト表示されたフォルダの中に入る処理を実装しています。「ViewFTPList(strNewUrl)」で、ViewFTPList メソッドを使用して、新たに設定した FTP サーバーの URL に接続し、リストプロトコルを表示します。「strOldUrl = ToolHostTextBox.Text」では、後で説明する戻る機能の実装のため、URL を格納しておきます。図3 のリストボックスからフォルダ(語尾に「」のついたもの)をダブルクリックします。すると、図4 のように表示されます。


 図 4

続いて、[戻る]ボタン、[↑]ボタンの実装を行います。実装コードは以下のとおりです。

Private Sub ToolBackButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolBackButton.Click
    If strOldUrl <> Nothing Then
        Dim strDumyUrl As String = ToolHostTextBox.Text
        ViewFTPList(strOldUrl)
        ToolHostTextBox.Text = strOldUrl
        strOldUrl = strDumyUrl
    End If
End Sub

Private Sub ToolUpButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolUpButton.Click
    Dim strDumyUrl As String = ToolHostTextBox.Text
    Dim iIndex As Integer = strDumyUrl.LastIndexOf("/")
    If iIndex = strDumyUrl.Length - 1 Then
        strDumyUrl = strDumyUrl.TrimEnd("/"c)
    End If
	
    Dim iIndex2 As Integer = strDumyUrl.LastIndexOf("/")
    If strDumyUrl(iIndex2 - 1) <> "/"c Then
        strDumyUrl = strDumyUrl.Remove(iIndex2 + 1, strDumyUrl.Length - 1 - iIndex2)
        ViewFTPList(strDumyUrl)
        strOldUrl = ToolHostTextBox.Text
        ToolHostTextBox.Text = strDumyUrl
    End If
End Sub

リスト2

上記(リスト2) の「Private Sub ToolBackButton_Click( ... End Sub」では、[戻る]ボタンの実装を行い、「Private Sub ToolUpButton_Click( ... End Sub」では、[↑]ボタンの実装を行います。上記を実装し、図4 の状態から[戻る]ボタン又は[↑]ボタンをクリックすると、図3 に戻ります。図3 に戻った状態から、再度[戻る]ボタンをクリックすると、図4 になります。

今回、FTP プロトコルを使用したファイルリストの取得について紹介しましたが、取得したファイルリストからファイルをダウンロードしたり、アップロードなども行うことができます。ダウンロードを実装する場合は、 System.Net.FtpWebResponse.GetResponseStream を使用し、アップロードを実装する場合は、WebRequestMethods.Ftp.UploadFile を使用します。

Page view tracker