SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(Secure FTP)

FTPファイル転送機能を持った.NETアプリケーションを作る

PowerTools Secure FTP 2.0JのFTPコントロールを使ったFTPアプリケーションの作成

  • このエントリーをはてなブックマークに追加

 PowerTools Secure FTP 2.0JのFTPコントロールは、プロパティにftpサーバのアドレスやログオンID・パスワードを設定するだけで、簡単にFTPアプリケーションを作ることができます。  

  • このエントリーをはてなブックマークに追加

はじめに

 FTPアプリケーションの作成は、プロトコルの設定やサーバ接続の方法など、少し知識が必要です。しかし、PowerTools Secure FTP 2.0JのFTPコントロールは、プロパティにFTPサーバのアドレス・ユーザー名・パスワードを設定するだけで、簡単にFTPアプリケーションを作ることができます。

 早速、このFTPコントロールを使って、FTPサーバからファイルのリスト一覧を取得し、リストボックスで表示するアプリケーションを作ってみました。

FTPサーバにログオンし、ディレクトリを移動してファイルの一覧をリストボックスに表示する
FTPサーバにログオンし、ディレクトリを移動してファイルの一覧をリストボックスに表示する
リストのファイル名をクリックすると、ラベルにサイズや更新日時、アクセス権限を表示する
リストのファイル名をクリックすると、ラベルにサイズや更新日時、アクセス権限を表示する

対象読者

 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」です。

アセンブリ名が「Dart.PowerTCP.SecureFTP」で始まるコンポーネント「Ftp」を選択する
アセンブリ名が「Dart.PowerTCP.SecureFTP」で始まるコンポーネント「Ftp」を選択する

GUIのデザイン

 フォームにFtpコントロールを配置します。ただし、このコントロールはプロセスを提供するコントロールなので、ユーザーインターフェースは持ちません。フォームのデザインでは、SplitPanelコントロールを配置してその上にボタン、ラベル、テキストボックス、リストボックスを配置しています。

 SplitPanelコントロールは、OrientationプロパティをHorizontalに変更し、DockプロパティをFillにします。ListBoxコントロールも、DockプロパティをFillにします。

 Ftpコントロールは、次のプロパティを使ってログインセッションを作成します。

プロパティ 設定値
Server FTPサーバのアドレス
Username ログインユーザー名
Password ログインパスワード

 このプログラムでは、これらの入力をTextBoxコントロールで行うようにします。また、フォームの下部にはStatusStripコントロールを配置し、StatusLabelを配置します。

GUI画面
GUI画面

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コントロールの各メソッドを実行します。

  1. Server、Username、Passwordの各プロパティを設定する
  2. ファイルを取得するディレクトリをカレントディレクトリに切り替えるコマンドを送信する
  3. Listメソッドを実行し、ファイルリストを取得する
  4. 取得したファイル情報を表示する
  5. 接続を閉じる

 これらの処理をボタン「Button1」のClickイベントハンドラに作成します。

準備とサーバ接続処理

 最初に、サーバ接続処理を作成します。

 まず、Listメソッドの戻り値を受け取る変数を、モジュールレベルで宣言します。そして、Server、Username、Passwordの各プロパティをTextBoxから取得して設定する式を作成します。

 また、リストを取得するディレクトリ名を受け取る式を作成します。TextBoxが空白であれば、FTPサーバのルートディレクトリをカレントディレクトリとして、ファイルリストを取得します。

Visual Basic
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
C#
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プロパティで取得したファイル数を把握できますので、これをステータスバーで表示します。

Visual Basic
If dirname <> "" Then
    Ftp1.Invoke(FtpCommand.ChangeDir, dirname)
End If

files = Ftp1.List("*", True)

ToolStripStatusLabel1.Text = "取得ファイル数:" & files.Count
C#
if (dirname != "")
{
    ftp1.Invoke(FtpCommand.ChangeDir, dirname);
}

files = ftp1.List("*", true);

toolStripStatusLabel1.Text = "取得ファイル数:" + files.Count;
FtpCommand列挙体のメンバ
メンバ 解説
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サーバとの接続を閉じます。

Visual Basic
    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
C#
       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();
}
EntryType列挙体のメンバ
メンバ 解説
File ListEntry.Nameにファイル名が格納されていることを示します
Directory ListEntry.Nameにディレクトリ名が格納されていることを示します
Link ListEntryにリンクが格納されていることを示します
Unknown ListEntryを解析できなかったことを示します

リスト選択時の情報表示処理

 最後にリストのファイル名をクリックした際、ファイルサイズ、更新日時、アクセス権の情報をラベルに表示するようにします。

 まず、選択されたリスト項目の位置を取得し、その値を使ってListingオブジェクトにアクセスします。Listingオブジェクト内のListEntryオブジェクトの位置とListBoxのリストの位置は同じなので、選択されたリスト位置のListEntryオブジェクトの各プロパティを参照して情報を取得します。

プロパティ 内容
Name ファイル名
Size ファイルサイズ
TimeStamp 更新日時
Permissions アクセス権
Visual Basic
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    
C#
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コントロールですが、まずは手始めにサーバからファイルのリスト一覧を取得する処理を作成してみました。

 今回は、サンプルプログラムの動作を考慮し、サーバアドレスやユーザー名、パスワードをテキストボックスで入力するようにしましたが、常にアクセスするサーバが決まっていれば、あらかじめプロパティウィンドウでこれらのプロパティを設定しておくことで、入力の手間を省くことができると思います。サーバに対してコマンドを実行することもできるので、いろいろな処理をフォームから行うことも可能です。

製品情報

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3974 2009/05/28 14:30

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング