2011年8月4日木曜日

標準アクティビティだけでファイル監視

あまりにも代わり映えのないタイトルが続いたので、今回からは Workflow で実行する内容をちゃんとタイトルに含ませるようにしますw

タイトルにもあるように今回実行するのは「特定のフォルダを監視してファイルが発生したら何かしらの処理を行う」という、フォルダ監視的なものです。

単純に1つのフォルダだけ監視するのではあまり利用用途がないので、今回は複数フォルダを(ほぼ)同時に監視するような形にしてみます。ワークフローの全体図は次のようになりました。

checkFolders

Parallel アクティビティを利用して監視対象となるフォルダを複数設定します。DoWhile アクティビティの Condition に直接 System.IO.Directory.GetFiles メソッドでファイル数を数えてるように設定します。ポイントとなるのは、DoWhile アクティビティ内部に設定するDelayアクティビティです。Parallel アクティビティは名前のイメージと異なり並列的には動作しません。待機状態など、実行が停止するような状態が発生したタイミングで次のブランチを処理するように遷移していきます。

今回の例では、まず 1 番目のブランチに遷移しループ内部で Delay アクティビティにて待機。このタイミングで 2 番目のブランチに遷移します。そして 2 番目のループ内部で Delay アクティビティにて待機。ここで 1 番目のブランチへと制御が戻ります。制御が戻るとフォルダ内部のファイル数をカウントし、何かファイルが作成されていればループを終了します。作成されていなければ再度 Delay アクティビティに遷移、2 番目のブランチへと移ります。

上記サンプルではループ条件にファイル数のカウントのみ記載してあります。この状態でも、1 番目のブランチで監視するフォルダにファイルが発生すると、ちゃんと InvokeMethod アクティビティまで制御が遷移します。2 番目のブランチに別段条件を設定する必要はありません。

監視するフォルダが増えた場合は、Parallel アクティビティの子として更に Sequence アクティビティなどをどんどん追加していけば大丈夫です。

ロジックを記載しないで、アクティビティを追加していくだけで監視場所を増やすことができるのは、ワークフローを利用している場合のメリットなのではないでしょうか。

0 件のコメント:

コメントを投稿