2011-08-17 51 views
2

我正在创建FileSystemWatchers列表。如何知道哪个FileSystemWatcher正在调用方法?

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

根据用户的不同,它们在列表中的数量是动态的。这是从一个INI文件完成的,并且创建了一个来自我自己的Monitor类的Monitor对象数组。只是有类可变因素,如Montior数量,道路监控,分机寻找等

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); 
    } 
} 

,每个FileSystemWatcher的电话如果删除事件触发我需要知道“OnDelete”方法,它的FileSystemWatchers的正在调用它。

我的问题是如何知道列表中的哪个FileSystemMonitor调用方法?

+0

我想补充上述:我需要知道什么时候我在OnDelete方法,FileSystemWatcher的呼吁。我想写一个SQLServer数据库表,用户定义的监视器(例如FileSystemWatchers)刚刚执行了哪项工作,哪个文件被删除了。 – MarkBrad

回答

2

除了在eventHandler中检查sender之外,还需要什么吗?在OnDelete方法

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

    // probably list.IndexOf here if you really need an index 
} 
+0

那就是那个!干杯! – MarkBrad

0

可能会检查这些池中的每个对象是否都有散列码。这应该是独一无二的。

1

您可以使用,你勾关闭你的“删除事件” ,而不是传递方法本身:

fswCurrent.Deleted += OnDelete; 

你通过像

fswCurrent.Deleted += (sender, e) => OnDelete(sender, e, iCounter) 
当然,你将需要改变的

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

“发件人”参数将指向事件

void OnDelete(object sender, EventArgs e) 
{ 
    var watcher = ((FileSystemWatcher) sender); 
    ..... 
} 
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; 
    } 
} 
相关问题