48990 (Системное программирование для операционных систем), страница 3

2016-07-30СтудИзба

Описание файла

Документ из архива "Системное программирование для операционных систем", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "48990"

Текст 3 страницы из документа "48990"

void __fastcall SetLength (int NewLen); //определить размер массива

T& operator[](int Index); //оператор []-доступ к элементу

void* operator&(void); //оператор & - адрес массива

__property T Items[int Index] = {read=Get, write=Put}; //свойство для доступа к элементу

__property int Count = {read=fCount, write=SetCount}; //свойство для доступа к кол-ву элементов списка

__property int Length = {read=fLength, write=SetLength};//свойство для доступа к размеру массива

};

template TArray::TArray(int aLength)

{

fCount=0;

fLength=0;

SetLength(aLength);

}

template TArray::~TArray(void) { SetLength(0); }

template T& TArray::operator[](int Index) { return fItems[Index];}

template void* TArray::operator&(void) {return fItems;}

template T __fastcall TArray::Get(int Index) { return fItems[Index]; }

template void __fastcall TArray::Put(int Index, T Item) { fItems[Index]=Item; }

template void __fastcall TArray::Add(T Item){ Insert(fCount,Item); }

template void __fastcall TArray::Clear(void) { fCount=0; }

template void __fastcall TArray::SetCount(int NewCount)

{

fCount=NewCount;

if(fCount<0) fCount=0;

if(fCount>fLength) fCount=fLength;

}

template void __fastcall TArray::Insert(int Index,T Item)

{

if(IndexfCount) return;

if (fCount==fLength) SetLength(fLength+5);

if (Index

fItems[Index]=Item;

fCount++;

}

template void __fastcall TArray::Delete(int Index)

{

if(IndexfCount-1) return;

if (Index

fCount--;

//if (fCount==fLength-6) SetLength(fCount+1);

}

template void __fastcall TArray::SetLength (int NewLen)

{

if (NewLen<0 || fLength==0 && NewLen==0) return; else

if (fLength==0) fItems=(T *)SysGetMem(NewLen*sizeof(T));else

if (NewLen==0) SysFreeMem(fItems);else fItems=(T *)SysReallocMem(fItems,NewLen*sizeof(T));

fLength=NewLen;

if (fLength

}

//динамические массивы (с элементами int и HANDLE)

typedef TArray TIntArray;

typedef TArray THandleArray;

#endif

Файл ArrayTemplate.cpp

//---------------------------------------------------------------------------

#pragma hdrstop

#include

#include "ArrayTemplate.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

Файл FSelectDirForm.h

//---------------------------------------------------------------------------

#ifndef FSelectDirFormH

#define FSelectDirFormH

//---------------------------------------------------------------------------

#include

#include

#include

#include

#include

//---------------------------------------------------------------------------

class TSDForm : public TForm

{

__published: // IDE-managed Components

TButton *Button1;

TButton *Button2;

TDirectoryListBox *DirectoryListBox1;

TDriveComboBox *DriveComboBox1;

private: // User declarations

public: // User declarations

__fastcall TSDForm(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern PACKAGE TSDForm *SDForm;

//---------------------------------------------------------------------------

#endif

Файл FSelectDirForm.cpp

//---------------------------------------------------------------------------

#include

#pragma hdrstop

#include "FSelectDirForm.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TSDForm *SDForm;

//---------------------------------------------------------------------------

__fastcall TSDForm::TSDForm(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

Файл FMain.h

//---------------------------------------------------------------------------

#ifndef FMainH

#define FMainH

//---------------------------------------------------------------------------

#include

#include

#include

#include

#include "ArrayTemplate.h"

#include

#include

#include

//---------------------------------------------------------------------------

//используемые коды сообщений

#define WM_SHELLMESS (WM_USER + 1) //от значка в System Tray

#define WM_SHOWMYWIN (WM_USER + 2) //от второй копии программы

//тип-список строк для хранения имен файлов, а также номеров каталогов

//(в списке каталогов) для каждого имени

class TGlobalList:public TStringList

{

public:

int __fastcall At(int Index); //доступ к номеру каталога для выбранного файла

};

//тип-список строк для хранения имен файлов-дубликатов,а также указателей

//на массивы номеров каталогов (TIntArray *) для каждого файла-дубликата

class TNameList:public TStringList

{

public:

TIntArray * __fastcall At(int Index); //доступ к массиву номеров для выбранного файла

};

//предварительное объявление

class TVerDirectory;

//тип-поток для проверки каталогов и подготовки отчета по одноименным файлам

class TDirThread:public TThread

{

protected:

void __fastcall Execute(); //главная функция потока

public:

TVerDirectory *Report; //подготавливаемый отчет

__fastcall TDirThread(bool CreateSuspended):TThread(CreateSuspended) {} //конструктор

void __fastcall SetLists(void); //передача отчета главному окну программы

void __fastcall CheckStep(void); //отмечает в главном окне начало проверки каталогов

bool Term(void) {return Terminated;} //возвращает Terminated(protected - свойство)

};

//тип-поток для автоматического контроля проверяемых каталогов -

// при переименовке, добавлении и удалении файлов в данных каталогах (или их подкаталогах)

// инициирует проверку каталогов с подготовкой отчета

class TNotifyThread:public TThread

{

protected:

void __fastcall Execute(); //главная функция потока

public:

__fastcall TNotifyThread(bool CreateSuspended):TThread(CreateSuspended) {}//конструктор

bool Term(void) {return Terminated;} //возвращает Terminated(protected - свойство)

};

//тип-подготавливаемый отчет

class TVerDirectory

{

public:

TDirThread * Owner; //поток-владелец отчета - только указатель

AnsiString Path;

TStringList *DirList; //список подкаталогов проверяемого каталога

TGlobalList *GlobalList; //общий список имен файлов

TNameList *NameList; //список обнаруженных одноименных файлов

TNameList *ExNames; //проверяемые каталоги(пути) - только указатель

TVerDirectory(TStrings * fExNames, AnsiString fPath, TDirThread * aOwner);//-конструктор

~TVerDirectory(void); //-деструктор

void __fastcall Clear(void); //-очистка отчета

void __fastcall Fill(void); //-главная функция для подготовки отчета

bool __fastcall WorkFile(int PathNum,AnsiString Name); //-проверка файла

bool __fastcall WorkDir(AnsiString Path); //-проверка каталога

// (с рекурсивными вызовами для подкаталогов)

void __fastcall SetNameList(TStrings * DestList); //-для передачи в оконный компонент списка одноименных файлов

void __fastcall SetExNames(TStrings * DestList); //-для передачи в оконный компонент списка исключений

void __fastcall SetDirList(int NameNum,TStrings * DestList);//-для передачи в оконный компонент списка путей расположения

// выбранного файла (с номером NameNum в списке NameList)

void __fastcall SetDirListEx(int NameNum,TStrings * DestList);//-для передачи в оконный компонент списка путей расположения

// выбранного файла (с номером NameNum в списке ExNames)

bool __fastcall SetEx(int Index); //передать файл из NameList в ExNames

bool __fastcall ResetEx(int Index); //передать файл из ExNames в NameList

};

//---------------------------------------------------------------------------

//тип - форма главного окна

class TFForm : public TForm

{

__published: // IDE-managed Components

TButton *Button1;

TPopupMenu *PopupMenu1;

TMenuItem *N1;

TMenuItem *N2;

TPanel *Panel1;

TLabel *Label1;

TListBox *NameBox;

TLabel *Label2;

TListBox *DirBox;

TPanel *Panel2;

TLabel *Label3;

TButton *AddDirButton;

TTimer *Timer1;

TLabel *Label5;

TListBox *ExBox;

TLabel *Label4;

TSpeedButton *SetExButton;

TSpeedButton *ResetExButton;

TTimer *Timer2;

void __fastcall NameBoxClick(TObject *Sender);

void __fastcall FormActivate(TObject *Sender);

void __fastcall N1Click(TObject *Sender);

void __fastcall FormClose(TObject *Sender, TCloseAction &Action);

void __fastcall N2Click(TObject *Sender);

void __fastcall Button1Click(TObject *Sender);

void __fastcall Timer1Timer(TObject *Sender);

void __fastcall ExBoxClick(TObject *Sender);

void __fastcall AddDirButtonClick(TObject *Sender);

void __fastcall SetExButtonClick(TObject *Sender);

void __fastcall ResetExButtonClick(TObject *Sender);

private: // User declarations

void __fastcall WMShellMess(TMessage &Message); //обработчик WM_SHELLMESS

void __fastcall ShowMyWin(TMessage &Message); //обработчик WM_SHOWMYWIN

public: // User declarations

TVerDirectory *Report; //подготовленный отчет по одноименным файлам

TDirThread *DirThr; //поток проверки каталогов

TNotifyThread *NotifyThr; //поток автоматического контроля каталогов

TNotifyIconData NotifyData; //структура для регистрации значка в System Tray

bool AppClose; //признак выхода из программы

__fastcall TFForm(TComponent* Owner);//конструктор

void __fastcall CallThreads(void); //создание и запуск потоков контроля и проверки каталогов

void __fastcall StopThreads(void); //завершение и удаление потоков контроля и проверки каталогов

BEGIN_MESSAGE_MAP

MESSAGE_HANDLER(WM_SHELLMESS, TMessage, WMShellMess)

MESSAGE_HANDLER(WM_SHOWMYWIN, TMessage, ShowMyWin)

END_MESSAGE_MAP(TForm)

};

//---------------------------------------------------------------------------

extern PACKAGE TFForm *FForm;

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

#endif

Файл FMain.cpp

//---------------------------------------------------------------------------

#include

#pragma hdrstop

#include "FMain.h"

#include "FSelectDirForm.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TFForm *FForm;

bool DirectoryNever; //признак необходимости перезапуска проверки каталогов

void *NeverMutex, //мъютекс для синхронизации доступа к DirectoryNever (для записи)

*NeverEvent; //событие для синхронизации потоков проверки файлов и контроля файлов

//---------------------------------------------------------------------------

//------------------------TGlobalList,TNameList---------------------------------

int __fastcall TGlobalList::At(int Index) {return (int)Objects[Index];}

TIntArray * __fastcall TNameList::At(int Index) {return (TIntArray *)Objects[Index];}

//---------------------------------------------------------------------------

//------------------------TVerDirectory----------------------------------------

TVerDirectory::TVerDirectory(TStrings * fExNames, AnsiString fPath, TDirThread * aOwner)

{

Path=fPath;

Owner=aOwner;

DirList= new TStringList();

GlobalList = new TGlobalList(); GlobalList->Sorted=true;

NameList = new TNameList(); NameList->Sorted=true;

ExNames = new TNameList(); ExNames->Sorted=true;

ExNames->AddStrings(fExNames);

}

//---------------------------------------------------------------------------

TVerDirectory::~TVerDirectory(void)

{

Clear();

delete DirList;

delete GlobalList;

delete NameList;

delete ExNames;

}

//---------------------------------------------------------------------------

void __fastcall TVerDirectory::Clear(void)

{

for(int i=0; iCount;i++) delete NameList->At(i);

for(int i=0; iCount;i++)

if (ExNames->At(i) != NULL)

{

delete ExNames->At(i);

ExNames->Objects[i]=NULL;

}

NameList->Clear();

GlobalList->Clear();

DirList->Clear();

}

//---------------------------------------------------------------------------

//главная функция для проверки каталогов и подготовки отчета

//если проверка была прервана в связи с изменением состава файлов (взведен DirectoryNever)-

//проверка начинается сначала.

//если проверка была прервана в связи с завершением родительского потока - выход из функции

void __fastcall TVerDirectory::Fill(void)

{

bool cc=true;

while (!Owner->Term() && cc)

{

//проверка

cc=!WorkDir(Path);

if(cc)

{

Clear();

WaitForSingleObject( NeverMutex,INFINITE);

DirectoryNever=false;

ReleaseMutex(NeverMutex);

}

}

}

//---------------------------------------------------------------------------

//проверка-регистрация в отчете файла (по имени и номеру подкаталога)

//при изменении состава файлов(взведен DirectoryNever) или при завершении

//родительского потока - досрочный выход с результатом - false

bool __fastcall TVerDirectory::WorkFile(int PathNum,AnsiString Name)

{

//выход при необходимости

if (DirectoryNever || Owner->Term() ) return false;

int i, j,k;

TIntArray *T;

j=ExNames->IndexOf(Name);

if(j>=0)//имя в списке исключений

{

if(ExNames->At(j) == NULL) {//создать массив

T = new TIntArray(3);

ExNames->Objects[j]=(TObject *)T;

}

(ExNames->At(j))->Add(PathNum);//добавить номер каталога

}

else

{

i=GlobalList->IndexOf(Name);

if(i>=0)//такой файл уже есть

{

j = NameList->IndexOf(Name);

if(j>=0) (NameList->At(j))->Add(PathNum);//добавить номер каталога в массив

else { //создать и заполнить массив номеров каталогов

T = new TIntArray(3);

T->Add(GlobalList->At(i));

T->Add(PathNum);

//включить файл в список одинаковых

NameList->AddObject(Name,(TObject *)T);

}

}

else GlobalList->AddObject(Name,(TObject *)PathNum);//включить файл в общий список

}

//выход

return true;

}

//---------------------------------------------------------------------------

//проверка-регистрация в отчете каталога (а также его содержимого, для подкаталогов - рекурсивные вызовы)

//при изменении состава файлов(взведен DirectoryNever) или при завершении

//родительского потока - досрочный выход с результатом - false

bool __fastcall TVerDirectory::WorkDir(AnsiString Path)

{

//выход при необходимости

if (DirectoryNever || Owner->Term() ) return false;

TSearchRec SRec;

bool Result=true;

TStringList *FList = new TStringList(),*DList= new TStringList();

FList->Sorted=true;

DList->Sorted=true;

//заполнить списки файлов и каталогов

if(FindFirst(Path+"*.*",faAnyFile,SRec)==0)

do{

if(SRec.Name!="." && SRec.Name!="..")

{

if (SRec.Attr & faDirectory) DList->Add(SRec.Name);

else FList->Add(SRec.Name);

}

}while(FindNext(SRec)==0);

FindClose(SRec);

//обработка себя самого

DirList->Add(Path);

//обработка файлов

for(int i=0;iCount;i++)

if(!WorkFile(DirList->Count-1,FList->Strings[i])) {Result=false;break;}

delete FList;

//обработка подкаталогов

if(Result)

for(int i=0;iCount;i++)

if (!WorkDir(Path+DList->Strings[i]+"\\")) {Result=false;break;};

delete DList;

//выход

return Result;

}

//---------------------------------------------------------------------------

void __fastcall TVerDirectory::SetNameList(TStrings * DestList)

{

DestList->Clear();

for(int i=0;iCount;i++) DestList->Add(NameList->Strings[i]);

}

//---------------------------------------------------------------------------

void __fastcall TVerDirectory::SetExNames(TStrings * DestList)

{

DestList->Clear();

for(int i=0;iCount;i++) DestList->Add(ExNames->Strings[i]);

}

//---------------------------------------------------------------------------

void __fastcall TVerDirectory::SetDirList(int NameNum,TStrings * DestList)

{

DestList->Clear();

for(int i=0;iAt(NameNum)->Count;i++)

DestList->Add(DirList->Strings[NameList->At(NameNum)->Items[i]] );

}

//---------------------------------------------------------------------------

void __fastcall TVerDirectory::SetDirListEx(int NameNum,TStrings * DestList)

{

DestList->Clear();

if (ExNames->At(NameNum) == NULL) DestList->Add("ФАЙЛ ОТСУТСТВУЕТ"); else

for(int i=0;iAt(NameNum)->Count;i++)

DestList->Add(DirList->Strings[ExNames->At(NameNum)->Items[i]] );

}

//---------------------------------------------------------------------------

bool __fastcall TVerDirectory::SetEx(int Index)

{

if(Index>=0 && IndexCount)

{

ExNames->AddObject(NameList->Strings[Index],NameList->Objects[Index]);

NameList->Delete(Index);

return true;

} else return false;

}

//---------------------------------------------------------------------------

bool __fastcall TVerDirectory::ResetEx(int Index)

{

if(Index>=0 && IndexCount)

{

if(ExNames->At(Index)==NULL)

{

if(Application->MessageBoxA(((AnsiString)"Выбранный файл отсутствует в контролируемом каталоге.\n"+

"Удалить его из списка исключений?").c_str(),"Предупреждение",MB_YESNO | MB_ICONWARNING)==IDYES)

{

ExNames->Delete(Index);

return true;

}

} else

if(ExNames->At(Index)->Count==1)

{

if(Application->MessageBoxA(((AnsiString)"Выбранный файл в контролируемом каталоге присутствует в единственном числе.\n"+

"Удалить его из списка исключений?").c_str(),"Предупреждение",MB_YESNO | MB_ICONWARNING)==IDYES)

{

delete ExNames->At(Index);

ExNames->Delete(Index);

return true;

}

} else {

NameList->AddObject(ExNames->Strings[Index],ExNames->Objects[Index]);

ExNames->Delete(Index);

return true;

}

}

return false;

}

//---------------------------------------------------------------------------

//------------------------------TDirThread--------------------------------------

//включает мигание надписи "Запущена проверка"

void __fastcall TDirThread::CheckStep(void)

{

FForm->Timer1->Enabled=true;

FForm->Label5->Visible=true;

}

//---------------------------------------------------------------------------

//передает подготовленный отчет главному окну программы

//(с открытием и активизацией главного окна)

void __fastcall TDirThread::SetLists(void)

{

//отключить мигание надписи "Запущена проверка"

FForm->Timer1->Enabled=false;

FForm->Label5->Visible=false;

TVerDirectory *OldReport=FForm->Report;

bool First=(OldReport == NULL);//First=true при подготовке потоком первого отчета

FForm->Report=Report; //передача нового отчета

//настройка оконных компонентов под новый отчет

FForm->Report->SetNameList(FForm->NameBox->Items);

FForm->ExBox->ItemIndex=-1;

FForm->DirBox->Clear();

FForm->SetExButton->Enabled=false;

FForm->ResetExButton->Enabled=false;

if(Report->NameList->Count>0)

FForm->Panel2->Caption="Обнаружены одноименные файлы!";

else FForm->Panel2->Caption="Одноименные файлы отсутствуют.";

//открытие и активизация главного окна приложения

if(!First && (Report->NameList->Count>0 || OldReport->NameList->Count>0))

if(FForm->Visible) {

//Второй запуск самого себя - только такой путь, чтобы вытащить окно на передний

//план (SetForegroundWindow из другого процесса)

WinExec(ParamStr(0).c_str(),SW_SHOWNORMAL);

}

else {//открыть окно

ShowWindow(Application->Handle, SW_SHOW);

FForm->Show();

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Нет! Мы не выполняем работы на заказ, однако Вы можете попросить что-то выложить в наших социальных сетях.
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
4125
Авторов
на СтудИзбе
667
Средний доход
с одного платного файла
Обучение Подробнее