Почему обнаружены изменения атрибутов FileSystemWatcher в Windows 7, но не в Windows 8?

У меня есть код, который использует FileSystemWatcher для мониторинга изменений файлов вне моего приложения.

В Windows 7, используя .NET 4, приведенный ниже код будет определять, когда файл был отредактирован и сохранен в приложении, таком как Блокнот, в то время как мое приложение запускалось. Однако эта логика не работает с использованием .NET 4 в Windows 8. В частности, событие FileSystemWatcher Changed никогда не срабатывает.

public static void Main(string[] args)
{
    const string FilePath = @"C:\users\craig\desktop\notes.txt";

    if (File.Exists(FilePath))
    {
        Console.WriteLine("Test file exists.");
    }

    var fsw = new FileSystemWatcher();
    fsw.NotifyFilter = NotifyFilters.Attributes;
    fsw.Path = Path.GetDirectoryName(FilePath);
    fsw.Filter = Path.GetFileName(FilePath);

    fsw.Changed += OnFileChanged;
    fsw.EnableRaisingEvents = true;

    // Block exiting.
    Console.ReadLine();
}

private static void OnFileChanged(object sender, FileSystemEventArgs e)
{
    if (File.Exists(e.FullPath))
    {
        Console.WriteLine("File change reported!");
    }
}

Я понимаю, что я могу изменить NotifyFilter, чтобы включить NotifyFilters.LastWrite, который может решить мою проблему. Тем не менее, я хочу понять , почему этот код работал в Windows 7, но теперь не удается запустить событие Changed в Windows 8. Мне также интересно узнать, есть ли способ восстановить поведение Windows 7 FileSystemWatcher при работе в Windows 8 (без изменения NotifyFilter).

Ответ 1

Проверьте бит архива в файле до/после его редактирования. Ваш код ищет только изменения атрибутов, поэтому я предполагаю, что Windows 7 обновляет бит архива в файле, а Windows 8 - нет.

Ответ 2

FileSystemWatcher известен как ненадежный. Попробуйте подписаться на все события и посмотрите, стреляют ли другие. Одна вещь, которую вы могли бы попробовать, - использовать таймер для регулярного просмотра файла для изменений, скажем, раз в две секунды, вместо использования FileSystemWatcher.

Ответ 3

Слишком много комментариев во всем мире, я просто добавлю ответ, чтобы убедиться, что вы знаете о следующих проблемах:

По-видимому, проблема в том, что событие возникает в фоновом потоке, и вам нужно перевести вызов обратно в поток пользовательского интерфейса.

У меня много проблем с классом FileSystemWatcher, и я решил не использовать его, как вы можете видеть здесь: fooobar.com/questions/45352/.... Возможно, однако, что проблемы, которые я испытал, были связаны с проблемами синхронизации потоков и/или аппаратными проблемами.

Ответ 4

У меня была та же проблема. Этот класс работает на моем компьютере с Windows 8:

https://stackoverflow.com/a/23743268/637142

Причина, почему я использую этот класс, заключается в том, что он ведет себя одинаково в Windows 7 и Windows 8.

Ответ 5

Я не знаю, почему, но я нахожу, что в Windows 8.1

NotifyFilters.LastWrite(Измененное событие) класса FileSystemWatcher запустит

  • Если я просматриваю каталог внутри своего рабочего стола (C:\Users\[user]\Desktop).

событие не срабатывает

  • если я контролирую каталог программных файлов (C:\Program Files (x86))

Может быть связано с разрешением, но я не знаю, как его настроить, оба условия запускаются под администратором