FileSystemWatchers的C#Hashtable

时间:2015-07-17 13:23:22

标签: c# static directory hashtable filesystemwatcher

我正在尝试创建文件系统观察者的哈希表。这是为了将活动文件系统监视器的运行记录与它们正在监视的目录保持为关键。然后通过表单,用户可以添加和删除要观看的文件夹,这些文件夹在列表视图中可见。

我的主要问题是如何"保持"方法和类之间的哈希表。我对C#有点新手,它似乎不像我以前在VB.NET中那样工作。

所以我(简化为简化):

    public partial class MainForm : Form
    {
        public static Hashtable globalHashTable;
        public MainForm()
        {
            InitializeComponent();
        }


        public void Button1Click(object sender, EventArgs e)
        {
            FileSystemWatcher watcher1 = new FileSystemWatcher(@"C:\");
            globalHashTable.Add(@"C:\",watcher1);
        }
    }
}

以便将filesystemwatcher添加到哈希表中。然而,由于globalhashtable是静态的(?),这不会起作用。使它非静态意味着我必须在按下按钮时创建它的实例,所以我每次都有一个新实例,因为它不是"保持"。我的问题是如何在方法和类之间保留一个表。

我相当肯定我已经误解了一些事情,因为我对这一切都不熟悉。我也怀疑这甚至是一个不太合适的方式,如果有人有更好的方法,那么请继续!

谢谢,

马特

1 个答案:

答案 0 :(得分:0)

扩展@Ron Beyer的建议你可以这样做:

private Dictionary<string, FileSystemWatcher> _fileSystemWatcherMap;

public MainForm()
{
    InitializeComponent();

    _fileSystemWatcherMap = new Dictionary<string, FileSystemWatcher>();
}

public void Button1Click(object sender, EventArgs e)
{
    string pathToWatch = @"C:\"; // Must be a different path each time otherwise will throw
    var watcher = new FileSystemWatcher(pathToWatch);
    _fileSystemWatcherMap.Add(pathToWatch, watcher);
}

这样,MainForm中的所有方法都可以访问文件观察者。

如果您需要在从MainForm创建的表单中共享它,您可以在显示对话框之前简单地传递此数据。

如果以不同的方式创建另一个表单,您可以创建一个这样的静态类:

public static class FileWatcherMap
{
    private static Dictionary<string, FileSystemWatcher> _fileSystemWatcherMap = new Dictionary<string,FileSystemWatcher>();

    public static void AddWatcher(string path, FileSystemWatcher fsw)
    {
        _fileSystemWatcherMap.Add(path, fsw);
    }

    public static void RemoveWatcher(string path)
    {
        _fileSystemWatcherMap.Remove(path);
    }
}

然后在点击处理程序中将观察者添加到此列表中:

public void Button1Click(object sender, EventArgs e)
{
    string pathToWatch = @"C:\"; // Must be a different path each time otherwise will throw
    var watcher = new FileSystemWatcher(pathToWatch);
    FileWatcherMap.AddWatcher(pathToWatch, watcher);
}

现在可以从任何其他表单访问FileWatcherMap类