【问题标题】:C# Hashtable of FileSystemWatchersFileSystemWatchers 的 C# 哈希表
【发布时间】:2015-10-07 05:40:30
【问题描述】:

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

我的主要问题是如何“保留”方法和类之间的哈希表。我对 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);
        }
    }
}

这样一个文件系统观察器就会被添加到哈希表中。但是,由于 globalhashtable 是静态的(?),这将不起作用。使其非静态意味着我必须在按下按钮时创建它的一个实例,所以我每次都有一个新实例,因为它不是“保留”的。我的问题是如何在方法和类之间保持一个表在内存中。

我很确定我在很大程度上误解了一些东西,因为我对这一切都是新手。我也怀疑这是否是一个半体面的方法,如果有人有更好的方法,那么请继续!

谢谢,

马特

【问题讨论】:

  • “使它成为非静态意味着我必须在按下按钮时创建它的一个实例”,不,它只是意味着你必须创建它的一个实例一次,就像在你的构造函数中一样。我不确定你的意思是“课间”,你在哪里分享这个?您只需要创建一个可公开访问的属性,该属性返回您创建的实例,以便在其他活动类对象之间可用。此外,您应该查看 Dictionary<string, FileSystemWatcher> 而不是哈希表以避免装箱。
  • 我同意@RonBeyer 关于使用字典而不是哈希表的建议。还要注意具有大量子目录和文件的目录。 .NET Filewatchers 并不总是很好。

标签: c# static directory hashtable filesystemwatcher


【解决方案1】:

根据@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 类

【讨论】:

  • 谢谢,这真的很有帮助。我会去告诉你的。谢谢你的解释,因为我知道我所拥有的一定是没有意义的......
猜你喜欢
  • 1970-01-01
  • 2019-03-26
  • 2023-03-04
  • 2013-08-20
  • 2012-10-03
  • 2019-09-22
  • 2011-01-30
  • 2017-05-31
相关资源
最近更新 更多