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



             

Листинг 10 14



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








Содержание  Назад  Вперед