Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Общие вопросы > Атрибуты поиска |
Автор: m6a6g6 17.8.2009, 14:28 | ||
Привет всем. В общем решил написать программу-поисковик, которая бы искала файлы на компьютере пользователя. Написал работающий алгоритм, но вот когда стал пытаться организовать поиск с заданными атрибутами, то столкнулся с ошибкой "неадекватности" их определения. Использую функции FindFirst и FindNext, они работают со следующими атрибутами:
Вся фишка в том, что эти атрибуты могут применяться совместно, то есть складываться, например, файл с атрибутами "только для четения" и "скрытый" имеет атрибут 1+2=3. Такая ситуация сильно запутывает, а касательно папок, то тут вообще скрытые игнорируются. Кто использовал эти функции может как-то смог это "обойти"? |
Автор: CodeMonkey 17.8.2009, 15:00 |
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=61608. |
Автор: m6a6g6 17.8.2009, 15:17 | ||
Видимо с этим ничего не поделать? Или все же может поддаться логике? У меня было что выдавло атрибут в 8122 это вообще не поддается объяснению. |
Автор: CodeMonkey 17.8.2009, 15:50 |
Я, если честно, вообще не понял, что вы спросили - дал ссылку в тему, в надежде, что вы сами разберётесь. Если возникли проблемы - попробуйте переформулировать свой вопрос. Потому что в вашей вопросе без миелофона сейчас не разобраться. Скажите чётко, что дано (напр.: "такой-то набор файлов"), что вы делаете (покажите код), что ожидаете ("найдёт/подсчитает то-то и сё-то"), что получаете ("а он находит вотто и вот это"). Тогда вам подскажут, http://gunsmoker.blogspot.com/2008/10/x-y-z.html. |
Автор: Romikgy 17.8.2009, 15:51 |
без вашего кода , ответы бессмыслены |
Автор: WandG 17.8.2009, 16:06 | ||
Кажется, на каком-то форуме писали, что большие значения атрибутов получаеются, например, если файл шифрованный или сжатый. |
Автор: CodeMonkey 17.8.2009, 16:55 | ||
Ну, вообще-то поле Attr - это точная копия TWin32FindData.dwFileAttributes, т.е. комбинация флагов:
(право же: это нетрудно увидеть самому). |
Автор: m6a6g6 18.8.2009, 11:08 | ||||
Ладно, постараюсь получше объяснить. Приведу код.
Собственно есть у этого алгоритма один большой минус: при такой проверке:
игнорируются скрытые папки, так как имеют атрибут отличный от faDirectory (от 10). И второе, при запуске поиска по всем дискам компьютера, находит не все файлы, которые по идее надо найти. Допустим я заранее знаю что у меня на диске лежит файл только для чтения, а прога его не находит. Поразмышляв, мне стало понятно что конечный (после сложения) атрибут имеет совсем другое число, и понять из всех атрибутов является ли он скрытым или только для чтения очень трудно, это можно сделать только если файл имеет единичный атрибут (легко проверить в условии). Может кто-нибудь наведет на мысль как улучшить алгоритм... |
Автор: m6a6g6 18.8.2009, 12:59 | ||||||
Да, так и есть, забыл про это написать ![]() Решил тоже выполнить Ваш код. Вот результат:
При чем компилятор ругался на:
Сейчас добавил пару строк чтобы просматривать атрибуты всех файлов, так вот в "проблемной папке" лежит файл у которого все атрибуты сняты (ну я в его свойствах галочки снял), в моей программе атрибут возвращаемый числом равен 8192, а функция FormatAttrs возвращает пустую скобку (). Этот загадочный файл простой фильм .avi. Добавленная строка:
|
Автор: CodeMonkey 18.8.2009, 13:37 |
В таком случае, проверьте, что в вашей программе есть Вистовский манифест. Это обычно актуально для старых Delphi (до 2007-й). Подключение манифеста - обычно самый простой способ отключить костыли для старых программ. Только учтите, что ваша программа при этом действительно должна быть совместима с Вистой. Т.е. если раньше вы могли делать такие плохие вещи, как запись в Program Files, то теперь, с манифестом и отключенными костылями, вам это уже не удастся. Настоятельно не рекомендую отключать UAC для тестов. Добавлено через 2 минуты и 33 секунды Ну, чисто для теста, можете ничего не менять: запустите программу и стартаните поиск. Посмотрите, сколько нашла. Потом в Диспетчере Задач переключите виртуализацию для своего процесса и повторите поиск. |
Автор: m6a6g6 18.8.2009, 13:59 |
Хорошо, сейчас попробую. Использую Delphi 7, UAC отключен. Пункт меню Виртуализация в диспетчере задач для моего процесса недоступен... |
Автор: CodeMonkey 18.8.2009, 14:21 | ||
Наверное, она всё же должна возвращать '(NotIndexed)'? Добавлено через 3 минуты и 30 секунд
Тогда добавляйте манифест. У меня сейчас под рукой нет Висты, чтобы поиграться. Ссылки в тему: http://deldev.blogspot.com/2009/05/uac-dlja-razrabotchika-2.html. http://blogs.msdn.com/uac/archive/2006/02/22/537129.aspx. |
Автор: m6a6g6 19.8.2009, 17:43 |
Ну я вообще в полном замешательстве. Запустил программу от имени администратора, так процесс поиска прервался с ошибкой Access violation at address ..., хотя под Delphi все нормально было ![]() А разве эти функции восприимчивы к уровню привилегий? |
Автор: CodeMonkey 21.8.2009, 11:19 | ||
Вы по ссылкам вообще ходите? Я их не просто так даю.
|