FileSystemWatcher.Changed срабатывает немедленно, когда Excel 2007 открывает файл XLS в режиме совместимости. - PullRequest
3 голосов
/ 08 марта 2010

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

У нас есть проблема с файлами XLS в Excel 2007 (не проверено, что проблема не существует в 2003 году, но это только файлы, которые открываются в режиме совместимости в 2007 году), когда событие Changed срабатывает сразу после открытия файл, а затем еще раз при закрытии файла, даже если ничего не изменилось, или пользователь решает не сохранять при закрытии. Такое же поведение не существует при открытии файлов XLSX.

Я написал тестовое приложение для проверки поведения, которое вы можете найти по адресу (http://www.just2guys.net/SOFiles/FSWExcel.zip).. В приложении есть один FileSystemWatcher для каждого типа NotifyFilter, так что очевидно почему Измененное событие сработало.

Каким образом вы можете предложить пользователю только когда документ действительно каким-то образом сохранен пользователем? Я могу начать мониторинг файла после вызова Process.Start, что позволяет мне пропустить сообщение при открытии документа, но я все равно получаю его при закрытии документа, даже когда ничего не изменилось.

Ответы [ 3 ]

3 голосов
/ 08 марта 2010

Я заметил это в Word, и вы можете просто воспроизвести его:

Если вы откроете файл .doc или .xls в приложении Office, отметка времени изменится на время открытия документа.

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

Таким образом, для файлов Office вам потребуется две дополнительные проверки:

  • при открытии, когда отметка времени установлена ​​на текущее время, проверьте, что файл может быть открыт исключительно

  • при закрытии, проверьте, является ли отметка времени «близкой к»текущую дату и время или проверьте флажок архива файла

1 голос
/ 08 марта 2010

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

Мы смогли обойти это, либо удалив его вместо шаблона цикла ожидания, добавив статическую задержку (Thread.Sleep) перед выполнением действия, либо комбинируя оба (получение события, порождение потока и зацикливание в потоке, пока вы не подумаете, что ничего не обновляет его, проверив дату / время последнего мода).

0 голосов
/ 08 марта 2010

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

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