|
Модераторы: Poseidon, Snowy, bems, MetalFan |
|
Гость_Борис |
|
|||
Unregistered |
Требуется, чтобы программа получала уведомления о изменениях в файловой системе. Каким способом это можно реализовать?
|
|||
|
||||
Pakshin A. S. |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 5056 Регистрация: 16.2.2003 Репутация: 21 Всего: 61 |
Ох... интересная тема! Когда-то поднимал эту тему, поищи, если не лень.
|
|||
|
||||
Slawanix |
|
||||
Бывалый Профиль Группа: Участник Сообщений: 177 Регистрация: 29.7.2004 Где: г. Великие Луки Репутация: нет Всего: 1 |
Попробуй так (при условии, что ты умеешь обращаться с потоками TThread).
Для организации мониторинга файловой системы нужно использовать три функции — FindFirstChangeNotification, FindNextChangeNotification И FindcioseChangeNotification. Первая из них возвращает дескриптор объекта файлового оповещения, который можно передать в функцию ожидания. Объект активизируется тогда, когда в заданной папке произошли те или иные изменения (создание или уничтожение файла или папки, изменение прав доступа и т. д.). Вторая — готовит объект к реакции на следующее изменение. Наконец, с помощью третьей функции следует закрыть ставший ненужным объект. Так может выглядеть код метода Execute потока, созданного для мониторинга:
На главной форме должны находиться компоненты, нужные для выбора обследуемой папки, а также компонент TListBox, в который будут записываться имена файлов:
Приложение готово. Чтобы оно стало полнофункциональным, предусмотрите в нем механизм перезапуска потока при изменении обследуемой папки. --------------------
моск кипит |
||||
|
|||||
Illusion Dolphin |
|
||||||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Я с этим намучался сполна и теперь скажу своё слово...
Метод, предложенный Slawanix имеет один ооочень существенный недостаток в случае, если пишется не просто список plug-in'ов, который будет обонвляться при записи нового plug-in'а, а если, как в моём случае, пишется достаточно полноценный проводник. Тогда нелепо из-за переименовании одного файла перегружать все файлы, т.к. это очень медленно. В этом случае известно не только что что-то изменилось, а что именно изменилось. В своей форма нужно определить процедуру с параметрами как у TNotifyDirectoryChangeW и при вызове нити вызывать её в параметрах. В самой процедуре обрабатывать те данные, которые пришли из потока. При удалении, создании, изменении выдаётся одно имя файла. При переименовании сначала идёт старое имя, потом новое. Я это делал так (там можно некоторое выкинуть, я долго мудрил со всем этим...): Некоторый необходимые типы:
и сам код потока:
В самой форме где-то так:
Если что-то непонятно или я не всё дал (это вырезка из огромного исходника) или дал лишнее - спрашивайте, поправлюсь. Добавлено @ 11:52 Да, ещё о параметре SID, который у меня объявлен. В самой форме необходимо сделать строковую константу, куда заноситьслучайную строку (с достаточной степенью уникальности) и при изменении текущей директории менять эту строковую константу, а в нить кидать указатель на эту строку. -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
||||||
|
|||||||
Slawanix |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 177 Регистрация: 29.7.2004 Где: г. Великие Луки Репутация: нет Всего: 1 |
Привет, Illusion Dolphin, просто этот метод был призван более-менее продемонстрировать работу функций, и конечно, полноценной ее не назовешь. С уважением, Slawanix. --------------------
моск кипит |
|||
|
||||
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |