C #: использование FileSystemWatcher для отслеживания изменений в файлах

2

Хорошо, поэтому я узнал из Как проверить, обновлен ли открытый файл, что я должен использовать 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() никогда не запускается...

  • 0
    Установите EnableRaisingEvents в true :)
Теги:
io
filesystemwatcher

3 ответа

2
Лучший ответ

Это достаточно, если вы создаете наблюдателя для каждой директории (и, возможно, вы можете наблюдать за всем деревом каталогов.) Затем вы можете использовать события для сравнения измененных файлов со списком файлов, которые вас интересуют.

Я предлагаю вам сделать какой-то класс "нянь" для наблюдателей, чтобы вы не размещали активных наблюдателей или не создавали дубликаты. Только совет:)

Btw, да, есть предел, вы не можете создавать бесконечные наблюдатели. В конкретных сценариях, которые могут быть проблемой, но, скорее всего, это не так для вас.

  • 0
    Интересно, я что-то не так делаю? FileSystemWatcher кажется, не работает для меня. или поэтому многие люди предостерегают от его использования?
  • 0
    Я предполагаю, но вы установили EnableRaisingEvents в true?
Показать ещё 2 комментария
1

Я думаю, что ты определенно на правильном пути. Вам важно как хранить несколько файловых серверов, а распоряжаться ими и как можно быстрее освобождать свою очередь. Вам нужен только один каталог, а не файл.

Есть много сообщений о ненадежности файловых серверов, поэтому будьте старательны в своем использовании.

  • 0
    Интересно, я что-то не так делаю? FileSystemWatcher кажется, не работает для меня. или поэтому многие люди предостерегают от его использования?
0

Это действительно компромисс. Многие наблюдатели будут потреблять больше ресурсов, но если у вас есть наблюдатель в каталоге, содержащем много файлов/подкаталогов (например, C:), это также будет потреблять много ресурсов.

Если все файлы находятся в одной папке, вы должны просто использовать одиночный наблюдатель.

  • 0
    Есть еще одна вещь, которую нужно учитывать: наблюдатель будет потреблять ресурсы, да, но это не будет опрос, а опрос в большинстве случаев является злом. В основном лучше бездействовать и ждать чего-то, а не активно что-то просить. С точки зрения производительности и отзывчивости явно предпочтительнее ждать, чем спрашивать.
  • 0
    Нет, это не будет опрос. Однако он будет получать все изменения в указанной вами структуре папок. В частности, когда вы указываете C: \, вы будете получать уведомления обо всех действиях на вашем диске C: \, и это будет много.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню