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

на главную

Жанры

Рекурсия

Карпов Юрий

Шрифт:

|go| Как сказал кот Матроскин - "Заработало!!!"

|t_| Хорошо, ну а теперь найди в программе ошибку. Подсказка, тоже цитата "Хотели как лучше, а получилось... "

|go| Нашел, каждый раз при нажатии кнопки выбор папки начинается из папки программы, а это неудобно.

|t_| Ну, ты даешь! Нашел не запланированную мною ошибку. Ты совершенно прав. Давай исправлять.

{ 46 } Dir : AnsiString; -

определение переменной сделай глобальным

{ 0 } var

{ 1 } Form1: TForm1;

Dir : AnsiString;

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

а строчку 46 удали

теперь:

{ 48 } Dir := Path; - это присваивание отсюда забери и вставь в:

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

Dir := Path;

{ 62 } end;

Ну, а теперь, ищи дальше.

|go| Не понял смысла в строках

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

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

Dir и так возвращается без конечного слеша.

|t_| Не совсем так. Если ты будешь искать в корневом каталоге, то там будет слеш (например: с:\ ). Ищи дальше.

|go| Наверно это строки

{ 33 } begin // найден какой то файл

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

{ 35 } FindClose(SR);

{ 36 } exit;

{ 37 } end;

не знаю в чем ошибка, хотя бы потому, что я не понимаю их смысла.

|t_| Да, это ошибка и есть. Подразумевалось такое рассуждение: если в папки найден какой то файл, значит папка не пуста, а значит и искать дальше нечего, и давай сэкономим время.

Это бы работало правильно, если бы вложенные папки были бы гарантированно просмотрены первыми... Удали строки 35, 36.

|go| Слушай, что то странное. Удаляю из одной папки, пишет "Удалено 8 папок", опять удаляю оттуда, опять пишет "Удалено 8 папок", третий раз удаляю, опять тоже самое.

|t_| Интересно. Поставь курсор на 28 строку и нажми F4. Посмотри содержимое Target и SR.Name в момент удаления папки.

|go| Не понял, как посмотреть?

|t_| Знаешь, мне не хочется отвлекаться на описание возможностей Delphi по отладке программ, информацию об этом найдешь в любом учебнике, поэтому пока простейшее, в режиме отладки, наведи курсор мыши на нужную переменную и через пару секунд всплывет ее значение в этот момент ( есть и более удобные способы - читай учебники ).

Возвращаемся к нашей программе. Посмотри содержимое указанных переменных и проверь, что есть в этих папках.

|go| В этих папках есть другие папки, т.е. они не пустые.

|t_| Минуточку, сам попробую.

Через 6 минут.

|t_| Все, разобрался. Достаточно грубая ошибка. У нас result := false - признак не пустой папки вырабатывался только при нахождении файла, а при нахождении папки функция все равно оставалась истинной. Функция RmDir пыталась удалить папку, но т.к. она не пуста ей это не удавалось, а результат удаления мы не анализируем. Вот и имеем, что имеем.

Давай переделаем этот фрагмент.

Кстати, надо учитывать, что папку функции RmDir может не удастся удалить т.к. у нее будет стоять атрибут Только чтение. Можно конечно снять этот атрибут программным путем, но давай сделаем проще и безопаснее, программа будет сообщать о невозможности удаления.

{ 21 } begin

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

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

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

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

{ 25 } if DelEmtyDir( Target+'\'+ SR.Name)

{ 26 } then

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

{ 28 } RmDir(Target+'\'+ SR.Name);

if IOResult = 0

{ 29 } then inc(count) // + 1 в счетчик

else ShowMessage('Не могу удалить папку '+Target+'\'+ SR.Name);

{ 30 } end;

{ 31 } end;

{ 38 } end;

|go| Все. Теперь работает. Претензий нет.

|t_| Да? А мне вот, не нравится. Программа удаляет с компьютера, что-то не спросив разрешения, а может эта папка и пустая необходима.

Давай переделаем программу.

Вместо одной кнопки - две: Сканирование и Удаление.

И CheckListBox для хранения найденных пустых папок.

|go| Как опять все сначала?

|t_| Ну, не совсем сначала. Кстати вот один из критериев оценки качества программы - легкость ее модификации...

Вот, что у меня получилось:

// начало кода

{ 0 } unit Unit1;

{ 1 }

{ 2 } interface

{ 3 }

{ 4 } uses

{ 5 } Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

{ 6 } Dialogs, StdCtrls, FileCtrl, CheckLst, ExtCtrls;

{ 7 }

{ 8 } type

{ 9 } TForm1 = class(TForm)

{ 10 } Panel1: TPanel;

{ 11 } Button1: TButton;

{ 12 } Button2: TButton;

{ 13 } CheckListBox1: TCheckListBox;

{ 14 } Label1: TLabel;

{ 15 } procedure Button1Click(Sender: TObject);

{ 16 } procedure FormCreate(Sender: TObject);

{ 17 } procedure Button2Click(Sender: TObject);

{ 18 } private

{ 19 } { Private declarations }

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

Вперед в прошлое 3

Ратманов Денис
3. Вперёд в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 3

Никто и звать никак

Ром Полина
Фантастика:
фэнтези
7.18
рейтинг книги
Никто и звать никак

Мятежник

Прокофьев Роман Юрьевич
4. Стеллар
Фантастика:
боевая фантастика
7.39
рейтинг книги
Мятежник

Пропала, или Как влюбить в себя жену

Юнина Наталья
2. Исцели меня
Любовные романы:
современные любовные романы
6.70
рейтинг книги
Пропала, или Как влюбить в себя жену

Темный Патриарх Светлого Рода 6

Лисицин Евгений
6. Темный Патриарх Светлого Рода
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода 6

Случайная мама

Ручей Наталья
4. Случайный
Любовные романы:
современные любовные романы
6.78
рейтинг книги
Случайная мама

На границе империй. Том 8

INDIGO
12. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8

Сердце Дракона. Том 19. Часть 1

Клеванский Кирилл Сергеевич
19. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.52
рейтинг книги
Сердце Дракона. Том 19. Часть 1

Кодекс Охотника. Книга V

Винокуров Юрий
5. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.50
рейтинг книги
Кодекс Охотника. Книга V

Дракон - не подарок

Суббота Светлана
2. Королевская академия Драко
Фантастика:
фэнтези
6.74
рейтинг книги
Дракон - не подарок

Беглец

Кораблев Родион
15. Другая сторона
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Беглец

Хозяйка старой усадьбы

Скор Элен
Любовные романы:
любовно-фантастические романы
8.07
рейтинг книги
Хозяйка старой усадьбы

Развод и девичья фамилия

Зика Натаэль
Любовные романы:
современные любовные романы
5.25
рейтинг книги
Развод и девичья фамилия

Я еще не князь. Книга XIV

Дрейк Сириус
14. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще не князь. Книга XIV