Юрий Карпов - Рекурсия

Здесь есть возможность читать онлайн «Юрий Карпов - Рекурсия» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Рекурсия: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Рекурсия»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Книга предназначена студенту, писавшему программы только в качестве курсовых, "сдавшему" Delphi и несмотря на это, желающему стать программистом. Это, не сборник готовых рецептов, автор хочет поставить читателя в условия максимально приближенные к рабочим. Мы вместе напишем программу, пройдя через ошибки, и сомнения к окончательной победе...

Рекурсия — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Рекурсия», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

{ 59 } Found := FindNext(SR);

{ 60 } END;{DosError = 0}

{ 61 } FindClose(SR);

{ 62 } end;

{ 63 }

{ 64 } procedure TForm1.Button1Click(Sender: TObject);

{ 65 } begin

{ 66 } if SelectDirectory(Dir, [sdAllowCreate, sdPerformCreate, sdPrompt],0)

{ 67 } then

{ 68 } begin

{ 69 } if Dir[length(Dir)]='\'

{ 70 } then delete(Dir, length(Dir),1);

{ 71 } CheckListBox1.Items.Clear;

{ 72 } ScanEmtyDir(Dir);

{ 73 } Label1.Caption := 'Найдено '+ IntToStr(CheckListBox1.Items.Count)

{ 74 } +' пустых папок.';

{ 75 } end;

{ 76 } end;

{ 77 }

{ 78 } procedure TForm1.FormCreate(Sender: TObject);

{ 79 } begin

{ 80 } Path := ExtractFileDir(ParamStr(0)) + '\';

{ 81 } Dir := Path;

{ 82 } end;

{ 83 }

{ 84 } procedure TForm1.Button2Click(Sender: TObject);

{ 85 } var

{ 86 } i : integer;

{ 87 } begin

{ 88 } CCount := 0;

{ 89 } with Form1.CheckListBox1 do

{ 90 } begin

{ 91 } for i := Items.Count - 1 downto 0 do

{ 92 } if Checked[i] then

{ 93 } begin

{ 94 } RmDir(Items[i]);

{ 95 } if IOResult = 0

{ 96 } then

{ 97 } begin

{ 98 } inc(CCount); // + 1 в счетчик

{ 99 } Items.Delete(i);

{ 100 } end;

{ 101 } end;

{ 102 } if Items.Count = 0

{ 103 } then ShowMessage('Удалено ' + IntToStr(CCount) +' папок.')

{ 104 } else ShowMessage('Не могу удалить '+intToStr(Items.Count)+' папок');

{ 105 } end;

{ 106 } end;

{ 107 }

{ 108 } end.

// конец кода

Скопируй сей текст в какой либо файл и давай на него посмотрим.

|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

Как получить исходник из этой книги, описано в "Извлекаем архив из fb2"

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Рекурсия»

Представляем Вашему вниманию похожие книги на «Рекурсия» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Владимир Карпов - Генералиссимус. Книга 2.
Владимир Карпов
Владимир Карпов - Генералиссимус. Книга 1.
Владимир Карпов
Георгий Карпов - Генри Стенли
Георгий Карпов
Алексей Карпов - Юрий Долгорукий
Алексей Карпов
Василий Карпов - Высота 4100
Василий Карпов
Виктор Каика - Рекурсия
Виктор Каика
Алексей Карпов - Юрий Всеволодович
Алексей Карпов
Валерий Сигитов - Антихрист. Рекурсия
Валерий Сигитов
Отзывы о книге «Рекурсия»

Обсуждение, отзывы о книге «Рекурсия» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x