【问题标题】:C#: Using FileSystemWatcher to watch for changes to filesC#:使用 FileSystemWatcher 监视文件更改
【发布时间】:2010-10-19 11:02:26
【问题描述】:

好的,所以我从How to check if a open file has been updated 了解到我应该使用FileSystemWatcher 来监视文件的更改。那么现在,问题是如果我必须跟踪许多文件,我是否为每个文件创建 1 个观察者?此外,一旦文件关闭,我必须以某种方式处理观察者。有一个Dictionary<string, FileSystemWatcher> 存储文件路径和FileSystemWatcher 是要走的路吗?当我打开更多文件时,我会添加更多观察者,当我关闭时,适当地处置观察者。有太多的观察者会是一件坏事吗?

更新

我刚刚做了

protected void AttachFileMonitor(EditorTabViewModel tab)
{
    string file = tab.FilePath;
    if (!_fsWatchers.ContainsKey(file))
    {
        var watcher = new FileSystemWatcher();
        watcher.Path = Path.GetDirectoryName(file);
        watcher.Filter = Path.GetFileName(file);
        watcher.Changed += (s, e) =>
        {
            string message = "";
            string caption = "";
            MessageBoxButton buttons = MessageBoxButton.YesNo;
            MessageBoxImage image = MessageBoxImage.Question;
            MessageBoxResult defaultResult = MessageBoxResult.Yes;
            MessageBoxResult result = _dialogSvc.GetMessageBox(message, caption, buttons, image, defaultResult);
            if (result == MessageBoxResult.Yes)
            {
                tab.Open(file);
            }
        };
        _fsWatchers.Add(file, watcher);
    }
}
protected void DetachFileMonitor(EditorTabViewModel tab)
{
    if (_fsWatchers.ContainsKey(tab.FilePath)) {
        _fsWatchers.Remove(tab.FilePath);
    }
}

我发现Changed() 永远不会被触发...

【问题讨论】:

  • 将 EnableRaisingEvents 设置为 true :)

标签: c# io filesystemwatcher


【解决方案1】:

如果您为每个目录创建一个观察程序就足够了(并且可选地,您可以让观察程序监控整个目录树。)然后您可以使用事件将更改的文件与您感兴趣的文件列表进行比较.

我建议您为观察者创建某种“保姆”类,以确保您不会处置活跃的观察者或创建重复的观察者。只是一个提示:)

顺便说一句,是的,有一个限制,你不能创建无限的观察者。在特定情况下可能会出现问题,但很可能对您而言并非如此

【讨论】:

  • 不知道是不是我做错了什么? FileSystemWatcher 似乎对我不起作用。或者这就是为什么这么多人警告不要使用它的原因?
  • 我猜,但您是否将 EnableRaisingEvents 设置为 true?
  • 这行得通,但即使我从我的应用程序中保存,更改也会提高 2 次。我读到这可能会发生,但我如何检查该事件是否已经引发 b4?
  • 这听起来有点奇怪,但一个简单的解决方案是获取文件的 LastWriteTime,保存它,然后在事件处理程序中进行比较。如果有变化:询问,如果没有变化:忽略
【解决方案2】:

我认为你肯定是在正确的轨道上。如何存储多个 fileWatcher 取决于您,但尽快处理它们并清除它们的队列对于可靠性很重要。每个目录只需要一个,而不是文件。

有很多关于 fileWatchers 不可靠性的帖子,所以请谨慎使用。

【讨论】:

  • 不知道是不是我做错了什么? FileSystemWatcher 似乎对我不起作用。或者这就是为什么这么多人警告不要使用它的原因?
【解决方案3】:

这确实是一种权衡。许多观察者会消耗更多资源,但如果您在包含许多文件/子目录(例如 C:) 的目录上有观察者,这也会消耗大量资源。

如果所有文件都位于一个文件夹中,您应该只使用单个观察程序。

【讨论】:

  • 还有一件事要考虑:观察者会消耗资源,是的,但它不会进行轮询,而且在大多数情况下轮询是邪恶的。最好是闲着等待某事,而不是主动要求某事。就性能和响应能力而言,显然更愿意等待而不是询问。
  • 不,它不会进行轮询。但是,它将接收您指定的文件夹结构中的所有更改。特别是当您指定 C:\ 时,您将收到 C:\ 驱动器上所有活动的通知,这将是很多。
  • 是的,我知道它不会轮询,我说的是使用 FileSystemWatcher 的替代方案:轮询;)但是如果你指定 C:\ 不会有太多活动,除非你启用递归模式.我试图说明的一点是,轮询使用的资源可能比观察者更多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
相关资源
最近更新 更多