52645.fb2
|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;