FolderWatcher

久々に趣味プログラミング。
使用ツールはVisual C#。.net Frameworkのバージョンは1.1。
作ろうとしたのはFileSystemWatcherを利用したちょっと便利そうなツール。


来月ぐらいに作りたいツールがあるので、それに必要になるであろうFileSystemWatcherの勉強が主目的で、ついでに何かに役立てるものを作ろうという感じ。
特定のフォルダを監視してファイルが増えたら通知するツールに決定。
こだわりはメインフォームを持たずにMSNメッセンジャーのメンバーサインイン時の様に画面端にポップアップするウィンドウを使うこと。コントロール自体はさっくりと発見出来た。Microsoft提供のVisual Basic Power Packに含まれるNotificationWindowというコントロール。
用意は整ったのでプログラム開始。まずはそれぞれのコントロールを簡単に使ってみる。
FileSystemWatcher → ファイルが増えたらコンソールにファイル名を表示
NotificationWindow → フォーム上のボタンをクリックするとHello, Worldと表示。
ここまではほんの数分で終了。あとはコンソール出していたファイル名をNotificationWindowに渡して終わり、設定ファイルはXMLにするかのぅ、とすでに先のことを考えていたり・・・したのですが。
動きません。
イベントが発生するとウィンドウが表示されるべき位置に黒い四角が出現するだけ。
2時間ほど調査した結果、以下のことが判明。
1.FileSystemWatcherは.net Frameworkのスプールスレッドで処理される
2.コントロールのプロパティ・メソッドを呼び出してよいのはメインスレッドのみ
なにー?それじゃどうしようもないじゃん。さらに調べる。
3.FileSystemWatcherにはSynchronizingObjectというプロパティがあり、ここにISynchronizeInvokeインターフェイスを実装したクラスのインスタンスを指定することにより、そのインスタンスと同期を取ることが出来る
4.ISynchronizeInvokeを実装しているのは一般的にFormである
Formは使いたくないんじゃ。必要もないしっ。さらに調べる。
5.Invokeメソッドを使うことにより2つのスレッドの同期を取ることが出来る
6.InvokeメソッドはControlクラスに含まれるので、継承により独自クラスでも使用することが可能
7.Controlクラスはウィンドウハンドルを持つ必要がある
ウィンドウは要らないんじゃ。さらに調べる。
8.NotificationWindowはComponentを継承している
9.ComponentはWindowではない
10.NotificationWindowはWindowの様に見えるが、実際はボタン・ラベルと同じComponentであるため、親Windowが必須である
と、いうことで、実装は無理。
サイズ0でも非表示でも画面外でもいいから1個はウィンドウを持てと言うことですか、そうですか。と、いうところで27時になりましたので、以下次回としたいと思います。
久々に技術調査をしながらの手探りコーディング。かなり楽しかったデス。
以下、参考サイト。
MSDN
CodeZine
@IT:.NET TIPS Windowsアプリケーションでファイルやディレクトリを監視するには?

シェアする

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

フォローする

コメント

  1. D より:

    FileSystemWatcherをスレッドで走らせて、メインスレッドに通知させてポップアップ処理する、じゃあかんの?

  2. Aoba より:

    > FileSystemWatcherをスレッドで走らせて、
    これはすでにそうなってるっぽい。
    > メインスレッドに通知させてポップアップ処理する、じゃあかんの?
    メインスレッドへの通知の方法が思いつかなかったのさ。
    スレッドセーフなリストに入れてタイマーで確認しようかと思ったんだが、
    タイマー自体も別スレッドで動いてしまう罠
    ・メインスレッド
    ・FSWスレッド
    ・タイマースレッド
    の三つになってしまう模様。
    メインスレッド側に通知する機能ってあるんかね?

  3. D より:

    普通にコールバック関数よばなかったっけあれ?
    ちと使い方がおもいだせないが。