Чтение онлайн

на главную - закладки

Жанры

Рекурсия

Карпов Юрий

Шрифт:

{ 20 } public

{ 21 } { Public declarations }

{ 22 } end;

{ 23 }

{ 24 } var

{ 25 } Form1: TForm1;

{ 26 } Path : AnsiString; // путь к папке с программой

{ 27 } Dir : AnsiString;

{ 28 } CCount : integer; // счетчик удалений

{ 29 }

{ 30 } implementation

{ 31 }

{ 32 } {$R *.dfm}

{ 33 }

{ 34 } function ScanEmtyDir(Target : AnsiString):boolean;

{ 35 } var

{ 36 } Found : integer; // результат

поиска ( 0 - файл найден )

{ 37 } SR : TSearchRec; // запись с параметрами файла

{ 38 } begin

{ 39 } Found := FindFirst(Target + '\*.*',$3F,SR);

{ 40 } result := true; // предположим что папка пуста.

{ 41 } WHILE Found = 0 DO

{ 42 } BEGIN

{ 43 } if (SR.Name <> '.')

{ 44 } and (SR.Name <> '..')

{ 45 } then

{ 46 } begin

{ 47 } result := false; // значит папка не пуста.

{ 48 } // если это папка

{ 49 } if ((SR.Attr and $10) = $10 ) then

{ 50 } begin // рекурсивный вызов функции

{ 51 } if ScanEmtyDir( Target+'\'+ SR.Name)

{ 52 } then // удаление пустой папки

{ 53 } begin

{ 54 } with Form1.CheckListBox1 do

{ 55 } Checked[Items.Add(Target+'\'+ SR.Name)] := true;

{ 56 } end;

{ 57 } end;

{ 58 } end;

{ 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

Поделиться:
Популярные книги

Геном хищника. Книга седьмая

Гарцевич Евгений Александрович
7. Я - Легенда!
Фантастика:
боевая фантастика
рпг
фэнтези
попаданцы
5.00
рейтинг книги
Геном хищника. Книга седьмая

Мальвиль

Мерль Робер
Фантастика:
социально-философская фантастика
научная фантастика
альтернативная история
8.29
рейтинг книги
Мальвиль

Я все еще барон

Дрейк Сириус
4. Дорогой барон!
Фантастика:
боевая фантастика
5.00
рейтинг книги
Я все еще барон

Поводырь

Щепетнов Евгений Владимирович
3. Ботаник
Фантастика:
фэнтези
6.17
рейтинг книги
Поводырь

Технарь

Муравьёв Константин Николаевич
1. Технарь
Фантастика:
космическая фантастика
попаданцы
7.13
рейтинг книги
Технарь

Бастард Бога (Дилогия)

Матвеев Владимир
Фантастика:
альтернативная история
5.11
рейтинг книги
Бастард Бога (Дилогия)

Эфемер

Прокофьев Роман Юрьевич
7. Стеллар
Фантастика:
боевая фантастика
рпг
7.23
рейтинг книги
Эфемер

Тринадцатый IX

NikL
9. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Тринадцатый IX

Звездная Кровь. Экзарх II

Рокотов Алексей
2. Экзарх
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Звездная Кровь. Экзарх II

Лекарь Империи 7

Карелин Сергей Витальевич
7. Лекарь Империи
Фантастика:
городское фэнтези
аниме
боевая фантастика
попаданцы
5.00
рейтинг книги
Лекарь Империи 7

Печать Пожирателя

Соломенный Илья
4. Пожиратель
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Печать Пожирателя

#Бояръ-Аниме. Газлайтер. Том 11

Володин Григорий Григорьевич
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11

Последний Паладин. Том 8

Саваровский Роман
8. Путь Паладина
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Последний Паладин. Том 8

Том 3. Рассказы 1896-1899

Горький Максим
3. Собрание сочинений в тридцати томах
Проза:
русская классическая проза
5.00
рейтинг книги
Том 3. Рассказы 1896-1899