2013-05-13 10 views
5

私は問題を抱えています。私はルートフォルダとそのサブフォルダのすべての変更を検出FileSystemWatcherのラッパーを書かれています。何もない:モノの下でFileSystemWatcher - 見ているサブディレクトリ

FileSystemWatcher watcher = new FileSystemWatcher(); 
watcher.Path = this.Root; 
watcher.IncludeSubdirectories = true; 
watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.LastAccess | NotifyFilters.DirectoryName | NotifyFilters.FileName; 
watcher.Changed += new FileSystemEventHandler (watcher_Changed); 
watcher.Deleted += new FileSystemEventHandler (watcher_Deleted); 
watcher.Created += new FileSystemEventHandler (watcher_Created); 
watcher.Renamed += new RenamedEventHandler (watcher_Renamed); 
watcher.EnableRaisingEvents = true; 

.NETでは、Windowsでは、それは魅力的に機能します。しかし、私はモノにコードを移植し、OSXの下でコードを実行したとき、それはルートフォルダでのみ正しく動作します。

  • イベントはすでにウォッチャーは私がEventArgs.FullPathプロパティを経由して取得

  • パスが正しくないを開始時にルートの下に既存のフォルダ内の操作用に飼育されていない:私は今では気づいている

    問題(私がpath_to_root/some/more/subdirs/some.fileにファイルをコピーするとき、私が得るパスは単にpath_to_root/some.fileです)。

unproperパスの問題がすでに1年前に報告された(そしてそれが解決されたように見える)が、私のモノは昨年12月から来ているされています(MonoDevelopのは、それは、それはバージョン4.0.0.0です参照]セクションで述べていますすべて私が配布について言うことができる)とバグはまだそこにある... 参照: https://bugzilla.xamarin.com/show_bug.cgi?id=5747

すべてのアイデア?繰り返しそのポーリングするファイルシステム独自のウォッチャを書いたりルート下のすべてのフォルダに対して個別のウォッチャーを開始する必要のない回避策がある場合、私は

おかげで、事前に...本当に好奇心!

+0

であってもよく、これは助けることができる:[ありません-ネットfilesystemwatcher-仕事とモノの-MAC-OS] [1] [1]:http://stackoverflow.com/質問/ 5727652/does-net-filesystemwatcher-work-with-mono-on-mac-os –

+0

このトピックを見て、残念ながら私はそこに自分のための助けを見つけることができません...ありがとう、しかし! – wojtuch

+0

5747のバグ修正でシナリオが修正されなかった場合は、http://bugzilla.xamarin.com – knocte

答えて

5

私の知る限り、これは単にOS X上モノでは動作しません。私は先週、それが発生し、そのための任意のバグレポートを見つけることができませんでしたので、私はそれをここに報告:https://bugzilla.xamarin.com/show_bug.cgi?id=16259

限り私はimplementation of KEventWatcherに従うことができるよう、それはウォッチャーが作成されたときにサブディレクトリをサブスクライブするために何もしていません。サブディレクトリを購読するのは、PostEventで追加されたことが検出されたときだけです。作成時にすべてのサブディレクトリに登録しても、それは素晴らしい解決策ではないかもしれません。基礎となるkeventの仕組みは、すべてのサブディレクトリに対してオープンなファイル記述子を必要とします。ファイル記述子が非常に多くなる可能性があります。

MonoはFileSystemWatcherの他の実装を持っていますが、コンパイル時にMonoランタイムに実装の選択が焼き付けられていると思います。すべてのプラットフォーム上でディレクトリツリー全体を毎秒スキャンするだけで、すべてのプラットフォームで機能するデフォルトのウォッチャーが遅くて非効率的ですが、使用可能なプラットフォーム固有の実装がない場合にのみ選択されます。

私が言って怖い、それはあなたの最善の策のように見えますが、お勧めのいずれかの回避策がある - 手動で変更のスキャンまたはすべてのディレクトリのFileSystemWatcherを作成します。

+0

に新しいバグを作成するだけで、説明した細部にまでこだわらずに自分自身の「ウォッチャー」を作成することにしました。 - 私は単にファイルシステムをポーリングし、手動で変更された項目を検出するだけです。でも、少しオーバーヘッドがありますが...。 MacOSにWindowsプログラムを移植することから学んだ最も重要なこと - Objective Cを学ぶか、それはあなたが実装されていない/動作していない機能を発見したときに頭痛を軽減します。ネットワークの状態、電力の変化などを検出する – wojtuch

関連する問題