Программирование с C++ Builder



Очистка диска



Открыв каталог какого-либо проекта C++ Builder, можно увидеть, что помимо файлов, составляющих проект и используемых компилятором для генерации выполняемого файла (bpr-, dfm-, h- и срр-файлы), в каталоге есть файлы с расширением obj, tds и еще несколько файлов, расширение которых начинается значком ~ (рис. 10.20).



Рис. 10.20. Содержимое каталога проекта "Проверка знаний". Файлы, выделенные цветом, по окончании работы над проектом можно удалить


Файлы с расширением tds и obj создает компилятор в процессе генерации выполняемого файла. Это временные файлы. По окончании работы над проектом они не нужны, и их можно удалить, тем более что размер tds-файла может достигать нескольких мегабайт. Файлы, расширение которых начинается значком ~ , — это резервные копии соответствующих файлов проекта. По окончании работы над проектом их тоже можно удалить с диска.

Программа "Очистка диска" удаляет из текущего каталога и всех его подкаталогов файлы, которые по окончании работы над проектом не нужны (если удалить временные файлы проекта, работа над которым еще не завершена, то в процессе компиляции они будут созданы снова).

Окно программы "Очистка диска" в начале ее работы приведено на рис. 10.21. Для выбора каталога, который надо "почистить", используется стандартное диалоговое окно Обзор папок, которое появляется в результате щелчка на кнопке Каталог.



Рис. 10.21. Окно программы "Очистка диска" в начале ее работы


Процесс активизации процесса очистки активизирует кнопка Выполнить, которая становится доступной только после того, как пользователь выберет каталог. В процессе очистки диска программа выводит в поле Memo имена удаленных файлов.

Вид формы программы приведен на рис. 10.22. После того как компоненты будут добавлены в форму, необходимо выполнить их настройку — задать значения свойств (табл. 10.7).

Текст программы "Очистка диска" приведен в листинге 10.14.

Таблица 10.7. Настройка компонентов


Компонент

Свойство

Значение

Комментарий

Form1

BorderStyle

bsSingle

Тонкая граница окна. Во время работы программы нельзя изменить размер окна, захватив границу мышью

Form1

Borderlcins .biMaximize

false

Во время работы программы в заголовке окна нет кнопки Развернуть

Button2

Enabled

false

В начале работы программы кнопка Выполнить недоступна

Memol

ScrollBars

ssVertical

Есть вертикальная полоса прокрутки



Рис. 10.22. Форма программы "Очистка диска"


 Листинг 10.14 . Очистка диска

#include <vcl.h>
#pragma hdrstop
#include "clear_.h"
#include <FileCtrl.hpp>
// для доступа к SelectDirectory
#pragma package(smart_init)
#pragma resource "*.dfm"
TForml *Forml;
__fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner) { }
AnsiString Directory;
// каталог, в котором находятся проекты C++ Builder
AnsiString cDir;    
// текущий каталог AnsiString FileExt;  // расширение файла
int n = 0;       
// количество удаленных файлов
// щелчок на кнопке Каталог
void__fastcall TForml::ButtonlClick(TObject *Sender)
{
AnsiString dir; 
// каталог, который выбрал пользователь
if ( SelectDirectory("Выберите каталог","", dir))
{
// диалог Выбор файла завершен щелчком на кнопке ОК
Editl-XText = dir;
Button2->Enabled = true;
// теперь кнопка Выполнить доступна
}; }
// удаляет ненужные файлы из текущего каталога и его подкаталогов
void __fastcall Clear(void)
{
TSearchRec SearchRec; // информация о файле или каталоге
cDir = GetCurrentDir()+"\\";
if ( FindFirst("*.*", faArchive,SearchRec) ==0) do {
// проверим расширение файла
int p = SearchRec.Name.Pos(".");
FileExt = SearchRec.Name.Substring(p+1,MAX_PATH);
 if ( ( FileExt[1] == '-') II ( FileExt == "obj")
 || ( FileExt = "tds"))
{
Forml->Memol->Lines->Add(cDir+SearchRec.Name);
DeleteFile(SearchRec.Name);
П++; } } while ( FindNext(SearchRec) == 0);
// обработка подкаталогов текущего каталога
if ( FindFirst("*", faDirectory, SearchRec) == 0) do
if ((SearchRec.Attr & faDirectory) = SearchRec.Attr)
{
// каталоги ".." и "." тоже каталоги,
// но в них входить не надо !!!
if (( SearchRec.Name !=".") &&
(SearchRec.Name != "..")) {
ChDir(SearchRec.Name);
// войти в подкаталог Clear();
      // очистить каталог
ChDir("..");  / выйти из каталога
}; }
while ( FindNext(SearchRec) == 0); }
// щелчок на кнопке Выполнить
void__fastcall TForml::Button2Click(TObject *Sender)
{
Memol->Clear(); // очистить поле Memol
Directory = Edit1-XText;// каталог, который выбрал пользователь
ChDir(Directory);  // войти в каталог
Clear();    
// очистить текущий каталог и его подкаталоги
Memol->Lines->Add(""); if (n)
Memol->Lines->Add("Удалено файлов: " + IntToStr(n)}; else
Memol->Lines->Add(
"В указанном каталоге нет файлов, которые надо удалить.");
 }

Основную работу (удаление файлов) выполняет рекурсивная функция clear (рекурсивной называют функцию, которая в процессе работы вызывает сама себя). Решение реализовать функцию clear как рекурсивную не случайно: функция обрабатывает каталоги компьютера, которые являются рекурсивными объектами. Рекурсивным называют объект, частично состоящий из объектов этого же типа.

Алгоритм функции clear приведен на рис. 10.23.



Рис. 10.23. Алгоритм функции Clear


Сначала функция clear обрабатывает текущий каталог: просматривает все файлы и удаляет те, которые надо удалить. Просмотр файлов обеспечивают функции FindFirst и FindNext . Функция FindFirst просматривает каталог, указанный при ее вызове, и записывает в структуру searchRec имя первого из найденных файлов, имя которого соответствует маске. В данной программе маска *.* , т. е. функция выбирает первый по порядку файл. Если файл найден, то выполняется проверка его расширения. Если расширение файла obj, tds или начинается со значка ~, то имя файла добавляется в поле Memo1 , а сам файл удаляется с диска. Удаляет файл функция DeleteFiie . После обработки первого файла для поиска следующего вызывается функция FindNext . После того как все файлы текущего каталога будут обработаны, функция clear проверяет, есть ли в текущем каталоге подкаталоги. Проверку выполняет функция FindFirst , которой в качестве параметра передается константа faDirectory , информирующая функцию о том, что надо искать имена каталогов, а не файлов. Если в текущем каталоге нет подкаталогов, то функция clear завершает работу. Если в текущем каталоге есть подкаталоги, то выполняется вход в подкаталог (делает это функция choir ) и вызов функции clear (для обработки подкаталога функция вызывает саму себя). Если в текущем каталоге нет необработанных каталогов, то она завершает работу и возвращает управление функции clear , которая ее вызвала и которая после этого продолжает обработку "своих" подкаталогов.

Вывод окна Обзор папок выполняет функция selectDirectory , которую вызывает функция обработки события click на кнопке Каталог. Для доступа к этой функции в текст программы надо включить директиву #include <FileCtrl.hpp>.