Хорошо, поэтому я узнал из Как проверить, обновлен ли открытый файл, что я должен использовать FileSystemWatcher, чтобы следить за изменениями в файлах. Теперь вопрос в том, должен ли я отслеживать многие файлы, создать ли я один наблюдатель для каждого файла? Кроме того, я должен как-то избавиться от наблюдателя, как только файл будет закрыт. Имеет ли Dictionary<string, FileSystemWatcher>
сохранение пути к файлу и FileSystemWatcher
путь? поскольку я открываю больше файлов, я добавляю больше наблюдателей и, закрываясь, распоряжаюсь наблюдателями соответствующим образом. Будет ли слишком много наблюдателей быть плохой?
UPDATE
Я просто сделал
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()
никогда не запускается...
Это достаточно, если вы создаете наблюдателя для каждой директории (и, возможно, вы можете наблюдать за всем деревом каталогов.) Затем вы можете использовать события для сравнения измененных файлов со списком файлов, которые вас интересуют.
Я предлагаю вам сделать какой-то класс "нянь" для наблюдателей, чтобы вы не размещали активных наблюдателей или не создавали дубликаты. Только совет:)
Btw, да, есть предел, вы не можете создавать бесконечные наблюдатели. В конкретных сценариях, которые могут быть проблемой, но, скорее всего, это не так для вас.
FileSystemWatcher
кажется, не работает для меня. или поэтому многие люди предостерегают от его использования?
Я думаю, что ты определенно на правильном пути. Вам важно как хранить несколько файловых серверов, а распоряжаться ими и как можно быстрее освобождать свою очередь. Вам нужен только один каталог, а не файл.
Есть много сообщений о ненадежности файловых серверов, поэтому будьте старательны в своем использовании.
FileSystemWatcher
кажется, не работает для меня. или поэтому многие люди предостерегают от его использования?
Это действительно компромисс. Многие наблюдатели будут потреблять больше ресурсов, но если у вас есть наблюдатель в каталоге, содержащем много файлов/подкаталогов (например, C:), это также будет потреблять много ресурсов.
Если все файлы находятся в одной папке, вы должны просто использовать одиночный наблюдатель.