好的,所以我从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()
永远不会被触发......
答案 0 :(得分:2)
如果为每个目录创建一个观察器就足够了(并且可选地,您可以让观察者监视整个目录树。)然后,您可以使用这些事件将更改的文件与您感兴趣的文件列表进行比较。
我建议您为观察者制作某种“保姆”课程,以确保您不会处置活跃的观察者,或创建重复。只是一个提示:)
是的,是的,有一个限制,你无法创造无限的观察者。在特定情况下,这可能是一个问题,但很可能,情况并非如此答案 1 :(得分:1)
我认为你肯定是在正确的轨道上。由您决定如何存储多个文件监视器,但是尽可能快地处理它们并清除它们的队列对于可靠性非常重要。每个目录只需要一个,而不是文件。
有很多关于fileWatchers不可靠的帖子,所以请谨慎使用。
答案 2 :(得分:0)
这真的是一种权衡。许多观察者会消耗更多资源,但如果你在包含许多文件/子目录(例如C :)的目录上有一个观察者,这也将消耗大量资源。
如果所有文件都位于一个文件夹中,您应该只使用一个观察者。