Рекурсия [Юрий Карпов] (fb2) читать постранично, страница - 3
[Настройки текста] [Cбросить фильтры]
Скопируй сей текст в какой либо файл и давай на него посмотрим.
|go| Готово. У матросов есть вопросов. Я понял, почему ты переназвал функцию ScanEmtyDir, но почему наименование счетчика сменилось на Ccount
|t_| Сменил, чтобы не было конфликта имен с списком CheckListBox1, тут я немного схалтурил, рекомендуется давать осмысленные имена, ну бывает, поленился.
|go| Я не понял эти строки: { 54 } with Form1.CheckListBox1 do { 55 } Checked[Items.Add(Target+'\'+ SR.Name)] := true;
|t_| Это можно было бы написать более подробно (и более понятно)
var n : integer; // номер строки в списке ... n := Form1.CheckListBox1. Items.Add(Target+'\'+ SR.Name); Form1.CheckListBox1.Checked[n] := true;
Но мне не хотелось вводить совершенно лишнюю переменную.
|go| Хорошо, а что это за загадочные точки в строках 43 и 44 { 43 } if (SR.Name <> '.') { 44 } and (SR.Name <> '..')
|t_| Это особенности операционной системы, две точки это обращение к родительской папке, а одна это обращение к текущей папке. Давай сделаем маленький эксперимент. В любой папке создай текстовый файл. Скопируй в него следующий текст
rem начало кода cd .. dir pause rem конец кода
сохрани изменения. теперь переименуй файл, ну например proba.bat Вся соль тут в расширении. Запусти файл на исполнение. В окошке с заголовком cmd.exe ты увидишь распечатку содержимого родительского (для текущего каталога) каталога { кстати, обрати внимание я сразу сбился на досовскую терминологию, напомню, каталог это папка } И вот смотри, вверху, те самые точки. Т.е. операционная система при поиске всегда выдает ссылки на текущую и родительские папки, но нам они абсолютно не нужны и посему мы исключаем их из рассмотрения. Do you understand?
|go|Oh! Yes, yes! А как насчет строчки 49 { 49 } if ((SR.Attr and $10) = $10 ) then
|t_| Ты возможно заметил что в предыдущей строке комментария, дается расшифровка этой строки { 48 } // если это папка Но все таки давай разберемся подробнее. Во первых, открою тебе великую тайну. Папка (folder, каталог, директорий) на самом деле это файл. Да, это просто файл, и отличается он от других только атрибутом. Вот теперь мы добрались до атрибутов. Вызови help на слове TsearchRec и ты увидишь(кроме всего прочего) : faReadOnly $00000001 Read-only files faHidden $00000002 Hidden files faSysFile $00000004 System files faVolumeID $00000008 Volume ID files faDirectory $00000010 Directory files faArchive $00000020 Archive files faAnyFile $0000003F Any file Нас интересует faDirectory но у папки могут быть установлены и другие атрибуты, а устанавливаются они сложением соответствующих значений. Значит для определения, что рассматриваемый файл является папкой сказать if SR.Attr = $10 будет неправильно, т.к. $11, $12, $13, $14, $15 ... - это тоже папки. Поэтому лучше сначала обрезать значение с помощью & В результате операции SR.Attr and $10 останется или 0 или $10, и это мы проконтролируем.
|go| Чёто сложновато.
|t_| Ну, я тут немножко повыёживался, не очень подробно объясняю. Но, я хотел подвести к морали: программист должен очень много знать. В том числе работу операционной системы, и, а это святое - алгебру логики.
|go| Намек понял, не дурак. Надо подучить.
|t_| Ну, что ж, давай на этой оптимистичной ноте, заканчивать сегодняшнее занятие. Сегодня мы сделали полезную, но, не очень необходимую утилитку. В следующий раз мы будем продолжать тему "Рекурсия", я предлагаю сделать программку имитирующую windows Поиск, но с бОльшими возможностями: Поиск регулярных выражений Поиск в найденном Сохранение и Загрузка списка найденных файлов See you later.
|go| До связи.
Последние комментарии
1 день 8 часов назад
1 день 12 часов назад
1 день 15 часов назад
1 день 17 часов назад
1 день 22 часов назад
1 день 22 часов назад