| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Получение уведомления о изменениях |
| Автор: Гость_Борис 25.8.2004, 14:54 |
| Требуется, чтобы программа получала уведомления о изменениях в файловой системе. Каким способом это можно реализовать? |
| Автор: Pakshin A. S. 25.8.2004, 22:19 |
| Ох... интересная тема! Когда-то поднимал эту тему, поищи, если не лень. |
| Автор: Slawanix 27.8.2004, 22:22 | ||||
| Попробуй так (при условии, что ты умеешь обращаться с потоками TThread). Для организации мониторинга файловой системы нужно использовать три функции — FindFirstChangeNotification, FindNextChangeNotification И FindcioseChangeNotification. Первая из них возвращает дескриптор объекта файлового оповещения, который можно передать в функцию ожидания. Объект активизируется тогда, когда в заданной папке произошли те или иные изменения (создание или уничтожение файла или папки, изменение прав доступа и т. д.). Вторая — готовит объект к реакции на следующее изменение. Наконец, с помощью третьей функции следует закрыть ставший ненужным объект. Так может выглядеть код метода Execute потока, созданного для мониторинга:
На главной форме должны находиться компоненты, нужные для выбора обследуемой папки, а также компонент TListBox, в который будут записываться имена файлов:
Приложение готово. Чтобы оно стало полнофункциональным, предусмотрите в нем механизм перезапуска потока при изменении обследуемой папки. |
| Автор: Illusion Dolphin 29.8.2004, 11:49 | ||||||
| Я с этим намучался сполна и теперь скажу своё слово... Метод, предложенный Slawanix имеет один ооочень существенный недостаток в случае, если пишется не просто список plug-in'ов, который будет обонвляться при записи нового plug-in'а, а если, как в моём случае, пишется достаточно полноценный проводник. Тогда нелепо из-за переименовании одного файла перегружать все файлы, т.к. это очень медленно. В этом случае известно не только что что-то изменилось, а что именно изменилось. В своей форма нужно определить процедуру с параметрами как у TNotifyDirectoryChangeW и при вызове нити вызывать её в параметрах. В самой процедуре обрабатывать те данные, которые пришли из потока. При удалении, создании, изменении выдаётся одно имя файла. При переименовании сначала идёт старое имя, потом новое. Я это делал так (там можно некоторое выкинуть, я долго мудрил со всем этим...): Некоторый необходимые типы:
и сам код потока:
В самой форме где-то так:
Если что-то непонятно или я не всё дал (это вырезка из огромного исходника) или дал лишнее - спрашивайте, поправлюсь. Добавлено @ 11:52 Да, ещё о параметре SID, который у меня объявлен. В самой форме необходимо сделать строковую константу, куда заноситьслучайную строку (с достаточной степенью уникальности) и при изменении текущей директории менять эту строковую константу, а в нить кидать указатель на эту строку. |
| Автор: Slawanix 29.8.2004, 14:13 | ||
Привет, Illusion Dolphin, просто этот метод был призван более-менее продемонстрировать работу функций, и конечно, полноценной ее не назовешь. С уважением, Slawanix. |