Мониторинг файлов, похожих на System Internal /Microsoft FileMon/Process Monitor
Мне нужно создать событие, когда файл закрывается другим приложением.
К сожалению, ReadDirectoryChangesW не сообщает о закрытии события. Для меня было бы возможно опрашивать (с TTimer) любой файл, который сообщал ReadDirectoryChangesW как измененный, ожидая его закрытия (используя CreateFile, чтобы обнаружить это).
Тем не менее, я бы предпочел полностью управляемое событиями решение.
Есть ли способ перехватить системные вызовы и обнаружить все события закрытия файла? Я просто хочу знать путь и имя любого файла, который был только что закрыт.
5 ответов
В одной только Delphi нет хорошего простого решения вашей проблемы - реальное решение - написать драйвер фильтра для мониторинга событий закрытия файлов.
Вы должны взглянуть на Mathias Rauens madCodeHook:
madCodeHook предлагает все, что вам нужно для перехвата кода (в основном API) во всех 32- и 64-битных операционных системах Windows, от Windows 95 до Windows 7. Вы можете выбрать, хотите ли вы перехватывать API-интерфейсы в своем собственном процессе, или в конкретном целевом процессе, или общесистемный.
Если вы решите пойти по маршруту драйвера фильтра, Eldos имеет компонент CallbackFilter:
Если уведомления об изменениях не работают, вы можете использовать очень грубый и неубедительный метод: опрос. Каждую секунду или около того, попробуйте открыть файл с некоторыми несовместимыми параметрами обмена. В тот момент, когда это удается, вы знаете, что другое приложение закрыло его.
Не самый чистый вариант на сегодняшний день, но он будет работать. Это только вариант, если вам нужно контролировать ограниченное количество файлов и их имена известны заранее.
Внутри Jedi Code LIbrary (JCL) у вас есть компонент с именем 'TJvChangeNotify', где вы можете получать уведомления при обнаружении изменений в отслеживаемом каталоге:
- Изменено "Last write" => Так что, похоже, именно то, что вы хотели сделать!
Другие вещи, которые он может сделать:
- Изменен размер файла
- Изменено имя файла...
И, что лучше всего, он ищет внутри папки с подкаталогами, если хотите. Вот ссылка на (часть) справочный файл для этого компонента: http://help.delphi-jedi.org/item.php?Id=172982
Надеюсь, это поможет.