2011-08-17 8 views
2

FileSystemWatchersのリストを作成しています。FileSystemWatcherがどのメソッドを呼び出しているかを知る方法?

List<ExtSystemFileWatcher> fswMonitors = new List<FileSystemWatcher>(); 

リストの中の数字は、ユーザーによって動的です。これはINIファイルから実行され、独自のMonitorクラスのMonitorオブジェクトの配列が作成されます。このクラスは、単純に削除イベントが発生私はFileSystemWatchersのどれを知る必要がある場合、各FileSystemWatcherが呼び出す「OnDelete」メソッドではなどに

if (iNumberMonitors > 0) 
{ 
    obMonitors = ReadMonitors(iNumberMonitors); 

    for (int iCounter = 0; iCounter < iNumberMonitors; iCounter++) 
    { 
     FileSystemWatcher fswCurrent = new FileSystemWatcher(); 
     fswCurrent.Path = obMonitors[iCounter].strMonPath; 
     fswCurrent.EnableRaisingEvents = true; 
     fswCurrent.NotifyFilter = NotifyFilters.FileName; 
     fswCurrent.Filter = "*." + obMonitors[iCounter].strMonExt; 
     fswCurrent.Deleted += OnDelete; 
     fswMonitors.Add(fswCurrent); 
    } 
} 

を見てモニタ番号、監視するためのパス、内線のようなvariblesを持っていますそれを呼びます。

私の質問は、どのFileSystemMonitorがリスト内のどのメソッドを呼び出すのかを知る方法です。

+0

ただ、上記に追加する:私はOnDeleteメソッドにいるときFileSystemWatcherを呼び出しているかを知る必要があります。私は、SQLServerのDBテーブルに書き出したいのは、モニタ(FileSystemWatchersなど)が作業を行ったばかりで、どのファイルが削除されたのかを定義したものです。 – MarkBrad

答えて

2

は、あなたは自分なeventHandlerでsenderをチェックするよりも、何が必要ですか? OnDeleteメソッドのパラメータは、イベント

void OnDelete(object sender, EventArgs e) 
{ 
    var watcher = ((FileSystemWatcher) sender); 
    ..... 
} 
+0

それはそうです!乾杯! – MarkBrad

0

これらのプールされたオブジェクトのそれぞれにハッシュコードが含まれているかどうかを確認することができます。どちらがユニークであるべきか。あなたは

あなたが変更する必要がありますもちろんの
fswCurrent.Deleted += (sender, e) => OnDelete(sender, e, iCounter) 

のようなものを渡す

fswCurrent.Deleted += OnDelete; 

1

あなたは、あなたの代わりにメソッド自体を渡す 「イベントを削除」フッククロージャを使用することができますOnDeleteの署名が追加のインデックスを取得する。 あなたのコメントを読んだ後、他の答えが示唆するように、あなたはそれを必要としないかもしれません。

+0

閉鎖によってイベントハンドラのシグニチャを変更することについて紹介してくれてありがとう。それが啓示でした! – Kristopher

1

イベントハンドラには、イベントを発生させたFileSystemWatcherへの参照である送信者パラメータがあります。

private static void OnDeleted(object source, FileSystemEventArgs e) 
{ 
    FileSystemWatcher watcher = source as FileSystemWatcher; 
    if(watcher != null) 
    { 
     string deletedFile = e.FullPath; 
     //Update db with watcher and deletedFile 
    } 
} 
1

「送信者は」ちょうどあなたが削除されたイベントにアタッチするイベントハンドラのSenderパラメータをキャスト。例えば

class Program 
{ 
    static void Main(string[] args) 
    { 
     var watcher = new FileSystemWatcher { Path = @"c:\temp", Filter = "*.txt" }; 
     watcher.Deleted += watcher_Deleted; 
     watcher.EnableRaisingEvents = true; 
     Console.ReadLine(); 
    } 

    static void watcher_Deleted(object sender, FileSystemEventArgs e) 
    { 
     var watcher = sender as FileSystemWatcher; 
    } 
} 
1

の創始者を指します

private void OnDelete(object sender, ...) 
{ 
    var watcher = (FileSystemWatcher) sender; 

    // probably list.IndexOf here if you really need an index 
} 
関連する問題