проблема с fileSystemWatcher

У меня есть два приложения: CREATOR (которое я не могу изменить) и OBSERVER. CREATOR управляет множеством файлов, и мне нужно, чтобы OBSERVER знал, когда это произойдет. Я написал OBSERVER на C # и использую FileSystemWatcher. Я задаю путь к своему пути, устанавливаю фильтр на FILE и добавляю все необходимые события. Но когда CREATOR изменяет файл, в OBSERVER не возникает никаких событий. Как ни странно, когда я изменяю файл вручную, OBSERVER видит изменение. Я подумал, что, возможно, CREATOR не освобождает файл, но когда я закрываю CREATOR, OBSERVER все еще не видит изменений.

Есть идеи, что я делаю не так?

Дополнительные сведения: когда СОЗДАТЕЛЬ изменяет файл, я могу удалить его вручную, или когда я открываю файл, я вижу, что все изменения сохранены.

редактировать

моя настройка объекта fileSystemWatcher:

fileSystemWatcherObs.EnableRaisingEvents = true;
fileSystemWatcherObs.Filter = "kbd.dbf";
fileSystemWatcherObs.IncludeSubdirectories = true;
fileSystemWatcherObs.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite | NotifyFilters.Attributes |
    NotifyFilters.CreationTime | NotifyFilters.DirectoryName |NotifyFilters.LastAccess | NotifyFilters.Security |
    NotifyFilters.Size;
fileSystemWatcherObs.Path = "D:\\FOLDER";
fileSystemWatcherObs.SynchronizingObject = this;
fileSystemWatcherObs.Changed += new System.IO.FileSystemEventHandler(  this.fileSystemWatcherObs_Changed );
fileSystemWatcherObs.Created += new System.IO.FileSystemEventHandler( this.fileSystemWatcherObs_Created );
fileSystemWatcherObs.Deleted += new System.IO.FileSystemEventHandler( this.fileSystemWatcherObs_Deleted );
fileSystemWatcherObs.Renamed += new System.IO.RenamedEventHandler( this.fileSystemWatcherObs_Renamed );

и, конечно, метод для этого события


person nirmus    schedule 19.08.2011    source источник
comment
Прочтите это: msmvps.com/ blogs / jon_skeet / archive / 29.08.2010 /   -  person Oded    schedule 19.08.2011
comment
Итак, у вас есть одно приложение, которое изменяет файлы, и вы написали приложение с filesystemwatcher для проверки этих изменений, но оно не замечает, когда ваше приложение-создатель их изменяет? Пожалуйста, разместите соответствующий код из вашего приложения-наблюдателя.   -  person Aerik    schedule 19.08.2011
comment
Да, точно. Я не знаю что делаю не так   -  person nirmus    schedule 19.08.2011
comment
Возможно актуально: blogs.msdn.com/b/oldnewthing /archive/2011/08/12/10195186.aspx. Но я не уверен, объясняет ли это, почему он не видит изменений, даже когда вы закрываете приложение-создатель - я бы подумал, что время изменения, по крайней мере, изменится, когда создатель закроет файл.   -  person Joe White    schedule 20.08.2011
comment
Когда ваше приложение CREATOR изменяет файл, можете ли вы подтвердить его изменения, открыв файл вручную и проверив его, может быть, вы не вызывали Flush() в потоке записи или около того ... Другое дело, почему вы установили все фильтры уведомлений? вам нужно всего несколько из них   -  person Jalal Said    schedule 20.08.2011
comment
Я добавляю все, потому что некоторые не работают. Когда я открываю файл, изменения сохраняются. Так что это не проблема   -  person nirmus    schedule 20.08.2011
comment
Вы установили фильтр FileSystemWatcher на kbd.dbf, что означает, что вы будете смотреть только этот один файл.   -  person adrianbanks    schedule 20.08.2011
comment
Да, я знаю, я хочу посмотреть этот файл   -  person nirmus    schedule 20.08.2011
comment
@nirmus: Вы уверены, что программа-создатель действительно изменяет файл?   -  person adrianbanks    schedule 20.08.2011
comment
Да, я уверен. (Проверял несколько раз ..)   -  person nirmus    schedule 20.08.2011
comment
Когда я установил фильтр на ., тоже ничего не произошло. CREATOR изменил файл, но fileSystemWatcher не заметил этого ..   -  person nirmus    schedule 20.08.2011


Ответы (1)


Вот несколько советов, которые могут вам помочь:

  1. Не имеет значения, внесли ли вы изменения by hand или другое приложение «ВЫ СОЗДАТЕЛЬ», поскольку, когда вы вносите их вручную, вы фактически используете какое-то приложение, такое как «notepad.exe» или что-то в этом роде, так что это не имеет особого значения.
  2. Вы должны установить для EnableRaisingEvent значение true "начать наблюдение" после того, как вы зададите путь и зарегистрируете обработчики событий, поэтому это должно быть последним делом после установки всех конфигураций наблюдателя.
  3. На вашем NotifyFilter настраиваются все фильтры уведомлений, что приведет к тому, что вы будете получать повторяющиеся уведомления несколько раз.
  4. Поскольку вы хотите просматривать только определенную папку, вам не нужно включать подпапки, т.е. fIncludeSubdirectories должно быть ложным.
  5. Почему вы устанавливаете SynchronizingObject на this? Лучше , если вам все равно, - это перейти к new object().
person Jalal Said    schedule 19.08.2011
comment
этот параметр был сгенерирован визуальной студией, когда я установил какое-то свойство by mouse click. Ваши подсказки полезны, но я это знаю. По вашей подсказке не работает после изменения .. - person nirmus; 20.08.2011
comment
Это не имеет значения, вы установили мульти-флаг, который приведет к получению дублированных уведомлений, например: NotifyFilters.LastWrite и NotifyFilters.Attributes будут получать дубликаты уведомлений при изменении файла, одно для последней записи, а другое для атрибутов ... - person Jalal Said; 20.08.2011