Урок 52 Очистка диска No title August 25 , 2007



Сегодня мы будем мутить очень полезную программу для пользователей Builder'a. Вы, наверное, не раз замечали, что после компиляции в папке с проектом появляется много всякой хуйни, типа резервных копий модулей. Так вот: сейчас сделаем программу, которая это всё удаляет…
Эта программа будет удалять созданные в процессе компиляции проектов файлы *.obj, *.tds, *.~bpr, *.~ dfm , *.~ cpp , *.~ h , из указанного пользователем каталога (папки), для этого будет использовано окно «Обзор папок»:

Итак… Кидаем на форму две кнопки Button, Memo, и три Label (Можно два, чтобы без тупого описания было)

Основную работу выполняет рекурсивная функция (которая может сама себя вызвать) Clear(). Сначала она просматривает текущий каталог и удаляет файлы, которые надо удалить. После этого она переходит на подкаталоги и вызывает саму себя. Приведённый ниже листинг хорошо закомментирован и я надеюсь разобраться с ним не трудно. Только не забудьте подключить к проекту # include < FileCtrl . hpp > для доступа к функции SelectDirectory
 
 
/*
Очистка диска.
Программа удаляет ненужные, созданные в процессе компиляции
проектов C++Builder, файлы (obj, tds) и резервные
копии (~bpr, ~dfm, ~h, ~cpp) из указанного пользователем
каталога и его подкаталогов.
Для выбора каталога используется стандартное
окно Обзор папок.
 
*/
 
#include <vcl.h>
#pragma hdrstop
#include "ClearMain.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
 
TMainForm *MainForm;
 
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
}

 
#include <FileCtrl.hpp> // для доступа к SelectDirectory
 
AnsiString aDirectory; // каталог, который выбрал пользователь
// (в котором находятся проекты C++Builder)
 

AnsiString cDir; // текущий каталог
AnsiString FileExt; // расширение файла
 
int n = 0; // количество удаленных файлов
 
// Щелчок на кнопке Обзор (выбор каталога)
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
if ( SelectDirectory(" Выберите каталог ","", aDirectory))
{
// диалог Выбор файла завершен щелчком на OK
Label3->Caption = aDirectory;
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] == '~') || ( FileExt == "obj" ) ||
( FileExt == "tds" ) )
{
MainForm->Memo1->Lines->Add(cDir+SearchRec.Name);
DeleteFile(SearchRec.Name);
n++;
}
}
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 TMainForm::Button2Click(TObject *Sender)
{
Memo1->Clear(); // очистить поле Memo1
ChDir(aDirectory); // войти в каталог, который выбрал пользователь
 
Clear(); // очистить текущий каталог и его подкаталоги

 
Memo1->Lines->Add("");
if (n)
Memo1->Lines->Add(" Удалено файлов : " + IntToStr(n));
else
Memo1->Lines->Add("В указанном каталоге нет файлов, которые надо удалить.");
}

Теперь надёжный чистильщик ваших проектов всегда под рукой…

Материал подготовил - Klaus, 2007
www.builderhelper.org
builder.helper@rambler.ru