C#:使用FileSystemWatcher监视文件的更改

时间:2010-10-19 11:02:27

标签: c# io filesystemwatcher

好的,所以我从How to check if a open file has been updated了解到我应该使用FileSystemWatcher来监视文件的更改。那么现在问题是我是否必须跟踪许多文件,我是否为每个文件创建了一个观察者?此外,一旦文件关闭,我必须以某种方式处理观察者。是否有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()永远不会被触发......

3 个答案:

答案 0 :(得分:2)

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

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

是的,是的,有一个限制,你无法创造无限的观察者。在特定情况下,这可能是一个问题,但很可能,情况并非如此

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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