- PR -

ファイル監視で稀にイベントが発生しない

1
投稿者投稿内容
村長
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 67
投稿日時: 2006-12-11 14:19
FileSystemWatcherを使用してファイル監視アプリを作成していますが、
稀にFileSystemWatcherのイベントが発生しない場合があります。

MSサイトを調べ、InternalBufferSizeの拡大やイベント処理の短縮なども
行いましたが、解決に至っていません。

過去のログで、FileSystemWatcherの使用をやめ、while文に変更した人も
いたようですが、回避策はないでしょうか?
ご存知の方がいたら教えてください。

ちなみに、
InternalBufferSizeのサイズは初期値(8K)から256Kまで拡大。
ファイル名は平均25Byte。
イベント時の処理は、作成されたファイルを別フォルダにコピー後、
ファイルの中身をDB登録しています。

甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-12-11 14:33
引用:

村長さんの書き込み (2006-12-11 14:19) より:
MSサイトを調べ、InternalBufferSizeの拡大やイベント処理の短縮なども
行いましたが、解決に至っていません。

過去のログで、FileSystemWatcherの使用をやめ、while文に変更した人も
いたようですが、回避策はないでしょうか?


無いと思います。実際、エクスプローラなんかも、時折ファイル更新を取りそびれている気がしますしね・・・・。
定期的なポーリングとFileSystemWatcherの両方を併用して、うまくイベントを取れたらすばやく処理。駄目でも一定時間後にはポーリングで処理するのが良作と思います。
村長
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 67
投稿日時: 2006-12-12 13:51
甕星さん、返答ありがとうございます。

やはり無いのでしょうか。。。
ただ一点気になることがあります。

実は、イベントが発生しない(正確には発生している?)時は必ずファイルコピー処理で
”該当ファイルは別のプロセスが使用中”のエラーになります。
イベント処理では、イベント発生に起因したファイルのみを対象に処理するため、
別々のイベント処理で同一ファイルを操作することは無いはずなので、
別のプロセスが使用中とエラーメッセージが返されるのがわかりません。

過去ログで、ファイル作成は厳密にはファイル作成→削除→ファイル作成と
いくつかのコマンドが複合して行われるとありましたが、このあたりが関係しているのでしょうか?
村長
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 67
投稿日時: 2006-12-12 14:33
ファイル作成時のイベントについて検証したところ、
やはりファイル作成、ファイル削除、ファイル作成の3つのイベントが
発生していることがわかりました。

これで”該当ファイルは別のプロセスが使用中”とエラーが出た原因と
イベントはちゃんと発生していることがわかりましたが、
2回発生するファイル作成イベントを1回だけ処理する(うち1回は無視)方法は
無いでしょうか?
皆さんはどのように対処されているのでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-12 14:51
引用:

村長さんの書き込み (2006-12-12 14:33) より:

これで”該当ファイルは別のプロセスが使用中”とエラーが出た原因とイベントはちゃんと発生していることがわかりましたが、2回発生するファイル作成イベントを1回だけ処理する(うち1回は無視)方法は無いでしょうか?
皆さんはどのように対処されているのでしょうか?


FileSystemWatcher は、あくまでトリガーとして扱うようにして、あとは自力で解析とかしています。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-12-12 15:04
引用:

村長さんの書き込み (2006-12-12 14:33) より:
これで”該当ファイルは別のプロセスが使用中”とエラーが出た原因と
イベントはちゃんと発生していることがわかりましたが、
2回発生するファイル作成イベントを1回だけ処理する(うち1回は無視)方法は
無いでしょうか?


そこまで厳密に取得したいのであれば、ファイルシステムフィルタドライバでも作らない限り無理です。FileSystemWacherはイベントを通知するだけで、イベントが届くまでの間にステータスが変化しない事を保障しているわけじゃないですからね。

でも私はドライバを作りたくないので、ポーリング又はイベントで独自に判断処理をいれます。
村長
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 67
投稿日時: 2006-12-12 15:04
じゃんぬねっとさん、返答ありがとうございます。

できることなら全てFileSystemWatcherに頼りたかったんですが、
トリガーとしてまでしか使えないってことですね。
残念。。。

ありがとうございました。
村長
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 67
投稿日時: 2006-12-12 15:16
甕星さん、返答ありがとうございます。

2回中1回のイベントだけを処理したかったのはプロセスエラーを回避させるためで、
多少のステータス相違は許容するつもりでしたが。。。

とりあえず全てを頼れないことがわかったので、
FileSystemWatcher+αで再検討しようと思います。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)