C# 如何知道哪个FileSystemWatcher正在调用方法?
我正在创建一个文件系统观察者列表C# 如何知道哪个FileSystemWatcher正在调用方法?,c#,event-handling,filesystemwatcher,C#,Event Handling,Filesystemwatcher,我正在创建一个文件系统观察者列表 List<ExtSystemFileWatcher> fswMonitors = new List<FileSystemWatcher> (); List fswMonitors=新列表(); 列表中的数量是动态的,具体取决于用户。这是通过INI文件完成的,并从我自己的监视器类创建了一个监视器对象数组。该类只是有一些变量,如Montior编号、要监视的路径、要查找的Ext等 if (iNumberMonitors > 0) {
List<ExtSystemFileWatcher> fswMonitors = new List<FileSystemWatcher> ();
List fswMonitors=新列表();
列表中的数量是动态的,具体取决于用户。这是通过INI文件完成的,并从我自己的监视器类创建了一个监视器对象数组。该类只是有一些变量,如Montior编号、要监视的路径、要查找的Ext等
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);
}
}
if(iNumberMonitors>0)
{
obMonitors=读取监视器(iNumberMonitors);
对于(int-iCounter=0;iCounter
在每个FileSystemWatcher在触发Delete事件时调用的“OnDelete”方法中,我需要知道哪个FileSystemWatcher正在调用它
我的问题是如何知道列表中的哪个FileSystemMonitor正在调用该方法?可能需要检查这些池对象中是否每个都包含哈希代码。应该是唯一的。您可以使用一个闭包来钩住“删除事件” 而不是传递方法本身:
fswCurrent.Deleted += OnDelete;
你通过了类似这样的考试
fswCurrent.Deleted += (sender, e) => OnDelete(sender, e, iCounter)
当然,您需要更改OnDelete的签名以获取附加索引。
但是,在阅读您的评论之后,您可能不需要它,正如其他答案所示。事件处理程序有一个sender参数,该参数是对引发事件的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
}
}
除了在eventHandler中检查
sender
,您还需要其他什么吗
private void OnDelete(object sender, ...)
{
var watcher = (FileSystemWatcher) sender;
// probably list.IndexOf here if you really need an index
}
OnDelete方法中的“sender”参数将指向事件的发起人
void OnDelete(object sender, EventArgs e)
{
var watcher = ((FileSystemWatcher) sender);
.....
}
只需强制转换附加到已删除事件的事件处理程序的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;
}
}
我需要知道当我使用OnDelete方法时,哪个FileSystemWatcher正在调用。我想向SQLServer DB表写入哪些用户定义的监视器(例如FileSystemWatchers)刚刚执行了工作,哪些文件被删除。感谢您向我介绍如何通过闭包更改事件处理程序的签名。这是一个启示!