Я должен генерировать событие, когда файл закрывается другим приложением.
К сожалению, ReadDirectoryChangesW не сообщает о близком событии. Для меня было бы возможно опросить (с TTimer) любой файл который сообщаемый ReadDirectoryChangesW, как изменено, ожидая его, чтобы быть закрытым (использование CreateFile для обнаружения этого).
Однако то, что я предпочел бы, является абсолютно управляемым событиями решением.
Существует ли способ сцепить системные вызовы и обнаружить весь файл заключительные события? Я просто хочу знать путь и название любого файла, который был просто закрыт.
В одном только Delphi нет хорошего простого решения вашей проблемы - реальное решение - написать драйвер фильтра для отслеживания событий закрытия файлов.
Вам стоит взглянуть на Матиаса Рауэнса madCodeHook :
madCodeHook предлагает все, что вам нужно для подключения кода (в основном API) во всех 32 и 64-битных операционных системах Windows от Windows 95 до Windows 7. Вы можете выбрать, хотите ли вы подключать API в ваш собственный процесс, или в конкретном целевом процессе, или в масштабе всей системы.
Внутри Библиотеки кодов джедаев (JCL) у вас есть компонент под названием «TJvChangeNotify», из которого вы можете получить уведомление при обнаружении изменения в отслеживаемом каталоге :
Другие вещи, которые он может делать:
И, что лучше всего, он выполняет поиск внутри папки с подкаталогами, если хотите. {{ 1}} Вот ссылка на (часть) файла справки для этого компонента: http://help.delphi-jedi.org/item.php?Id=172982
Надеюсь на это помогу.
Если уведомления об изменениях не работают, вы можете использовать очень грубый и неубедительный метод: опрос. Каждую секунду или около того пытайтесь открыть файл с несовместимыми параметрами общего доступа. В тот момент, когда это удается, вы знаете, что другое приложение закрыло его.
Не самый чистый вариант, но он будет работать. Это вариант только в том случае, если вам нужно отслеживать ограниченное количество файлов, и их имена известны заранее.
Если вы выберете маршрут драйвера фильтра, у Eldos будет компонент CallbackFilter: