Page4●FileSystemWatcherコンポーネントFileSystemWatcherコンポーネント(以下、FileSystemWatcher)は、フォルダの変更やフォルダ内のファイルの変更を検出するためのコンポーネントだ。特定のフォルダを監視していて、ファイルが更新されたり新規作成や削除されたりすると、イベントが発生する。このコンポーネントの使い道としては、あるフォルダを監視して、ファイルが格納されたら、その内容をチェックしてデータベースに格納する、というような使い道が考えられる。FileSystemWatcherの注意点は、ファイルの新規作成を監視している場合に、ファイルの作成完了を待たずにイベントが発生してしまうことだ。そのため、大きなサイズのファイルを新規作成した場合、ファイル作成の途中でイベントが発生するという問題がある。この問題を回避してファイルの作成完了を検知するには、例えばファイル・ロックが解けるのを待つなどの工夫が必要になる。お勧めしたい解決方法は、例えば「test.dat」という名前でファイルを作成したいときには、「test.dat」ファイルを出力した直後に、その出力先と同じフォルダに拡張子だけ異なる「test.eof」をいう名前の、サイズが0バイトのファイルを出力し、「.eof」を拡張子に持つファイルをFileSystemWatcherの監視対象にすることだ。すれば、(.eofファイルは常に.datファイルの作成完了後にしか作成されないので)実際に処理したい.datファイルへのデータ出力完了を保証できる。この方法はFTPによるファイル転送でも使われる手法だ。以上の注意点を踏まえて、FileSystemWatcherを使用したコードは次のようになる。Windowsフォーム上には、「DatWatch_Button」「EofWatach_Button」「QuitWatch_Button」という名前の3つのButtonコントロールと、「Status_ListBox」という名前のListBoxコントロール、「BackgroundWorker1」という名前のBackgroundWorker、「FileSystemWatcher1」という名前のFileSystemWatcherを配置している。FileSystemWatcherの使用例(上:VB、下:C#)WindowsフォームのLoadイベント・プロシージャ(=FileSystemWatacher_Form_Loadメソッド)は、Windowsフォーム・デザイナのフォーム画面をダブルクリックすると、そのひな型コードが自動的に生成される。同様に、ButtonコントロールのClickイベント・プロシージャ(=DatWatch_Button_ClickメソッドとEofWatach_Button_ClickメソッドとQuitWatch_Button_Clickメソッド)は、Buttonコントロールをダブルクリックすると自動生成される。フォームのFormClosingイベント・プロシージャ(=FileSystemWatacher_Form_FormClosingメソッド)は、Windowsフォーム・デザイナのフォーム画面を選択した状態で、[プロパティ]ウィンドウの[イベント]一覧のイベント項目をダブルクリックすると自動生成される。同様に、FileSystemWatcherのCreatedイベント・プロシージャ(=FileSystemWatcher1_Createdメソッド)は、FileSystemWatcherを選択した状態で[プロパティ]ウィンドウの[イベント]一覧のイベント項目をダブルクリックすると自動生成される。BackgroundWorkerのDoWorkイベント・プロシージャ(=BackgroundWorker1_DoWorkメソッド)やProgressChangedイベント・プロシージャ(=BackgroundWorker1_ProgressChangedメソッド)も同様の手順で追加すればよい。このサンプルでは、BackgroundWorkerのDoWorkイベント・プロシージャを使うことでファイル出力を別スレッドで行いつつ、メイン・スレッドではFileSystemWatcherでそのファイルの出力先を監視してファイル生成を非同期で待ち合わせている。FileSystemWatcherの実行例(上:[datファイル監視]ボタンをクリック、下:[eofファイル監視]ボタンをクリック)このサンプルでは、ファイル生成の監視を行っているフォルダに対してファイルを出力したときのFileSystemWatcherのイベント・タイミングを調べることができる。[datファイル監視]ボタンをクリックすると、メイン・スレッドで.datファイルの監視がスタートして別スレッドで.datファイルの生成が行われる。ファイルの生成を監視しているときのFileSystemWatcherのイベントは、.datファイルが書き出されたときにCreatedイベントが発生するので、.datファイルの出力が終わる前にそのファイルを使ってしまう危険性がある。これに対し、[eofファイル監視]ボタンをクリックすると、.datファイルの生成が終わった後に生成する(=このアプリケーション・プロトコルを仕様として定義).eofファイルを監視する。そのため、FileSystemWatcherでCreatedイベントが発生したときには、.datファイルの作成は確実に完了している。このように少しの工夫でファイルの出力完了待ち合わせ処理などが不要になる。●HelpProviderコンポーネントHelpProviderコンポーネント(以下、HelpProvider)は、ポップアップ・ヘルプやオンライン・ヘルプを表示するためのコンポーネントだ。HelpProviderを配置したWindowsフォームにあるコントロールには、以下の画面のように、HelpProviderを使ってポップアップ・ヘルプを表示するHelpStringプロパティと、オンライン・ヘルプのキーワードを指定するHelpKeywordプロパティが追加される。コントロールに追加されるHelpProvider関連のプロパティ●ImageListコンポーネントImageListコンポーネントは、第2回で取り上げたので説明は割愛するが、簡単にいえば画像などのイメージを配列(正確にはリスト構造)に入れて使いやすくするためのコンポーネントといえる。Windowsメッセージ・キューを使ってプログラム間通信を行うためのコンポーネントだ。Queuing(MSMQ)サービスが必要なので、事前にMicrosoftメッセージ・キュー(MSMQ)サーバをインストールしておかなければならない。サーバー]チェックボックスにチェックを入れて[OK]ボタンをクリックすればよい。Microsoftメッセージ・キュー・サーバの有効化1つのプログラムでMicrosoftメッセージ・キューに送信して受信するのでもMessageQueueの動作を知ることができるが、(以下に示す)今回のサンプルは、VB用サンプル・コードとC#用サンプル・コードの間でお互いに送受信できるようなサンプルにしてある。サンプルでのキューの使い方このサンプルのコードは、以下のとおり。Windowsフォーム上には、「Send_TextBox」という名前のTextBoxコントロールと、「Send_Button」という名前のButtonコントロール(=[送信]ボタン)と、「Status_ListBox」という名前のListBoxコントロール、「MessageQueue1」「MessageQueue2」という名前の2つのMessageQueueを配置している。C#側受信」は「CSQueue」という名前のキューというように、送受信の各方向でキュー名を入れ替えているだけで、そのほかのコードはまったく同一の意味になっている。MessageQueueの使用例(上:VB、下:C#)ButtonコントロールのClickイベント・プロシージャ(=Send_Button_Clickメソッド)は、Windowsフォーム・デザイナのフォーム画面上に配置したButtonコントロールをダブルクリックすると、そのひな型コードが自動的に生成される。フォームのShownイベント・プロシージャ(=MessageQueue_Form_Shownメソッド)やFormClosingイベント・プロシージャ(=MessageQueue_Form_FormClosingメソッド)は、Windowsフォーム・デザイナのフォーム画面を選択した状態で、[プロパティ]ウィンドウの[イベント]一覧のそれぞれのイベント項目をダブルクリックすると自動生成される。同様に、MessageQueueのReceiveCompletedイベント・プロシージャ(=MessageQueue2_ReceiveCompletedメソッド)は、MessageQueueを選択した状態で[プロパティ]ウィンドウの[イベント]一覧のイベント項目をダブルクリックすると自動生成される。今回のサンプルでは、Microsoftメッセージ・キューでテキストを送受信したので、フォーマッタとしてXMLフォーマット(=XmlMessageFormatter)を採用した。画像ファイルなどのバイナリ・データを送受信したいときは、XmlMessageFormatterの代わりに、BinaryMessageFormatterを使えばよい。7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。TranslatorはPowerPoint用のアドイン。