C #: использование FileSystemWatcher для отслеживания изменений в файлах - PullRequest
2 голосов
/ 19 октября 2010

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

Ответы [ 3 ]

2 голосов
/ 19 октября 2010

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

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

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

1 голос
/ 19 октября 2010

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

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

0 голосов
/ 19 октября 2010

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

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

...