はじめに
前回は、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」です。
GUIのデザイン
GroupBox、Label、TextBox、Button、OpenFileDialogとFtpコントロールでGUIを作成します。特にこれといって設定するプロパティはありません。
アップロード用の3つのTextBoxコントロールには、それぞれFTPサーバのアドレス、ログイン、パスワードを入力しておきます。また、パスワード用TextBoxコントロールは、PasswordCharプロパティに「*」を入力して伏字にしておきます。
Ftpコントロールについて
Secure FTPは、.NET Frameworkのために設計された通信コンポーネントで、FTPサーバへのファイル送受信を容易に実現する強力なツールです。Windowsアプリケーション、Webアプリケーションの両方で使用可能です。
同期・非同期でのファイル転送が行え、単一ファイルの転送はもちろん、指定したフォルダ内のファイルを一括して転送することもできます。
今回は、このFtpコントロールを使って、単一のファイルを同期通信でFTPサーバに転送するプログラムを作成します。
ファイルの転送
ファイルを同期通信でFTPサーバに転送するには、まずはじめにServer、Username、Passwordの各プロパティを最初に設定します。これにより、自動的なサーバーログインが可能になります。そして、Putメソッドを実行します。このメソッドは、指定したファイルをFTPサーバに転送します。
FTPサーバへの接続処理は、メソッドを実行した時点でFtpコントロールが自動的に行ってくれますので、ログイン処理のために新たなコードを書く必要はありません。
Putメソッドを実行すると、メソッドはファイル転送に関する情報をカプセル化したFtpFileオブジェクトを返してきますので、このオブジェクトを使ってファイル転送が成功したかどうかをチェックできます。
ファイル転送の準備
まずは、「参照」ボタンで転送するファイルを選択する処理を作成します。これは、OpenFileDialogコントロールを使用してユーザーにファイルを選択してもらいます。
OpenFileDialogクラスのFileNameプロパティには、ユーザーが選択したファイル名がパス名を含めて格納されます。また、SafeFileNameプロパティにはパス名を除いたファイル名が拡張子付きで格納されるので、これらを取り出して変数に格納しておきます。
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
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の各プロパティに格納します。
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
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プロパティの値を使用しています。
Overloads Public Function Put(ByVal localFileName As String, ByVal remoteFileName As String) As FtpFile
upfile = Ftp1.Put(fullpass, "html/" + fname)
upfile = ftp1.Put(fullpass, "html/" + fname);
転送完了のチェック
最後に、Putメソッドの戻り値を使って、無事にファイル転送が行われたかどうかをチェックします。
メソッドの戻り値はFtpFileオブジェクトに格納され、次の情報がこのオブジェクトのそれぞれのプロパティに格納されます。
プロパティ名 | 格納されるデータ |
---|---|
Count | 転送されたバイト数 |
Exception | ファイル転送の最中に発生した例外 |
Length | ファイルの長さ |
LocalFileName | 転送されたローカルファイルのパス名 |
Position | ストリームまたはファイル内での位置 |
RemoteFileName | 転送されたリモートファイルのパス名 |
Status | RemoteFileNameによって参照されるファイル(またはディレクトリ)のステータス |
今回は、この中からLengthプロパティを使用し、ファイル転送がちゃんと行われたかどうかをチェックします。ファイルの長さが0以上であれば、ファイルの転送が正しく行われたと判断します(より厳密にチェックしたければ転送元のファイルサイズとLengthプロパティの値が等しいことをチェックします)。
そして、Labelコントロールに転送完了のメッセージを表示して終了します。
'転送完了のチェック If upfile.Length >= 0 Then Label4.Text = "転送が完了しました。" End If Ftp1.Close() End Sub
//転送完了のチェック
if (upfile.Length >= 0)
{
label4.Text = "転送が完了しました。";
}
ftp1.Close();
}
まとめ
Ftpコントロールを使えば、サーバへのアップロードもとても簡単に行えます。また、転送したファイルの情報をメソッドが返してきますので、いちいちリストを取得して転送元と照合するような処理は必要ありません。
アプリケーションの一部にFTPサーバへの転送機能を組み込みたい、という時などにはアプリケーションの開発工数を抑えることができますので、大いに役に立つコントロールだと思います。