Я отслеживаю папку с помощью FileSystemWatcher следующим образом:
watcher = new FileSystemWatcher(folder);
watcher.NotifyFilter = NotifyFilters.Size;
watcher.Changed += changedCallback;
Когда я открываю новый файл в блокноте в этой папке и сохраняю его, я получаю уведомление. Если я продолжу писать, а затем я сохраню, я получаю уведомление. Если я закрою файл с его сохранением, я получаю уведомление. Именно то, что я хотел.
Однако выясняется, что если я создам файл в этой папке, и я установил его режим совместного использования в FileShare.Read, а затем напишу ему, я не получу никаких уведомлений, пока файл не будет закрыт. Другим обходным решением является открытие файла (например, в "Блокноте" ), который, по-видимому, заставляет его состояние обновляться, а затем мое приложение для мониторинга получает уведомление. Еще одно обходное решение - это обновление, которое я могу сделать в проводнике Windows, что снова приводит к обновлению состояния файла.
Интересно, если я посмотрю на Проводник Windows, пока я делаю изменения, я замечаю, что:
- Если файл используется для чтения и записи, его размер будет немедленно обновлен в Проводнике Windows, как только я его сохраню.
- Если файл используется только для чтения, его размер НЕ будет обновляться немедленно в проводнике Windows, если я не обновляю вручную окно.
Итак, похоже, что мое приложение мониторинга имеет то же поведение, что и проводник Windows. Я думал о запуске потока, который будет просто сканировать файлы в папке, но мне интересно, есть ли что-нибудь более элегантное в этом случае.
Кстати, я использую Win7, и я не уверен, что эта проблема возникает и в других версиях Windows.
Спасибо!
EDIT: использование ReadDirectoryChanges в С++ принесло мне точные точные результаты. Реализация потока, о котором я говорил раньше, тоже не помогла. Мне интересно, что на самом деле делает F5 в проводнике Windows, потому что это приводит к сообщению об изменении.