はじめに
FTPアプリケーションの作成は、プロトコルの設定やサーバ接続の方法など、少し知識が必要です。しかし、PowerTools Secure FTP 2.0JのFTPコントロールは、プロパティにFTPサーバのアドレス・ユーザー名・パスワードを設定するだけで、簡単にFTPアプリケーションを作ることができます。
早速、このFTPコントロールを使って、FTPサーバからファイルのリスト一覧を取得し、リストボックスで表示するアプリケーションを作ってみました。
![FTPサーバにログオンし、ディレクトリを移動してファイルの一覧をリストボックスに表示する](http://cz-cdn.shoeisha.jp/static/images/article/3974/01.jpg)
![リストのファイル名をクリックすると、ラベルにサイズや更新日時、アクセス権限を表示する](http://cz-cdn.shoeisha.jp/static/images/article/3974/02.jpg)
対象読者
Visual Basic/ Visual C# 2005・2008を使ってプログラムを作ったことのある人。
必要な環境
Visual Basic 2005、 2008、Visual C# 2005、 2008、Visual Studio 2005、 2008でプログラムが作れる環境。
なお、本プログラムはWindows Vista上で動作するVisual Studio 2005を使用して作成し、動作確認を行っています。
プログラム実行時の注意事項
PowerTools Secure FTP 2.0Jを使って作成したアプリケーションを配布する場合、PowerTools Secure FTP 2.0Jのアセンブリファイルを添付する必要があります。これは、Common Language RuntimeのDLLをアプリケーションと一緒に配布するのと同じです。
本記事のサンプルアプリケーションを正常に動作させるためには、次の3つのファイルをインストールする必要があります。
- Dart.PowerTCP.SecureFtp.dll…本体アセンブリ
- Dart.PowerTCP.SecureFtp.Forms.dll…フォーム用アセンブリ
- Dart.PowerTCP.SecureFtp.resources.dll…サテライトリソース
これらのファイルを、プログラムを実行するフォルダに格納します。.NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0がインストールされていることが必須条件です。
サンプルプログラムを実行する際は、サーバアドレス、ユーザー名、パスワード、参照ディレクトリを正しく入力し、接続ボタンを押してください。
これらの入力に対するエラー処理を組み込んでいませんので、入力せずに「接続」ボタンを押す、あるいは間違った入力があると、実行時エラーとになってしまうので注意してください。
コンポーネントのインストール
はじめてPowerTools Secure FTP 2.0Jを使用する方は、Visual Studio、Visual Basic、Visual C#の開発環境にPowerTools Secure FTP 2.0Jをインストールする必要があります。
インストーラは、グレープシティのWebページからダウンロードできます。ユーザー情報を登録すると送られてくるメールにダウンロード用のURLが記載されているので、ここからダウンロードしてインストールしてください。ファイルはzip形式で圧縮されています。
有償のコントロールですが、プロダクトキーを入力せずにインストールすることで、トライアル版として使用できます。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。
コントロールの追加
PowerTools Secure FTP 2.0Jをインストールしたら、ツールボックスに専用のタブを作成し、使用するコンポーネントを追加します。追加するコンポーネントは、「.NET Frameworkコントロール」のアセンブリ名が「Dart.PowerTCP.SecureFTP」で始まるコンポーネント「Ftp」です。
GUIのデザイン
フォームにFtpコントロールを配置します。ただし、このコントロールはプロセスを提供するコントロールなので、ユーザーインターフェースは持ちません。フォームのデザインでは、SplitPanelコントロールを配置してその上にボタン、ラベル、テキストボックス、リストボックスを配置しています。
SplitPanelコントロールは、OrientationプロパティをHorizontalに変更し、DockプロパティをFillにします。ListBoxコントロールも、DockプロパティをFillにします。
Ftpコントロールは、次のプロパティを使ってログインセッションを作成します。
プロパティ | 設定値 |
---|---|
Server | FTPサーバのアドレス |
Username | ログインユーザー名 |
Password | ログインパスワード |
このプログラムでは、これらの入力をTextBoxコントロールで行うようにします。また、フォームの下部にはStatusStripコントロールを配置し、StatusLabelを配置します。
![GUI画面](http://cz-cdn.shoeisha.jp/static/images/article/3974/04.gif)
Ftpコントロールについて
Secure FTPは、.NET Frameworkのために設計された通信コンポーネントで、FTPサーバへのファイル送受信を容易に実現する強力なツールです。Windowsアプリケーション、Webアプリケーションの両方で使用でき、以下のようなことが行えます。
- ログイン処理をハンドリングし、FTPサーバとユーザー名、パスワードを指定するだけで、サーバとの通信を必要とするメソッドが実行され、自動的にログインを行います。ユーザーが接続を閉じるか、Ftpコンポーネントが無効になるまで、FTPサーバへのログインを維持します。
- メソッドを実行するだけで、同期・非同期で単一ファイルや複数ファイルの送受信を可能にします。また、ストリームをリモートファイルに保存したり、アプリケーション内で利用するストリームとして、リモートファイルを取得できます。
- データ接続を完全に制御でき、データ接続からの読み込みとデータ接続への書き込みができます。
- ユーザー定義を含むあらゆるコマンドを送信できます。
- FtpProxyオブジェクトを使った完全なProxyサポートが組み込まれており、プロパティを設定すれば、Proxyの利用は自動的に処理されます。さらに、使用しているFTPサーバが独自のログインシーケンスを必要とする場合、 Ftpコンポーネントは、ログインに必要なコマンドの送信を行い、FTP サーバとの接続を可能にします。
今回は、このFtpコントロールを使って、FTPサーバからファイルリストの一覧を同期取得するプログラムを作成します。
リストの取得
FTPサーバからファイルリストを同期通信で取得するには、 まずはじめにServer、Username、Passwordの各プロパティを設定します。 これにより、自動的なサーバーログインが可能になります。次にListメソッドを実行します。 このメソッドは、サーバから指定したディレクトリのファイルリストを、Listingコレクションオブジェクトとして返してきます。
ListingコレクションオブジェクトはListEntryオブジェクトの集合体で、ListEntryオブジェクトは各ファイルに関する情報(ファイル名、サイズ、更新日時、アクセス権など)を持ったオブジェクトです。従って、ファイルのリストを取得するには、以下の順番でFtpコントロールの各メソッドを実行します。
- Server、Username、Passwordの各プロパティを設定する
- ファイルを取得するディレクトリをカレントディレクトリに切り替えるコマンドを送信する
- Listメソッドを実行し、ファイルリストを取得する
- 取得したファイル情報を表示する
- 接続を閉じる
これらの処理をボタン「Button1」のClickイベントハンドラに作成します。
準備とサーバ接続処理
最初に、サーバ接続処理を作成します。
まず、Listメソッドの戻り値を受け取る変数を、モジュールレベルで宣言します。そして、Server、Username、Passwordの各プロパティをTextBoxから取得して設定する式を作成します。
また、リストを取得するディレクトリ名を受け取る式を作成します。TextBoxが空白であれば、FTPサーバのルートディレクトリをカレントディレクトリとして、ファイルリストを取得します。
Imports Dart.PowerTCP.SecureFtp Public Class Form1 Private files As Listing Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim dirname As String = "" ListBox1.Items.Clear() Ftp1.Server = TextBox1.Text Ftp1.Username = TextBox2.Text Ftp1.Password = TextBox3.Text dirname = TextBox4.Text
using Dart.PowerTCP.SecureFtp;
namespace myftp_cs
{
public partial class Form1 : Form
{
private Listing files;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string dirname = "";
listBox1.Items.Clear();
ftp1.Server = textBox1.Text;
ftp1.Username = textBox2.Text;
ftp1.Password = textBox3.Text;
dirname = textBox4.Text;
カレントディレクトリの変更とリストの取得
続いて、ファイルリストを取得するディレクトリを指定している場合は、ディレクトリ変更のコマンドをFTPサーバに送信する処理を行います。この処理は、FtpコントロールのInvokeメソッドを使用します。引数は2つで、最初の引数にコマンド名をFtpCommand列挙体のメンバで指定します。
ディレクトリの変更はメンバ「ChangeDir」を指定します。2番目の引数には、コマンドと一緒に送信するパラメータを設定します。ここでは、変更するディレクトリ名(フォルダ名)です。
メソッドが実行されると、カレントディレクトリが指定したディレクトリに変更されます。また、このメソッドが実行される直前に、自動的にサーバへのログイン処理が実行されます。TextBoxにディレクトリの指定がなければInvokeメソッドは実行されず、カレントディレクトリは変更されません。
そして、Listメソッドを実行します。取得したファイルリストをListingオブジェクトで返してきますので、変数に格納します。また、ListingオブジェクトのCountプロパティで取得したファイル数を把握できますので、これをステータスバーで表示します。
If dirname <> "" Then Ftp1.Invoke(FtpCommand.ChangeDir, dirname) End If files = Ftp1.List("*", True) ToolStripStatusLabel1.Text = "取得ファイル数:" & files.Count
if (dirname != "") { ftp1.Invoke(FtpCommand.ChangeDir, dirname); } files = ftp1.List("*", true); toolStripStatusLabel1.Text = "取得ファイル数:" + files.Count;
メンバ | 解説 |
---|---|
Account | 認証情報を提供するために「ACCT」を送信します |
ChangeDir | デフォルトの作業ディレクトリを変更するために「CWD <pathname>」を送信します |
ChangeDirUp | デフォルトの作業ディレクトリを1つ上のレベルに移動するために「CDUP」を送信します |
Delete | ファイルを削除するために「DELE <filename>」を送信します |
Help | ヘルプ情報を取得するために「HELP」を送信します |
MakeDir | ディレクトリを作成するために「MKD <pathname>」を送信します |
NoOp | 接続をテストするために「NOOP」を送信します |
Null | 修飾子のみが送信されるので、独自のコマンドを送信できます |
Password | 認証情報を提供するために「PASS」を送信します |
PrintDir | 現在の作業ディレクトリを確認するために「PWD」を送信します |
Quit | 接続を終了するために「QUIT」を送信します |
Reinitialize | セッションとログインを初期化するために「REIN」を送信します |
RemoveDir | ディレクトリを削除するために「RMD <pathname>」を送信します |
RenameFrom | 名前を変更するファイルを指定するために「RNFR <pathname>」を送信します |
RenameTo | ファイルの新しい名前を指定するために「RNTO <pathname>」を送信します |
SiteParameters | 特別なサービスにアクセスするために「SITE」を送信します |
Size | ファイルのサイズを取得するために「SIZE <filename>」を送信します |
Status | ステータス情報を取得するために「STAT」を送信します |
Structure | 特別なパターンのレコードとページ設定を操作するために「STRU <F|R|P>」を送信します |
StructureMount | ログアウトせずに別のファイルシステムのデータ構造をマウントするために「SMNT <structure>」を送信します |
System | システム情報を取得するために「SYST」を送信します |
Username | 認証情報を提供するために「USER」を送信します |
リストの作成と表示
リスト作成処理
取得したリストは、ListingオブジェクトのFormatプロパティを使って、リストの形式(UNIXなのかDosなのか、それとも不明の形式なのか)をチェックします。そして、不明な形式以外であれば、For...Eachステートメントを使ってファイルを1つずつ取り出し、ListBoxに組み込みます。
その際、ListEntryオブジェクトのTypeプロパティを参照し、ファイルのタイプがディレクトリかどうかをチェックします。これは、「EntryType列挙体」のメンバ「Directory」と比較します。ファイルがディレクトリであれば、リストの先頭に<Dir>という文字を付け、そうでなければそのままNameプロパティの値をリストに組み込みます。
すべてのファイル名を取り出したら、FtpコントロールのCloseメソッドを実行し、FTPサーバとの接続を閉じます。
If files.Format <> ListingFormat.Unknown Then ' ListEntry オブジェクトを繰り返します。 Dim le As ListEntry For Each le In files ' ファイルのパスと名前を表示します。 If le.Type = EntryType.Directory Then ListBox1.Items.Add("<Dir>" & le.Name) Else ListBox1.Items.Add(" " & le.Name) End If Next Else ' 不明なフォーマット MessageBox.Show("不明なフォーマットです。") End If Ftp1.Close() End Sub
if (files.Format != ListingFormat.Unknown) { // ListEntryオブジェクトを取り出す foreach (ListEntry le in files) { // ファイル名を表示 if (le.Type == EntryType.Directory) { listBox1.Items.Add("<Dir>" + le.Name); } else { listBox1.Items.Add(" " + le.Name); } } } else { // 不明なフォーマットの場合 MessageBox.Show("不明なフォーマットです。"); } ftp1.Close(); }
メンバ | 解説 |
---|---|
File | ListEntry.Nameにファイル名が格納されていることを示します |
Directory | ListEntry.Nameにディレクトリ名が格納されていることを示します |
Link | ListEntryにリンクが格納されていることを示します |
Unknown | ListEntryを解析できなかったことを示します |
リスト選択時の情報表示処理
最後にリストのファイル名をクリックした際、ファイルサイズ、更新日時、アクセス権の情報をラベルに表示するようにします。
まず、選択されたリスト項目の位置を取得し、その値を使ってListingオブジェクトにアクセスします。Listingオブジェクト内のListEntryオブジェクトの位置とListBoxのリストの位置は同じなので、選択されたリスト位置のListEntryオブジェクトの各プロパティを参照して情報を取得します。
プロパティ | 内容 |
---|---|
Name | ファイル名 |
Size | ファイルサイズ |
TimeStamp | 更新日時 |
Permissions | アクセス権 |
Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged Dim pos As Integer pos = ListBox1.SelectedIndex Label5.Text = files(pos).Name & " : " & _ files(pos).Size & "バイト" & " : " & _ files(pos).TimeStamp & " : " & _ files(pos).Permissions End Sub
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { int pos; pos = listBox1.SelectedIndex; label5.Text = files[pos].Name + " : " + files[pos].Size + "バイト" + " : " + files[pos].TimeStamp + " : " + files[pos].Permissions; }
まとめ
とても簡単にFTPサーバを操作できるFtpコントロールですが、まずは手始めにサーバからファイルのリスト一覧を取得する処理を作成してみました。
今回は、サンプルプログラムの動作を考慮し、サーバアドレスやユーザー名、パスワードをテキストボックスで入力するようにしましたが、常にアクセスするサーバが決まっていれば、あらかじめプロパティウィンドウでこれらのプロパティを設定しておくことで、入力の手間を省くことができると思います。サーバに対してコマンドを実行することもできるので、いろいろな処理をフォームから行うことも可能です。