最終更新日 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 を使用します。