Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.01.15;
Скачать: CL | DM;

Вниз

Поиск файлов   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.022 c
15-1455465762
pavelnk
2016-02-14 19:02
2017.01.15
С праздником!


2-1431020136
Zheksonz
2015-05-07 20:35
2017.01.15
Можно ли в поля Blob Graphic загружать jpg файлы?


15-1455399002
Юрий
2016-02-14 00:30
2017.01.15
С днем рождения ! 14 февраля 2016 воскресенье


15-1456003937
Юрий
2016-02-21 00:32
2017.01.15
С днем рождения ! 21 февраля 2016 воскресенье


15-1435899159
Any
2015-07-03 07:52
2017.01.15
Где найти фрилансеров