Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.05 c
2-1426067911
aka
2015-03-11 12:58
2017.01.15
TObject через ссылку


15-1449950981
@!!ex
2015-12-12 23:09
2017.01.15
Как получить обратную матрица?


15-1445860992
DayGaykin
2015-10-26 15:03
2017.01.15
PHP и Java для Web


15-1455139804
Юрий
2016-02-11 00:30
2017.01.15
С днем рождения ! 11 февраля 2016 четверг


15-1454880601
Юрий
2016-02-08 00:30
2017.01.15
С днем рождения ! 8 февраля 2016 понедельник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский