はじめに
Secure FTP 2.0Jの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がインストールされていることが必須条件です。
サンプルプログラムを実行する際は、フォームのサーバアドレス、ユーザー名、パスワード入力欄に正しく入力し、接続ボタンを押してください。
これらの入力に対するエラー処理を組み込んでいないので、入力せずに「接続」ボタンを押す、あるいは間違った入力があると、プログラムは実行時エラーになるので注意してください。
また、添付されているデータファイル「mydialy.txt」をftpサーバのルートに転送してください。
コンポーネントのインストール
はじめて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とFTPコントロールでGUIを作成します。特にこれといって設定するプロパティはありません。
接続用の3つのTextBoxコントロールのうち、パスワード用TextBoxコントロールは、[PasswordChar]プロパティに「*」を入力して伏字にしておきます。
また、データ処理用のTextBoxコントロールは、[MultiLine]プロパティを[True]に、[ScrollBars]プロパティを[Vertical]にしておきます。
FTPコントロールのデータ接続機能について
PowerTools Secure FTPには、ファイルやリストのftp転送だけでなく、ストリームを扱うための多くの機能が備わっています。FTPコントロールのこうした機能を利用することにより、サーバ上にあるファイルの読み込みと書き込みを直接行うことができます。編集したいファイルを一度ダウンロードして一時ファイルを作成し、編集後に再度サーバにアップロードする、という操作は必要ありません。これは、サーバ上のファイルへのデータ接続をストリームとして取得できるためです。
データ接続には、同期と非同期の2つのアクセスが可能ですが、同期オペレーションはイベントを実装する必要がないため、コードがとても単純になります。
また、ファイル転送と同様、ファイルの読み込みおよび書き込みのメソッドを実行した時点で、ftpサーバへの接続が実行されるので、ftpサーバのアドレス、ログインID、パスワードをプロパティにセットするだけで、接続処理を作成する必要がありません。
読み込みのためにデータ接続に同期アクセスする処理
まずはじめに、サーバにあるテキストファイルを開いて、その中身をTextBoxコントロールに表示する処理を作成してみましょう。今回は、この処理を「read_data」という独自のメソッドとして作成します。
メソッドの先頭で、ログイン用の3つのTextBoxコントロールの値を、それぞれ「Server」「Username」「Password」という3つのプロパティに格納する処理を行います。
次に、FTPコントロールの「Get」というメソッドを実行します。このメソッドはファイルの転送にも使用したメソッドですが、オーバーロードメソッドになっており、今回は「FTPデータ接続の読み込みに使用できるストリームを同期取得する」という機能を持ったメソッドを使用します。
このGetメソッドは引数を2つ持ち、第一のパラメータ「remoteFileName」は、データ接続を確立するサーバ上のファイルを指定します。第二のパラメ-タの「restartMarker」は、このファイルの読み込みを開始する位置を指定します。ここでは、サーバにあるテキストデータのファイル「mydialy.txt」を使用します。中身はほとんどなく、「*********** 日記 ************************」と書かれているだけのファイルです。また、読み込み開始位置は、ファイルの先頭を指定します。これで、常に「上書き」の処理ができあがります。
そして、メソッドの実行が成功すると、メソッドは「SegmentedStream」というオブジェクトを作成して返してきますので、同じデータ型の変数に格納しておきます。これで、ファイルへのアクセスがストリームという形で形成されます。
Private Sub read_data() Ftp1.Server = TextBox1.Text Ftp1.Username = TextBox2.Text Ftp1.Password = TextBox3.Text 'データの読み込み Dim sstream As Dart.PowerTCP.SecureFtp.SegmentedStream sstream = Ftp1.Get("mydialy.txt", 0)
private void read_data()
{
ftp1.Server = textBox1.Text;
ftp1.Username = textBox2.Text;
ftp1.Password = textBox3.Text;
//データの読み込み
Dart.PowerTCP.SecureFtp.SegmentedStream sstream;
sstream = ftp1.Get("mydialy.txt", 0);
ストリームが開いたら、「Read」というメソッドを実行します。このメソッドは、SegmentedStreamクラスのメンバで、オーバーロードになっておりデータの読み込みに際していろいろな機能を提供できるようになっています。今回は、最も単純な機能でストリームからデータを文字列に読み込むメソッドを使用します。引数はなく、メソッドを実行するだけでストリーム内のデータをすべて文字列で取得して返してきますので、変数に格納します。
そして、AbortTransferメソッドを使用して現在のファイル転送処理を中止し、ftpサーバとの接続を切ったら、変数の内容をTextBoxコントロールに表示して、メソッド「read_data」の処理はできあがりです。
Dim buffer As String = "" buffer = sstream.Read() Ftp1.AbortTransfer() sstream.Close() Me.TextBox4.Text = buffer End Sub
string buffer = "";
buffer = sstream.Read();
ftp1.AbortTransfer();
sstream.Close();
textBox4.Text = buffer;
}
この処理を、「接続」ボタンのClickイベントハンドラで呼び出します。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click read_data() End Sub
private void button1_Click(object sender, EventArgs e) { read_data(); }
メソッド | 解説 |
---|---|
Get(String,String) | サーバから1つのファイルを同期取得します。 |
Get(String,Stream) | ファイルをFTPサーバから同期取得し、取得したデータをStreamオブジェクトに保存します。 |
Get(String,String,String,Boolean,Boolean) | サーバから複数のファイルを同期取得します。 |
Get(String,Int64) | FTPデータ接続の読み込みに使用できるストリームを同期取得します。 |
メソッド | 解説 |
---|---|
Read(Byte[],Int32,Int32) | ストリームからデータをバイト配列に読み込みます。 |
Read(Int32) | ストリームからデータを文字列に読み込みます。 |
Read() | ストリームからデータを文字列に読み込みます。 |
Read(String,Int32,Boolean) | 区切り文字に達するまでストリームからデータを読み込みます。 |
Read(String) | 区切り文字が見つかるまで、またはタイムアウト時間が経過するまで、文字列データを蓄積しながらストリームを読み込みます。 |
Read(Byte[],Int32,Int32,Boolean) | バイト配列が満たされるまでストリームからデータを読み込みます。 |
Read(Byte[],Boolean) | バイト配列が満たされるまでストリームからデータを読み込みます。 |
Read(Byte[],Byte[],Int32,Int32,Boolean) | Streamから読み込まれたデータ。 |
Read(Byte[],ArrayList,Int32,Int32,Boolean) | 指定された区切り文字のいずれかが見つかるまで、ストリームからデータを読み込みます。 |
Read(Byte[],Byte[],Boolean) | 区切り文字に達するまでストリームからデータを読み込みます。 |
Read(Byte[]) | Streamから少なくとも1バイトのデータを読み取り、提示されたバッファにコピーします。EnhancedStreamから継承されます。 |
書き込みのためにデータ接続に同期アクセスする処理
今度は、書き込みのためにデータ接続に同期アクセスする処理を作成します。これは、「書き込み」ボタンのClickイベントハンドラに作成します。
まず、ログイン用の3つのTextBoxコントロールの値を、
それぞれ「Server」「Username」「Password」という3つのプロパティに格納する処理を再度行います。これは、ファイルの読み込みで一度ftpサーバとの接続を切っているので、再接続するために使用します。
そして、読み込んだデータが表示されているTextBoxコントロールのデータを変数に格納し、追加の文字列が書き込まれているTextBoxコントロールの内容を加えます。
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Ftp1.Server = TextBox1.Text Ftp1.Username = TextBox2.Text Ftp1.Password = TextBox3.Text 'データの書き込み Dim wstream As Dart.PowerTCP.SecureFtp.SegmentedStream Dim msg As String msg = Me.TextBox4.Text & System.Environment.NewLine msg += Me.TextBox5.Text
private void button2_Click(object sender, EventArgs e) { ftp1.Server = textBox1.Text; ftp1.Username = textBox2.Text; ftp1.Password = textBox3.Text; //データの書き込み Dart.PowerTCP.SecureFtp.SegmentedStream wstream; string msg; msg = textBox4.Text + System.Environment.NewLine; msg += textBox5.Text;
次に、「Put」というメソッドでファイルへのストリームを作成します。このメソッドも、ファイル転送に使用したメソッドですが、引数を変えるとファイルへのストリームを作成するメソッドになります。
引数はGetメソッドと同様2つで、第一のパラメータのremoteFileName は、データ接続を確立するサーバ上のファイルを指定し、第二パラメ-タの restartMarker は、このファイルの書き込みを開始する位置を指定します。ここでは、ファイル「mydialy.txt」を指定し、書き込み開始位置はファイルの先頭を指定します。メソッドの実行が成功すると、メソッドはSegmentedStreamオブジェクトを作成して返してきますので、同じデータ型の変数に格納しておきます。これで、Getメソッドと同様ファイルへのアクセスがストリームという形で形成されますが、この場合は書き込みという形でストリームが形成されます。
ストリームが開いたら、「Write」メソッドを実行します。このメソッドも、SegmentedStreamクラスのメンバで、オーバーロードになっておりデータの書き込みに際していろいろな機能を提供できるようになっています。今回は、最も単純な機能でストリームに文字列を書き込むメソッドを使用します。引数はなく、メソッドを実行するだけです。
そして、データをファイルに書き出したら、一度ftpサーバとの接続を切り、再度ファイルを読み込むメソッド「read_data」を実行してファイル更新の内容をTextBoxコントロールに表示してできあがりです。
wstream = Ftp1.Put("mydialy.txt", 0) wstream.Write(msg) wstream.Close() Me.TextBox5.Text = "" read_data() End Sub
wstream = ftp1.Put("mydialy.txt", 0); wstream.Write(msg); wstream.Close(); textBox5.Text = ""; read_data(); }
メソッド | 解説 |
---|---|
Put(String,String) | 1つのファイルをサーバに同期保存します。 |
Put(Stream,String) | ストリームをファイルとしてサーバ上に同期保存します。 |
Put(String,String,String,Boolean,Boolean) | サーバに複数のファイルを同期送信します。 |
Put(String,Int64) | データ接続への書き込みに使用できるストリームを同期取得します。 |
メソッド | 解説 |
---|---|
Write(Byte[],Byte[],Byte[],Int32,Int32) | ストリームにデータを書き込むと同時に、バイトごとの検索/置換を実行します。 |
Write(Byte[],Byte[],Int32,Int32) | 区切り文字に達するまでストリームにデータを書き込みます。 |
Write(Byte[],Int32,Int32) | データをストリームに書き込みます。 |
Write(String) | ストリームに文字列を書き込みます。 |
Write(Byte[]) | Streamにバイトのシーケンスを書き込み、処理が完了した時点で終了します。EnhancedStreamから継承されます。 |
まとめ
メソッドの実行だけで、ftpサーバにあるファイルを直接読み書きできるのは、開発する側にとっては負担が少なく開発コストを抑えることができるので、とても魅力的な機能でしょう。
今回は、簡単なテキストファイルの読み書きを例にとりましたが、業務系アプリケーションの開発ではもっといろいろなケースのデータ処理に利用できると思います。