Следите за папкой для чтения файлов - PullRequest
6 голосов
/ 05 февраля 2011

Я пытаюсь просмотреть файлы в каталоге, чтобы определить, когда файлы открыты / доступны. Я думал, что FileSystemWatcher справится, используя событие Changed.

Проблема в том, что некоторые приложения не создают блокировку для открываемого / доступного файла или изменяют либо дату изменения, либо дату обращения (даже после fsutil behavior set disablelastaccess 0). Блокнот для примера. Очевидно, он делает копию файла в памяти и воспроизводит его там, пока вы его не сохраните. Также не обновляется Дата Доступа.

Как я могу отслеживать каталог файлов и получать уведомления, когда файл просто открывается / доступен любой программой (например, Блокнотом)? Файлы могут быть открыты с другого компьютера, необязательно на работающем компьютере «наблюдатель».

Я нашел много похожих вопросов, но не увидел ни одного, который фокусировался на «доступе» к файлу.

1 Ответ

2 голосов
/ 05 февраля 2011

Это вполне нормально. Обновление существующего файла довольно опасно, поскольку может привести к безвозвратной потере данных. Ошибка диска (например, переполнение диска) во время записи - очень плохие новости. Используемый общий алгоритм:

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

Очевидно, что это не вызывает событие Changed, файл не был изменен.


Извините, я недостаточно хорошо прочитал вопрос. Нет никакого уведомления для приложения, просто открывающего файл для чтения. FSW может обнаруживать только изменения в файловой системе. Также не существует готовой альтернативы, для этого требуется специальный драйвер фильтра файловой системы, который отслеживает запросы драйверов. Как тот, который использует утилита SysInternals ProcMon. Я не знаю о таком драйвере, готовом для использования в программе на C #, вы также не можете написать его на C #. Это просто не распространенное требование.

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