![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
m6a6g6 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 13.8.2009 Где: Волгоград Репутация: нет Всего: нет |
Привет всем.
В общем решил написать программу-поисковик, которая бы искала файлы на компьютере пользователя. Написал работающий алгоритм, но вот когда стал пытаться организовать поиск с заданными атрибутами, то столкнулся с ошибкой "неадекватности" их определения. Использую функции FindFirst и FindNext, они работают со следующими атрибутами:
Вся фишка в том, что эти атрибуты могут применяться совместно, то есть складываться, например, файл с атрибутами "только для четения" и "скрытый" имеет атрибут 1+2=3. Такая ситуация сильно запутывает, а касательно папок, то тут вообще скрытые игнорируются. Кто использовал эти функции может как-то смог это "обойти"? |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
m6a6g6 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 13.8.2009 Где: Волгоград Репутация: нет Всего: нет |
Видимо с этим ничего не поделать? Или все же может поддаться логике? У меня было что выдавло атрибут в 8122 это вообще не поддается объяснению. |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Я, если честно, вообще не понял, что вы спросили - дал ссылку в тему, в надежде, что вы сами разберётесь.
Если возникли проблемы - попробуйте переформулировать свой вопрос. Потому что в вашей вопросе без миелофона сейчас не разобраться. Скажите чётко, что дано (напр.: "такой-то набор файлов"), что вы делаете (покажите код), что ожидаете ("найдёт/подсчитает то-то и сё-то"), что получаете ("а он находит вотто и вот это"). Тогда вам подскажут, как получить X. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
без вашего кода , ответы бессмыслены -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
WandG |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 17.11.2008 Репутация: нет Всего: 1 |
Кажется, на каком-то форуме писали, что большие значения атрибутов получаеются, например, если файл шифрованный или сжатый. |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Ну, вообще-то поле Attr - это точная копия TWin32FindData.dwFileAttributes, т.е. комбинация флагов:
(право же: это нетрудно увидеть самому). -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
m6a6g6 |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 13.8.2009 Где: Волгоград Репутация: нет Всего: нет |
Ладно, постараюсь получше объяснить. Приведу код.
Собственно есть у этого алгоритма один большой минус: при такой проверке:
игнорируются скрытые папки, так как имеют атрибут отличный от faDirectory (от 10). И второе, при запуске поиска по всем дискам компьютера, находит не все файлы, которые по идее надо найти. Допустим я заранее знаю что у меня на диске лежит файл только для чтения, а прога его не находит. Поразмышляв, мне стало понятно что конечный (после сложения) атрибут имеет совсем другое число, и понять из всех атрибутов является ли он скрытым или только для чтения очень трудно, это можно сделать только если файл имеет единичный атрибут (легко проверить в условии). Может кто-нибудь наведет на мысль как улучшить алгоритм... |
||||
|
|||||
CodeMonkey |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Вы ошиблись. Вы видите что-то другое. Вот пример:
Он выводит:
Добавлено через 3 минуты и 12 секунд Вопрос: вы не под Vista работаете? Быть может, у вас проблемы с виртуализацией? Это сообщение отредактировал(а) CodeMonkey - 18.8.2009, 11:27 -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
||||
|
|||||
m6a6g6 |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 13.8.2009 Где: Волгоград Репутация: нет Всего: нет |
Да, так и есть, забыл про это написать ![]() Решил тоже выполнить Ваш код. Вот результат:
При чем компилятор ругался на:
Сейчас добавил пару строк чтобы просматривать атрибуты всех файлов, так вот в "проблемной папке" лежит файл у которого все атрибуты сняты (ну я в его свойствах галочки снял), в моей программе атрибут возвращаемый числом равен 8192, а функция FormatAttrs возвращает пустую скобку (). Этот загадочный файл простой фильм .avi. Добавленная строка:
Это сообщение отредактировал(а) m6a6g6 - 18.8.2009, 13:53 |
||||||
|
|||||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
В таком случае, проверьте, что в вашей программе есть Вистовский манифест. Это обычно актуально для старых Delphi (до 2007-й). Подключение манифеста - обычно самый простой способ отключить костыли для старых программ. Только учтите, что ваша программа при этом действительно должна быть совместима с Вистой. Т.е. если раньше вы могли делать такие плохие вещи, как запись в Program Files, то теперь, с манифестом и отключенными костылями, вам это уже не удастся. Настоятельно не рекомендую отключать UAC для тестов. Добавлено через 2 минуты и 33 секунды Ну, чисто для теста, можете ничего не менять: запустите программу и стартаните поиск. Посмотрите, сколько нашла. Потом в Диспетчере Задач переключите виртуализацию для своего процесса и повторите поиск. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
m6a6g6 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 13.8.2009 Где: Волгоград Репутация: нет Всего: нет |
Хорошо, сейчас попробую. Использую Delphi 7, UAC отключен.
Пункт меню Виртуализация в диспетчере задач для моего процесса недоступен... Это сообщение отредактировал(а) m6a6g6 - 18.8.2009, 14:04 |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Наверное, она всё же должна возвращать '(NotIndexed)'? Добавлено через 3 минуты и 30 секунд
Тогда добавляйте манифест. У меня сейчас под рукой нет Висты, чтобы поиграться. Ссылки в тему: UAC для разработчика Delphi. User Account Control. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
m6a6g6 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 13.8.2009 Где: Волгоград Репутация: нет Всего: нет |
Ну я вообще в полном замешательстве.
Запустил программу от имени администратора, так процесс поиска прервался с ошибкой Access violation at address ..., хотя под Delphi все нормально было ![]() А разве эти функции восприимчивы к уровню привилегий? |
|||
|
||||
CodeMonkey |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Вы по ссылкам вообще ходите? Я их не просто так даю.
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |