C++ Builder - вопросы программирования

       

щелчок на кнопке Каталог void__fastcall



Листинг 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.

Содержание раздела