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

标签 c# io filesystemwatcher

好的,所以我是从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()永远不会被触发...

最佳答案

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

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

顺便说一句,是的,有一个限制,你不能创建无限的观察者。在特定情况下这可能会成为问题,但最有可能的是,您的情况并非如此

关于C#:使用 FileSystemWatcher 监视文件的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3967658/

相关文章:

c# - 二进制数组将映射减少到 C# 中的矩形

c# - WPF自定义控件中的"The type reference cannot find a public type..."错误

c# - 多列 TreeView

filesystemwatcher - 在 DataOntap 上使用 FileSystemWatcher

c# - 是否有用于文件的 ICopyHook.CopyCallback 或替代品?

java - java中的Filewatcher用于监视Windows文件夹并通知Linux

c# - 是否有任何类型的通用字典试图获取不存在的键将返回 null?

java - 如何在多线程程序中传递或共享开放流引用?

python - 如何获取一个程序的输出并将其用作另一个程序的输入?

c++ - 从 fstream 获取 FILE*