Ответ 1
Проверьте бит архива в файле до/после его редактирования. Ваш код ищет только изменения атрибутов, поэтому я предполагаю, что 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).
Проверьте бит архива в файле до/после его редактирования. Ваш код ищет только изменения атрибутов, поэтому я предполагаю, что Windows 7 обновляет бит архива в файле, а Windows 8 - нет.
FileSystemWatcher известен как ненадежный. Попробуйте подписаться на все события и посмотрите, стреляют ли другие. Одна вещь, которую вы могли бы попробовать, - использовать таймер для регулярного просмотра файла для изменений, скажем, раз в две секунды, вместо использования FileSystemWatcher.
Слишком много комментариев во всем мире, я просто добавлю ответ, чтобы убедиться, что вы знаете о следующих проблемах:
По-видимому, проблема в том, что событие возникает в фоновом потоке, и вам нужно перевести вызов обратно в поток пользовательского интерфейса.
У меня много проблем с классом FileSystemWatcher, и я решил не использовать его, как вы можете видеть здесь: fooobar.com/questions/45352/.... Возможно, однако, что проблемы, которые я испытал, были связаны с проблемами синхронизации потоков и/или аппаратными проблемами.
У меня была та же проблема. Этот класс работает на моем компьютере с Windows 8:
https://stackoverflow.com/a/23743268/637142
Причина, почему я использую этот класс, заключается в том, что он ведет себя одинаково в Windows 7 и Windows 8.
Я не знаю, почему, но я нахожу, что в Windows 8.1
NotifyFilters.LastWrite(Измененное событие) класса FileSystemWatcher запустит
событие не срабатывает
Может быть связано с разрешением, но я не знаю, как его настроить, оба условия запускаются под администратором