Наблюдатель за файловой системой никогда не сообщает точное имя файла
изменилось. Например, для файла abc.doc, он сообщает "~ $ abc.doc is
изменено "при первом сохранении.
Причиной этого является то, что Word создает несколько временных файлов в текущем каталоге, в котором открыт исходный файл, и событие FileChanged вызывается также при создании нового файла. Фактически, FileSystemWatcher запускает FileCreated, за которым следует событие FileChanged. Поскольку вы не подписаны на FileCreated, вы видите только уведомление FileChanged.
Для всех последующих сохранений в этом файле событие OnChanged в
следующий код не называется. Когда я изменил фильтр на
watcher.Filter = ".", я обнаружил, что для последующих сохранений, он сообщает
"~ WRL0001.tmp изменен".
То же, что и выше.
Но мне было любопытно узнать о вашей проблеме, и я немного изменил вашу программу и изменил ее следующим образом (разместив только соответствующие строки):
watcher.NotifyFilter = NotifyFilters.Attributes;
watcher.Filter = "*.doc";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
А потом я увидел фактическое имя изменяемого файла, напечатанное на консоли при сохранении файла. Когда я посмотрел, какие атрибуты изменились в исходном документе от одного сохранения к следующему, я заметил, что номер редакции увеличивается на 1 (я знаю, номер редакции не является атрибутом файла с точки зрения ОС). Я уверен, что другие атрибуты - из-за отсутствия лучшего слова - изменились. Это зависит от вас, если вы хотите установить NotificationFilter
на NotifyFilters.Attributes;
, чтобы сделать эту работу, но определенно странно, что это не сработает, например, с NotificationFilter =NotifyFilters.Size | NotifyFilters.LastWrite;
.