Форум: "Начинающим";
Текущий архив: 2017.01.15;
Скачать: [xml.tar.bz2];
ВнизПоиск файлов Найти похожие ветки
← →
MrFeuer (2015-02-08 21:34) [0]Осуществляем поиск файлов через FindFirst("*.*", faAnyFile, sr). При проверке на директорию делаем так: if (sr.Attr and faDirectory) = faDirectory then. Но я не могу понять почему не корректна такая запись: if sr.Attr = faDirectory then? ведь нам нужно только проверять значение поля Attr структуры sr для чего еще и and faDirectory? В справочниках пишут проверку именно (sr.Attr and faDirectory) но почему? зачем проверяется faDirectory=faDirectory...
ПС: проверял в программе без and faDirectory работает действительно не корректно.
← →
MBo © (2015-02-08 21:48) [1]Потому что атрибуты файловой записи - составное поле. В нём включены (установлены в единицу) биты, соответствующие конкретным признакам.
faDirectory = $00000010, т.е. устанавливается 4-й бит.
faReadOnly = $00000001, т.е. устанавливается нулевой бит.
А папка только для чтения имеет атрибут - их комбинацию $00000011.
Это ведь папка? Да.
А будет для неё выполняться sr.Attr = faDirectory? Нет.
Поэтому с помощью битового and выделяется конкретный признак.
← →
Andy BitOff © (2015-02-08 23:03) [2]Что-то программист в нынешнее время пошел какой-то не правильный :-(
← →
Kilkennycat © (2015-02-09 00:39) [3]
> Andy BitOff © (08.02.15 23:03) [2]
это объяснимо. для того, чтобы стать правильным, нужны фундаментальные знания, а приобретение их несколько скучнее, чем, например, чтение небезызвестной и не менее бездарной книги "Делфи глазами хакера". Помимо знаний важно понимание процессов, что также требует больше времени, чем кинуть контрол на форму и как-нить прицепить скопипастенный код.
Однако в данном случае я бы наоборот порадовался: у MrFeuer заработало, но он все равно докапывается до истины, чтобы понять.
← →
Inovet © (2015-02-09 01:10) [4]> [3] Kilkennycat © (09.02.15 00:39)
> Однако в данном случае я бы наоборот порадовался: у MrFeuer
> заработало, но он все равно докапывается до истины, чтобы
> понять.
И после объяснения MBo, думаю, понял или начал изучать тему.
← →
Andy BitOff © (2015-02-09 02:32) [5]Дай бог, дай бог...
← →
Германн © (2015-02-09 02:50) [6]
> И после объяснения MBo, думаю, понял или начал изучать тему.
Возможно начал. Но вряд ли понял .
Вряд ли понял почему в числе $00000010 установлен 4-й бит. :)
← →
MrFeuer (2015-02-09 03:45) [7]
> Andy BitOff ©
А, вы, интересно в какое время были "правильным" программистом? Если вы уже не первый год занимаетесь программированием и знаете все, то лучше по делу ответ написали бы, а не подколы. Я не думаю, что когда вы что-то новое начинаете изучать сразу все знаете и понимаете. Вопрос в теме "для начинающих" поэтому и задан, а не в темах для более продвинутых программистов.
> MBo
Спасибо. Ну теперь вроде бы все прояснилось. Например, если возникнет задача найти только скрытые папки (ну системные скрытые, к примеру, тоже забираем, а вот файлы любые отбрасываем), то:
if (sr.Attr and faDirectory) = faDirectory then
if (sr.Attr and faHidden) = faHidden then begin...end;
правильно??
Аналогично этой записи же?:
if ((sr.Attr and faDirectory) = faDirectory) and ((sr.Attr and faHidden) = faHidden) then begin...end;
И еще вопрос: если ищем только файлы (с любыми атрибутами), отбрасывая папки то:
if (sr.Attr and faDirectory) <> faDirectory then begin...end;
правильно?
> Kilkennycat ©
Изучать делфи я начал несколько дней назад по книге "Библия делфи" (кстати автор тот же, что и книги, о которой вы сказали). До этого имел кое-какие знания в области программирования в турбо паскале на уровне школы (хотя и в институте тоже занимались программированием на паскале, но т.к. программирование это не профильная дисциплина - специальность не программист - то максимальная задача была писать программы для вычисления произведения матриц и тд. В общем дальше циклов и массивов никто не лез и не шибко от школьного уровня далеко ушли). Не знаю насколько хороша книга "Библия делфи", но дочитав до "работы с файлами" я не понял некоторых моментов в этой теме. А лезть дальше не очень хочется, не разобравшись до конца в том, что касается данной темы. То есть, например, вот описание функции findfirst есть, далее описана запись TSearchRec и описание полей, где, например, Attr:integer; // атрибуты найденного файла... и далее листинг программы и для строки (sr.Attr and faDirectory) = faDirectory написано "проверяем папка ли это?" Ну оно то понятно, что проверка папка это или нет, но почему именно такая запись??? Ни какого упоминания о "атрибуты файловой записи - составное поле" и тд. В моем случае задача была просканировать вложенные папки. Когда я писал в условие sr.Attr = faDirectory, то , в принципе, все работало, только сканировались обычные папки, а скрытые нет и в результат выводились только обычные папки, которые без доп.атрибутов (видимо и системные бы тоже пропускались, но просто у меня в каталоге не было системных, а только простые и скрытые). Ну вот я и скопипастил код с книги и заработало с учетом скрытых папок, но я не понял почему так работает, а как изначально я делал - нет.
← →
Kilkennycat © (2015-02-09 03:58) [8]
> "Библия делфи"
популярный вариант. к сожалению.
я рекомендую это:
https://www.google.ru/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#newwindow=1&safe=off&q=%D1%82%D0%B5%D0%B9%D0%BA%D1%81%D0%B5%D0%B9%D1%80%D0%B0+%D0%B8+%D0%BF%D0%B0%D1%87%D0%B5%D0%BA%D0%BE&spell=1
← →
MrFeuer (2015-02-09 04:00) [9]
> Германн ©
> Вряд ли понял почему в числе $00000010 установлен 4-й бит.
Весело =) Если я не знаю о тонкостях работы какой-то функции делфи, не значит, что я не могу преобразовать 16-ричное число в 2-ичное или сделать побитовое И.... Да даже если бы и не знал, для того книги, сайты, форумы и есть, чтоб учиться.
← →
Германн © (2015-02-09 04:05) [10]
> if (sr.Attr and faDirectory) = faDirectory then
> if (sr.Attr and faHidden) = faHidden then begin...end;
> правильно?
Правильно. Но это смотря что ищем.
> Аналогично этой записи же?:
> if ((sr.Attr and faDirectory) = faDirectory) and ((sr.Attr
> and faHidden) = faHidden) then begin...end;
Не совсем. Первый вариант проверки условий подразумевает возможность трех вариантов. А второй только двух.
← →
Andy BitOff © (2015-02-09 04:12) [11]
> MrFeuer (09.02.15 03:45) [7]
Сорри, конечно, что я в начинающих так это выразился, просто есть тут у нас личности...
А по теме, вам в первом посте Борис все верно обрисовал. И указав на то, что атрибут является конкатенацией флагов, полностью ответил на ваш вопрос. Дальнейшее сводится только к булевой алгебре, которую вам должны были давать даже в школе.
← →
MrFeuer (2015-02-09 04:45) [12]
> Andy BitOff © (09.02.15 04:12) [11]
"Личности" везде есть всякие.... =)
> ...что атрибут является конкатенацией флагов...
Немного замудрено написано, но хотя бы так в книге написали, по которой учусь - уже бы навело на мысль... Ну а MBo все разжевал конечно подробно.
← →
MBo © (2015-02-09 07:43) [13]По битовой логике (и здесь же по организации поиска с помощью Find***) ещё вот стоит почитать:
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=838
← →
MrFeuer (2015-02-09 13:29) [14]
> MBo © (09.02.15 07:43) [13]
Спасибо за ссылку. Вот это: "...Здесь является битовой маской, описанной в модуле SysUtils, ее значение равно $3F, она предназначена для включения в поиск специальных файлов и одновременно для изоляции лишних бит из структуры TsearchRec, отдельные биты данной маски описаны как именованные константы..." И ниже табличка со всеми константами и значениями.
Как раз все и объясняет. По сути то же самое, что и вы мне написали в 1 посте - только еще более подробно. Ну и вся битовая логика разобрана, хотя по ней у меня не было затруднений, но вот все что по find*** очень даже в тему.
В общем всем спасибо за ответы, все ясно.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2017.01.15;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.053 c