FileSystemWatcher не сообщает об изменениях в заблокированном файле

Я наблюдаю за папкой, используя FileSystemWatcher, например:

watcher = new FileSystemWatcher(folder);
watcher.NotifyFilter = NotifyFilters.Size;
watcher.Changed += changedCallback;

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

Однако оказывается, что если я создаю файл в этой папке и задаю для него режим общего доступа FileShare.Read, а затем пишу в него, я не получу никаких уведомлений, пока файл не будет закрыт. Другой обходной путь - открыть файл (например, в блокноте), что, по-видимому, приводит к обновлению его состояния, и тогда мое приложение мониторинга получает уведомление. Еще один обходной путь - это обновление, которое я могу сделать в проводнике Windows, что снова приводит к обновлению состояния файла.

Интересно, что если я смотрю на Windows Explorer во время внесения изменений, я замечаю, что:

Если файл доступен для чтения и записи, его размер будет сразу обновлен в проводнике Windows, как только я его сохраню.Если файл доступен только для чтения, его размер НЕ будет обновляться немедленно в Windows Explorer, если я не обновлю окно вручную.

Таким образом, похоже, что мое приложение для мониторинга использует то же поведение, что и Windows Explorer. Я думал о запуске потока, который будет просто сканировать файлы в папке, но мне интересно, есть ли что-нибудь более элегантное, что можно сделать в этом случае.

Кстати, я использую Win7, и я не уверен, что эта проблема возникает и на других версиях Windows.

Спасибо!

РЕДАКТИРОВАТЬ: Использование ReadDirectoryChanges в C ++ дало мне точно такие же результаты. Реализация темы, о которой я говорил ранее, также не помогла. Мне интересно, что на самом деле делает F5 в проводнике Windows, потому что это приводит к сообщению об изменениях.

Ответы на вопрос(6)

Ваш ответ на вопрос