SHOEISHA iD

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

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

ComponentZine(Secure FTP)

同期通信でファイルをサーバに転送する.NETアプリケーションを作る

FTPファイル転送機能を持ったアプリケーションの作成 2

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

 前回は、Ftpコントロールを使って、FTPサーバからファイルのリスト一覧を取得し、リストボックスで表示するアプリケーションを作りました。Ftpコントロールの使い勝手の良さはお分かりいただけたと思います。このコントロールはリストの取得だけでなく、ファイル転送の操作もとても簡単で、FTPサーバを指定してメソッドを実行するだけで行えます。

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

はじめに

 前回は、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.PowerWEB.FileUpload」で始まるコンポーネント「Ftp」を選択する

GUIのデザイン

 GroupBox、Label、TextBox、Button、OpenFileDialogとFtpコントロールでGUIを作成します。特にこれといって設定するプロパティはありません。

 アップロード用の3つのTextBoxコントロールには、それぞれFTPサーバのアドレス、ログイン、パスワードを入力しておきます。また、パスワード用TextBoxコントロールは、PasswordCharプロパティに「*」を入力して伏字にしておきます。

GUI画面
GUI画面

Ftpコントロールについて

 Secure FTPは、.NET Frameworkのために設計された通信コンポーネントで、FTPサーバへのファイル送受信を容易に実現する強力なツールです。Windowsアプリケーション、Webアプリケーションの両方で使用可能です。

 同期・非同期でのファイル転送が行え、単一ファイルの転送はもちろん、指定したフォルダ内のファイルを一括して転送することもできます。

 今回は、このFtpコントロールを使って、単一のファイルを同期通信でFTPサーバに転送するプログラムを作成します。

ファイルの転送

 ファイルを同期通信でFTPサーバに転送するには、まずはじめにServer、Username、Passwordの各プロパティを最初に設定します。これにより、自動的なサーバーログインが可能になります。そして、Putメソッドを実行します。このメソッドは、指定したファイルをFTPサーバに転送します。

 FTPサーバへの接続処理は、メソッドを実行した時点でFtpコントロールが自動的に行ってくれますので、ログイン処理のために新たなコードを書く必要はありません。

 Putメソッドを実行すると、メソッドはファイル転送に関する情報をカプセル化したFtpFileオブジェクトを返してきますので、このオブジェクトを使ってファイル転送が成功したかどうかをチェックできます。

ファイル転送の準備

 まずは、「参照」ボタンで転送するファイルを選択する処理を作成します。これは、OpenFileDialogコントロールを使用してユーザーにファイルを選択してもらいます。

 OpenFileDialogクラスのFileNameプロパティには、ユーザーが選択したファイル名がパス名を含めて格納されます。また、SafeFileNameプロパティにはパス名を除いたファイル名が拡張子付きで格納されるので、これらを取り出して変数に格納しておきます。

Visual Basic
Imports Dart.PowerTCP.SecureFtp

Public Class Form1

    Private fullpass As String
    Private fname As String
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Label4.Text = ""

        OpenFileDialog1.ShowDialog()

        fullpass = OpenFileDialog1.FileName
        fname = OpenFileDialog1.SafeFileName

        TextBox1.Text = fullpass
	End Sub
C#
using Dart.PowerTCP.SecureFtp;

namespace myftp_2_cs
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private String fullpass;
        private String fname;
        private void button1_Click(object sender, EventArgs e)
        {
            label4.Text = "";

            openFileDialog1.ShowDialog();

            fullpass = openFileDialog1.FileName;
            fname = openFileDialog1.SafeFileName;

            textBox1.Text = fullpass;
        }

ファイル転送処理

 「アップロード」ボタンが押された時のファイル転送処理では、まずPutメソッドの戻り値を格納する変数を「FtpFile」型で宣言します。

 そして、3つのTextBoxから取得したFTPサーバのアドレス、ログインID、パスワードをそれぞれFtpコントロールのServer、Username、Passwordの各プロパティに格納します。

Visual Basic
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

    '同期でのファイル転送
    Dim upfile As FtpFile

    Ftp1.Server = TextBox2.Text
    Ftp1.Username = TextBox3.Text
    Ftp1.Password = TextBox4.Text
C#
private void button2_Click(object sender, EventArgs e)
{
    //同期でのファイル転送
    FtpFile upfile;

    ftp1.Server = textBox2.Text;
    ftp1.Username = textBox3.Text;
    ftp1.Password = textBox4.Text;

 そして、Putメソッドを実行します。このメソッドはオーバーロードメソッドで、単一のファイルを転送する場合は、2つの引数を持ったメソッドを使用します。1つ目の引数には転送するファイル名を、パス名付きで記述します。2つ目の引数には、転送するFTPサーバのディレクトリ名とファイル名を指定します。

 ファイルの転送は、この2番目の引数で指定したファイル名でFTPサーバに作成されるので、ここにはパス名を除いたファイル名を指定します。パス名を付けて指定してしまうと、そのパス名もファイル名の一部になってFTPサーバにコピーされます。例えば、「C:¥data¥mydata.txt」というパス名付きのファイル名を2番目の引数に設定してしまうと、このパス名もファイル名の一部として使われることになってしまいます。

パス名もファイル名の一部として使われてしまう
パス名もファイル名の一部として使われてしまう

 Putメソッドによるファイル転送は、基本的には「コピー」になり、メソッドの2番目の引数でコピー先のファイル名を設定するようになっています。ですから、逆に言うとサーバに転送する際に違うファイル名で転送することも可能になります。

 このプログラムでは、転送元と転送先が同じファイル名になるようにするため、1番目の引数にはOpenFileDialogコントロールのFileNameプロパティの値(パス名付きのファイル名)を使い、2番目の引数にはパス名を除いたファイル名が拡張子付きで格納されている、SafeFileNameプロパティの値を使用しています。

Putメソッドの書式-単一ファイル用
Overloads Public Function Put(ByVal localFileName As String, ByVal remoteFileName As String) As FtpFile
Visual Basic
upfile = Ftp1.Put(fullpass, "html/" + fname)
C#
upfile = ftp1.Put(fullpass, "html/" + fname);

転送完了のチェック

 最後に、Putメソッドの戻り値を使って、無事にファイル転送が行われたかどうかをチェックします。

 メソッドの戻り値はFtpFileオブジェクトに格納され、次の情報がこのオブジェクトのそれぞれのプロパティに格納されます。

プロパティ名 格納されるデータ
Count 転送されたバイト数
Exception ファイル転送の最中に発生した例外
Length ファイルの長さ
LocalFileName 転送されたローカルファイルのパス名
Position ストリームまたはファイル内での位置
RemoteFileName 転送されたリモートファイルのパス名
Status RemoteFileNameによって参照されるファイル(またはディレクトリ)のステータス

 今回は、この中からLengthプロパティを使用し、ファイル転送がちゃんと行われたかどうかをチェックします。ファイルの長さが0以上であれば、ファイルの転送が正しく行われたと判断します(より厳密にチェックしたければ転送元のファイルサイズとLengthプロパティの値が等しいことをチェックします)。

 そして、Labelコントロールに転送完了のメッセージを表示して終了します。

Visual Basic
    '転送完了のチェック

    If upfile.Length >= 0 Then
        Label4.Text = "転送が完了しました。"
    End If

    Ftp1.Close()

End Sub
C#
    //転送完了のチェック
    if (upfile.Length >= 0)
    {
        label4.Text = "転送が完了しました。";
    }

    ftp1.Close();
}

まとめ

 Ftpコントロールを使えば、サーバへのアップロードもとても簡単に行えます。また、転送したファイルの情報をメソッドが返してきますので、いちいちリストを取得して転送元と照合するような処理は必要ありません。

 アプリケーションの一部にFTPサーバへの転送機能を組み込みたい、という時などにはアプリケーションの開発工数を抑えることができますので、大いに役に立つコントロールだと思います。

製品情報

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

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4057 2009/06/22 16:19

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング