DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォルダ常駐監視(FileSystemWatcher)が上手く動作しない

環境/言語:[Visual Basic.NET]
分類:[.NET]

こんにちは。
はじめまして。
特定のフォルダの中のファイル作成を
常駐して監視するプログラムを作成していますが
目的とおりに動作しません。
FileSystemWatcherクラスの使い方に不備が
あるかと思うのですが、エラーが出ず
問題箇所を特定できません。
ご存知の方がいらっしゃいましたらご教示
頂けないでしょうか。

※こちらのサイト内の以下のTIPSを参考
http://dobon.net/vb/dotnet/file/filesystemwatcher.html
※環境 Windows XP,VB.net,NET Framework1.1

※目的の動作としては以下です。
・常にフォルダ内を監視
・フォルダ内にはファイルが1つ以上断続的に
追加される
・順序は問わないが、ファイルが1つ追加される
ごとにイベント発生とし1つのファイルにつき
規定の処理を必ず1回実行する

※現状
手動でフォルダにファイルを追加してテスト
した所、一度にファイルを複数追加すると
一部のファイルしか処理されないまま処理が
終了してしまう。
1件追加の時は1件正常に処理して終了する。
'同期的に監視する
Dim changedResult As System.IO.WaitForChangedResult = _
Watcher.WaitForChanged(IO.WatcherChangeTypes.Created, -1)
上記の部分をコメント化した時は開始後
ファイルの追加をする前に終了してしまいます。


クラス1------------------------------------------------------
Private Watcher As FileSystemWatcher 'フォルダ監視オブジェクト

メソッド1
''監視オブジェクト作成
Watcher = New FileSystemWatcher
With Watcher
.Path = pStr_WatchFPath '監視するディレクトリのパス
.Filter = pStr_WatchFName '監視するファイル
.NotifyFilter = NotifyFilters.FileName '監視する変更の種類
.EnableRaisingEvents = True '監視開始

AddHandler .Created, AddressOf メソッド3 '通知を受け取るメソッド

メソッド2
'同期的に監視する
Dim changedResult As System.IO.WaitForChangedResult = _
Watcher.WaitForChanged(IO.WatcherChangeTypes.Created, -1)

メソッド3
'追加されたファイルに対する処理

クラス2------------------------------------------------------
Sub Main()
クラス1の変数を宣言して
メソッド1実行
> 手動でフォルダにファイルを追加してテスト
> した所、一度にファイルを複数追加すると
> 一部のファイルしか処理されないまま処理が
> 終了してしまう。

そういうもんです。
なので、それを踏まえてコードを変更してください。
> そういうもんです。
> なので、それを踏まえてコードを変更してください。
>

渋木宏明(ひどり) さま

ご回答いただきありがとうございます。
コードを変更ということですが、
ファイルを1件以上追加していった場合の
処理の仕方について見当がつかず、
1回目のような記述となっておりました。

・継続して監視を継続させたいのに
1件ファイルを追加すると1件処理して終了してしまう

EnableRaisingEvents = True で開始しfalseの代入をするまで
継続して監視するものだと思っていたのですが
これに対してはTimerを使用するなどしてメソッド2を
ループ継続させる必要があるということでしょうか?

また、

・ファイルを同時に1つ以上追加した時、
下記のようにCreatedイベント発生時に呼ばれるよう
登録した処理メソッド3がファイルの個数分呼ばれない
(ファイルa,b,c追加に対しa,bに呼ばれた2回だったり
aのみの1回だったり)

>>AddHandler .Created, AddressOf メソッド3 '通知を受け取るメソッド

上記の対処としては1回のイベント発生時に
そのイベントを発生させたファイルの処理後に
監視フォルダ内にイベント発生対象ファイルが
他に入ってないか検索し、あればメソッド3を
呼ぶという処理を追加する

という形になりますでしょうか。
> EnableRaisingEvents = True で開始しfalseの代入をするまで
> 継続して監視するものだと思っていたのですが
> これに対してはTimerを使用するなどしてメソッド2を
> ループ継続させる必要があるということでしょうか?

具体的な実装はいくつか考えられると思います。

タイマを使うのも一案ですし、「FileSystemWatcher から上がってくるイベント」を「単なるトリガ」として使うことにして、引き続き FileSystemWatcher を使うという手も考えられると思います。

> >>AddHandler .Created, AddressOf メソッド3 '通知を受け取るメソッド
>
> 上記の対処としては1回のイベント発生時に
> そのイベントを発生させたファイルの処理後に
> 監視フォルダ内にイベント発生対象ファイルが
> 他に入ってないか検索し、あればメソッド3を
> 呼ぶという処理を追加する
>
> という形になりますでしょうか。

でもいいでしょうし、イベントの引数なんか見ないで、直ちに自力で差異の確認を始めてしまっても良いんじゃないでしょうか。
渋木宏明(ひどり)さま、

ご提案ありがとうございます。
今後の修正方針をつかみかねていた所、
非常に助かりました。
結果を再投稿してお知らせしたいのですが
再検討に時間がかかりそうですので一旦
CLOSEとさせていただきます。
お世話になりました。

DOBON.NET | プログラミング道 | プログラミング掲示板