Рекурсия - [3]
{ 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
{ 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_| Ну, что ж, давай на этой оптимистичной ноте, заканчивать сегодняшнее занятие.
Книга предназначена студенту, писавшему программы только в качестве курсовых, "сдавшему" Delphi и несмотря на это, желающему стать программистом. Это, не сборник готовых рецептов, автор хочет поставить читателя в условия максимально приближенные к рабочим. Мы вместе напишем программу, пройдя через ошибки, и сомнения к окончательной победе...
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.