. Очистка диска
#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 как рекурсивную не случайно: функция обрабатывает каталоги компьютера, которые являются рекурсивными объектами. Рекурсивным называют объект, частично состоящий из объектов этого же типа.