如何知道哪个FileSystemWatcher正在调用Method

本文关键字:调用 Method FileSystemWatcher 何知道 | 更新日期: 2023-09-27 18:05:55

我正在创建一个FileSystemWatchers列表。

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

列表中它们的数量是动态的,取决于用户。这是从一个INI文件中完成的,并创建了来自我自己的Monitor类的Monitor对象数组。该类只有一些变量,如监视号、要监视的路径、要查找的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);
    }
}

在'OnDelete'方法中,如果删除事件触发,每个FileSystemWatcher调用,我需要知道哪个FileSystemWatchers正在调用它。

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

如何知道哪个FileSystemWatcher正在调用Method

除了在eventandler中检查sender之外,您还需要其他任何东西吗?

private void OnDelete(object sender, ...)
{
    var watcher = (FileSystemWatcher) sender;
    // probably list.IndexOf here if you really need an index
}

你可以使用闭包来挂钩你的"Delete事件"而不是传递方法本身:

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

OnDelete方法中的"sender"参数将指向事件的发起者

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

只需强制转换附加到Deleted事件的事件处理程序的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;
    }
}

可以检查这些池中的每个对象是否都有一个哈希码。