Файловый менеджер

Простой и быстрый переход по иерархической файловой системе. Наличие файлового менеджера. Ряд глобальных переменных. Основные пользовательские функции. Основная идея формирования дерева. Функция добавления записи в список. Обновление дерева каталогов.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 04.06.2011
Размер файла 243,1 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

return; //Условие: просматривать дискету и диск если отмечено что они есть

if(!UpdateAllways)

{

if(FindFirst(dir+"*",faAnyFile,sr)==0)

do //и продолжить если найден файл

if((sr.Attr & faDirectory) && sr.Name!="." && sr.Name!="..")

num++; //Пересчитываем все папки в данной

while(FindNext(sr)==0);

FindClose(sr);

}

int count=node->Count;

if(UpdateAllways || num!=count) //Сравниваем с количеством узлов потомков

{

if(UpdateAllways || num<count) //Если узлов потомков больше ищем отсутствующую папку

for(child=node->getFirstChild();child!=NULL;)

{

AnsiString t=*(AnsiString *)(child->Data);

if(GetFileAttributes(t.c_str())==-1)

{

TTreeNode *temp=node->GetNextChild(child);

if(child->Selected) node->Selected=true;

RecursDelData(child); //Удаляем данные несуществующей папки и ее потомков

TreeView1->Items->Delete(child); //удаляем узел

child=temp;

}

else

child=node->GetNextChild(child);

}

if(UpdateAllways || num>count) //Если какой-то папки не хватает

{

if(FindFirst(dir+"*",faAnyFile,sr)==0) //Перебираем папки

do

if((sr.Attr & faDirectory) && sr.Name!="." && sr.Name!="..")

{ //Ищем для них узлы

for(child=node->getFirstChild();child!=NULL;child=node->GetNextChild(child))

if((*(AnsiString *)(child->Data)).AnsiCompareIC((dir+sr.Name+"\\"))==0)

break;

if(child==NULL) //если соответствующего узла нет добавляем

AddChildInNodeTree(node,dir+sr.Name+"\\");

}

while(FindNext(sr)==0);

FindClose(sr);

}

}

if(node->Expanded || CheckExpandedChild(node))

{

for(child=node->getFirstChild();child!=NULL;child=node->GetNextChild(child))

RecursTree(child,UpdateAllways);

}

}

void TForm1::UpdateTreeView(bool UpdateAllways) //Обновление treeview

{

TTreeNode *top=TreeView1->Items->Item[0];

TTreeNode *child;

if(top->Expanded)

for(child=top->getFirstChild();child!=NULL;child=top->GetNextChild(child))

RecursTree(child, UpdateAllways);

TreeView1->AlphaSort();

}

void TForm1::UpdateListView(bool UpdateAllways) //Обновление списка listview

{

if(CurrentDir=="") return; //Если ни один каталог не отображается

if(GetFileAttributes(CurrentDir.c_str())==-1)

{ //Если текущего каталога уже не существует

ViewFailAndFolderInListView(CurrentDir); //отображаем его ридительский каталог

return;

}

TSearchRec sr;

TListItem *item;

int num=0; //подсчет количества файлов в папке

if(!UpdateAllways)

{

if(FindFirst(CurrentDir+"*",faAnyFile,sr)==0)

do //и продолжить если найден файл

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

num++; //Пересчитываем все папки в данной

while(FindNext(sr)==0);

FindClose(sr);

}

int count=ListView1->Items->Count;

if(UpdateAllways || num!=count) //Сравниваем с количеством узлов потомков

{

if(UpdateAllways || num<count) //Если записей больше чем файлов

for(int i=0;i<ListView1->Items->Count;i++) //ищем уже отсутствующие в действительности

{

AnsiString t=*(AnsiString *)(ListView1->Items->Item[i]->Data);

if(GetFileAttributes(t.c_str())==-1)

{

delete ListView1->Items->Item[i]->Data; //Удаляем вспомогательные данные для него

ListView1->Items->Delete(i); //удаляем узел

i--;

}

}

if(UpdateAllways || num>count) //Если файлов не хватает

{

if(FindFirst(CurrentDir+"*",faAnyFile,sr)==0) //Перебираем файлы

do

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

{ //Ищем для них записи

int i;

for(i=0;i<ListView1->Items->Count;i++)

if((*(AnsiString *)(ListView1->Items->Item[i]->Data)).AnsiCompareIC(CurrentDir+sr.Name+((sr.Attr & faDirectory)?"\\":""))==0)

break;

if(i==ListView1->Items->Count) //если соответствующего узла нет добавляем

AddItemInListView(sr,CurrentDir);

}

while(FindNext(sr)==0);

FindClose(sr);

}

}

}

void TForm1::UpdateLabel() //Обновление меток диска

{

TTreeNode *child, *node=TreeView1->Items->Item[0];

for(child=node->getFirstChild();child!=NULL;child=node->GetNextChild(child))

{

AnsiString path=*((AnsiString *)child->Data);

AnsiString text=child->Text;

char inf[20];

unsigned int p=GetDriveType(path.c_str());

if(((p==DRIVE_REMOVABLE || p==DRIVE_CDROM) && (DiskIn.Contains(path[1]))) ||

(p!=DRIVE_REMOVABLE && p!=DRIVE_CDROM))

{

if(GetVolumeInformation(path.c_str(),inf,20,NULL,NULL,NULL,NULL,NULL))

{

text.Delete(1,text.Pos("(")-1);

FirstUpOtherDown(inf);

child->Text=AnsiString(inf)+" "+text;

}

else

{

text.Delete(1,text.Pos("(")-1);

child->Text=" "+text;

ViewFailAndFolderInListView(path);

}

}

else

{

text.Delete(1,text.Pos("(")-1);

child->Text=" "+text;

}

}

}

void TForm1::UpdateAll(bool UpdateAllways) //Обновление всего

{

UpdateTreeView(UpdateAllways); //Обновление дерева папок

UpdateListView(UpdateAllways); //Обновление списка файлов

UpdateLabel();

double c=10.0;

if(CurrentDir!="")

{

__int64 FreeSpace,TotalSpace;

if(Sysutils::GetDiskFreeSpaceEx(ExtractFileDrive(CurrentDir).c_str(),NULL,TotalSpace,&FreeSpace))

StatusBar1->SimpleText=AnsiString("Объектов: ")+ListView1->Items->Count+" (Свободно на диске "+ AnsiString(((FreeSpace*10)/1024/1024/1024)/c)+" ГБ)";

}

}

void TForm1::PasteFileFromClipboard() //Вставить из буфера

{

if(CurrentDir=="") return;

char *frombuf, *temp;

char tobuf[MAX_PATH+1]={'\0'};

int nCount,i; //Число копируемых объектов

Pointer Data;

char * lpDroppedFile;

OpenClipboard(NULL); //Открывает clipboard для текущего процесса

if (IsClipboardFormatAvailable(CF_HDROP))

{

Data=GetClipboardData(CF_HDROP); //Получение указателя на данные

if(Data==0) { CloseClipboard(); return; } //Нечего забирать

nCount= DragQueryFile(Data, 0xFFFFFFFF, NULL, 0); //Получение количества

temp=frombuf=new char[MAX_PATH*nCount];

if (nCount > 0)

{

lpDroppedFile=(char *)AllocMem(MAX_PATH + 1); //Выделение памяти под массив

for (i= 0;i<nCount;i++) //с названиями копирумых объектов

{

DragQueryFile(Data, i, lpDroppedFile, MAX_PATH); //Собственно получение имен этих объектов

if(i!=0)

strcat0(temp,lpDroppedFile); //Добавление к frombuf

else

strcpy(temp,lpDroppedFile);

}

finstr(temp);

free(lpDroppedFile); //Освобождение

strcpy(tobuf,CurrentDir.c_str());

}

long lngEffect;

long lngFormat = RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT);

HANDLE hGlobal = GetClipboardData(lngFormat);

if(hGlobal)

MoveMemory(&lngEffect,hGlobal, 4);

if((lngEffect & DROPEFFECT_COPY) == DROPEFFECT_COPY)

FileAndFolderOperation(frombuf,tobuf , FO_COPY);

if((lngEffect & DROPEFFECT_MOVE) == DROPEFFECT_MOVE)

FileAndFolderOperation(frombuf,tobuf , FO_MOVE);

UpdateAll(false);

}

CloseClipboard();

}

void TForm1::CopyFileToClipboard(bool Copy)

{

if(CurrentDir=="") return;

char *frombuf;

unsigned int uDropEffect, uBufLen;

DROPFILES dropFiles;

unsigned int uGblLen,uDropFilesLen;

HGLOBAL hGblFiles,hGblEffect;

char *szData,*szFileList;

DWORD *dwDropEffect;

uDropEffect=RegisterClipboardFormat("Preferred DropEffect"); //Регистрация формата

//для указания типа копирования

hGblEffect=GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE,sizeof(DWORD));

dwDropEffect=(DWORD*)GlobalLock(hGblEffect); //Выделение памяти под хранение

if(Copy) //инфы о виде перемещения

*dwDropEffect=DROPEFFECT_COPY; //Запись этой инфы

else

*dwDropEffect=DROPEFFECT_MOVE;

GlobalUnlock(hGblEffect); //Разлочивание памяти

uDropFilesLen=sizeof(DROPFILES); //Заполнение структуры содержащей инфу

dropFiles.pFiles =uDropFilesLen; //о строке с именами перемещаемых файлов

dropFiles.pt.x=0;

dropFiles.pt.y=0;

dropFiles.fNC =FALSE;

dropFiles.fWide =FALSE;//TRUE;

if(ListView1->ItemFocused==NULL)

{

if(TreeView1->Selected!=NULL) //Если в фокусе находится treeview

if(TreeView1->Selected->Level>1)

{

AnsiString sourcestr=*((AnsiString *)(TreeView1->Selected->Data));

sourcestr.SetLength(sourcestr.Length()-1);

frombuf=new char[MAX_PATH+1];

strcpy(frombuf,sourcestr.c_str());

finstr(frombuf);

}

else

return; //Выход в том случае если в фокусе Диск или Мой компьютер

}

else if((ListView1->Selected)!=NULL)

PrepareBufForOperationInListView(frombuf);

uBufLen=lengthfinstr(frombuf);

uGblLen=uDropFilesLen+uBufLen+2;

hGblFiles= GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, uGblLen);

szData=(char*)GlobalLock(hGblFiles);

memcpy(szData,&dropFiles,uDropFilesLen);

szFileList=szData+uDropFilesLen;

memcpy(szFileList,frombuf,uBufLen);

/*MultiByteToWideChar(CP_ACP,MB_COMPOSITE,

frombuf,uBufLen,(WCHAR *)szFileList,uBufLen*2+8);*/

GlobalUnlock(hGblFiles);

if( OpenClipboard(NULL) )

{

EmptyClipboard();

SetClipboardData( CF_HDROP, hGblFiles );

SetClipboardData(uDropEffect,hGblEffect);

CloseClipboard();

}

}

void TForm1::CreateFol() //Создает папку в текущем каталоге

{

if(CurrentDir=="") return;

AnsiString c="Новая папка",dir; //Производит поиск отсутствующей папки

for(int i=1;(GetFileAttributes((dir=CurrentDir+c+i).c_str()))!=-1;i++);

if(ListView1->Selected!=NULL) //Если есть выделенные узлы

for(int i=0;i<ListView1->Items->Count;i++) //отменяем выделение

ListView1->Items->Item[i]->Selected=false;

if(CreateDir(dir)) //Создает ее

{

TSearchRec sr;

FindFirst(dir,faDirectory,sr);

TListItem *p=AddItemInListView(sr,ExtractFilePath(dir));

ListView1->ItemFocused=p;

p->Selected=true;

p->EditCaption();

}

UpdateAll(false);

}

//*************************************************************************

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

//***********************************************************************

__fastcall TForm1::TForm1(TComponent* Owner) //Конструктор формы

: TForm(Owner)

{

ShortDateFormat="dd/mm/yy";

DateSeparator = '/';

TimeSeparator=':';

ShortTimeFormat="h:nn";

AnsiString *a=new AnsiString("");

TreeView1->Items->Item[0]->Data=a;

head=TreeView1->Items->Item[0]; //Сохранение корня

GetDrives(); //Загрузка дисков

ShowDrives(); //Отображение в treview

TreeView1->AlphaSort();

}

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

void __fastcall TForm1::TreeView1Expanding(TObject *Sender,

TTreeNode *Node, bool &AllowExpansion)//Событие - открытие узла

{

DragnDrop=false; //Запрещение перемещения

TreeView1->Items->BeginUpdate();

tpItem=TreeView1->TopItem; //Сохранение верхнего узла

if(!CheckExpandedChild(Node)) //Если ни один из потомков не расширен

ViewChild(Node);

TreeView1->AlphaSort(); //Сортировка

}

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

void __fastcall TForm1::TreeView1Compare(TObject *Sender, TTreeNode *Node1,

TTreeNode *Node2, int Data, int &Compare) //Функция сравнения

{

if(Node1->Level==1) //Для упорядочивания treeview

Compare=Node1->Text[Node1->Text.Length()-2]>Node1->Text[Node1->Text.Length()-2]?1:-1;

else

Compare=Node1->Text.AnsiCompare(Node2->Text);

}

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

void __fastcall TForm1::TreeView1Expanded(TObject *Sender, TTreeNode *Node)

{ //Сообщение об окончании

TTreeNode * temp=TreeView1->TopItem; //Раскрытия списка

TreeView1->TopItem=tpItem; //Проверка выхода конца открытой ветви за экран

if((TreeView1->GetNodeAt(TreeView1->Width/2,TreeView1->ClientHeight-1))!=NULL)

{ //Если это так то сдвигаем всю ветвь вверх автоматом

int p=(TreeView1->GetNodeAt(TreeView1->Width/2,TreeView1->ClientHeight-1))->AbsoluteIndex;

if(p<=Node->GetLastChild()->AbsoluteIndex) TreeView1->TopItem=temp;

} //если нет то ставим первым сохранненый ранее первый элемент

TreeView1->Items->EndUpdate();

DragnDrop=true; //Разрешение перемещения

}

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

void __fastcall TForm1::TreeView1Collapsing(TObject *Sender,

TTreeNode *Node, bool &AllowCollapse) //Событие - перед свертыванием

{

DragnDrop=false;

TreeView1->Items->BeginUpdate();

if(!CheckExpandedChild(Node)) //Если ветвь ни одного из потомков не расширена

DeleteChild(Node); //Удаление детей детей

TreeView1->Items->EndUpdate();

DragnDrop=true;

}

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

void __fastcall TForm1::TreeView1Editing(TObject *Sender, TTreeNode *Node,

bool &AllowEdit)

{

if(Node->Level<2) AllowEdit=false; //Запрет на редактирование Мой комп и названий дисков

}

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

void __fastcall TForm1::ListView1Compare(TObject *Sender, TListItem *Item1,

TListItem *Item2, int Data, int &Compare)

{

bool temp1=false, temp2=false;

if(((FileGetAttr(*((AnsiString *)Item1->Data))) & faDirectory)!=0)

temp1=true;

if(((FileGetAttr(*((AnsiString *)Item2->Data))) & faDirectory)!=0)

temp2=true;

AnsiString s1,s2;

switch(ColumnToSort)

{

case 0:

if(temp1==temp2)

Compare=(Item1->Caption).AnsiCompare(Item2->Caption);

else

Compare=temp2?1:-1;

break;

case 2:

if(temp1==temp2)

Compare=(Item1->SubItems->Strings[1]).AnsiCompare(Item2->SubItems->Strings[1]);

else

Compare=temp2?1:-1;

break;

case 1:

if(temp1) s1="0 ";

else s1= Item1->SubItems->Strings[0];

if(temp2) s2="0 ";

else s2= Item2->SubItems->Strings[0];

s1=s1.SubString(1,s1.Pos(" ")-1);

s2=s2.SubString(1,s2.Pos(" ")-1);

Compare=StrToInt(s1)>StrToInt(s2)?1:-1;

break;

case 3:

TDateTime dt1=StrToDateTime(Item1->SubItems->Strings[2]);

TDateTime dt2=StrToDateTime(Item2->SubItems->Strings[2]);

if(temp1==temp2)

Compare=dt1>dt2?1:-1;

else

Compare=temp2?1:-1;

break;

}

Compare*=Direct;

}

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

void __fastcall TForm1::ListView1DblClick(TObject *Sender)

{ //Двойной клик на ListView

OpenFileOrFolder();

}

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

void __fastcall TForm1::ListView1MouseDown(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y)

{

if(DragnDrop && Button == mbLeft) //Событие по нажатию мыши и начало перемещения

{

if(Shift.Contains(ssCtrl))

type_file_operation_drag_drop=FO_COPY;

else

type_file_operation_drag_drop=FO_MOVE;

ListView1->BeginDrag(false,5);

}

}

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

void __fastcall TForm1::TreeView1DragOver(TObject *Sender, TObject *Source,

int X, int Y, TDragState State, bool &Accept)

{ //Процесс перетаскивания

Accept=(TreeView1->GetNodeAt(X,Y)!=NULL) && (Source->ClassNameIs("TListView") || Source->ClassNameIs("TTreeView"));

} //Даем возможность положить объект если есть куда класть и объект из list и tree

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

void __fastcall TForm1::ListView1DragOver(TObject *Sender, TObject *Source,

int X, int Y, TDragState State, bool &Accept)

{

TListItem *p=ListView1->GetItemAt(X,Y);

Accept=(p!=NULL) && ((FileGetAttr(*((AnsiString *)(p->Data))) & faDirectory) !=0) &&

(Source->ClassNameIs("TListView") || Source->ClassNameIs("TTreeView"));

//Даем возможность положить если есть куда если это папка и объект из list или tree

if((StyleListView==vsIcon || StyleListView==vsSmallIcon) && !Accept && p==NULL)

Accept=true;

//в случае значков даем возможность положить значок в пустое место

}

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

void strcat0(char * &dest,char *source)

{ //Объединение двуч строк с оставлением между ними

for(;(*dest)!='\0';dest++); //нулевого символа

for(dest++;(*source!='\0');dest++,source++)

*dest=*source;

*dest='\0';

}

void finstr(char *dest)

{

for(;(*dest)!='\0';dest++);

dest++;

*dest='\0';

}

unsigned int lengthfinstr(char *dest)

{

unsigned int l=0;

do

{

for(;(*dest)!='\0';dest++,l++);

dest++;

l++;

}

while((*dest)!='\0');

return l+1;

}

void __fastcall TForm1::ListView1DragDrop(TObject *Sender, TObject *Source,

int X, int Y)

{

int operation=type_file_operation_drag_drop;

if(ListView1->GetItemAt(X,Y)==NULL)

{ //Если перенос делается на пустое место

ListView1->Selected->Position=Point(X,Y); //просто меняем место значка и выходим

return;

}

if(Source->ClassNameIs("TListView")) //Если объект перетащен из listview

{ //извлекаем нужные папки и делаем операцию

char *frombuf, tobuf[MAX_PATH+1]={'\0'};

TListView *sender=(TListView *)Sender;

PrepareBufForOperationInListView(frombuf);

AnsiString senderstr=*((AnsiString *)(sender->GetItemAt(X,Y)->Data));//+ExtractFileName(*((AnsiString *)(source->Selected->Data)));

strcpy(tobuf,senderstr.c_str()); //Вызываем функции и указываем операцию

FileAndFolderOperation(frombuf,tobuf,operation);

}

if(Source->ClassNameIs("TTreeView"))

{

char frombuf[MAX_PATH+1]={'\0'}, tobuf[MAX_PATH+1]={'\0'};

TTreeView *source=(TTreeView *)Source;

TListView *sender=(TListView *)Sender;

AnsiString sourcestr=*((AnsiString *)(source->Selected->Data));

AnsiString senderstr=*((AnsiString *)(sender->GetItemAt(X,Y)->Data));//+ExtractFileName(*((AnsiString *)(source->Selected->Data)));

sourcestr.SetLength(sourcestr.Length()-1);

strcpy(frombuf,sourcestr.c_str());

strcpy(tobuf,senderstr.c_str());

FileAndFolderOperation(frombuf,tobuf,operation);

}

UpdateAll(false); //Обновление

}

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

void __fastcall TForm1::TreeView1DragDrop(TObject *Sender, TObject *Source,

int X, int Y) //Окончание перетаскивания

{

int operation=type_file_operation_drag_drop;

if(Source->ClassNameIs("TListView")) //Если объект перетащен из listview

{ //извлекаем нужные папки и делаем операцию

char *frombuf, tobuf[MAX_PATH+1]={'\0'};

TTreeView *sender=(TTreeView *)Sender;

PrepareBufForOperationInListView(frombuf);

AnsiString senderstr=*((AnsiString *)(sender->GetNodeAt(X,Y)->Data));//+ExtractFileName(*((AnsiString *)(source->Selected->Data)));

strcpy(tobuf,senderstr.c_str()); //Вызываем функции и указываем операцию

FileAndFolderOperation(frombuf,tobuf,operation);

}

if(Source->ClassNameIs("TTreeView"))

{

TTreeView *source=(TTreeView *)Source;

TTreeView *sender=(TTreeView *)Sender;

char frombuf[MAX_PATH+1]={'\0'}, tobuf[MAX_PATH]={'\0'};

AnsiString sourcestr=*((AnsiString *)(source->Selected->Data));

AnsiString senderstr=*((AnsiString *)(sender->GetNodeAt(X,Y)->Data));//+ExtractFileName(*((AnsiString *)(source->Selected->Data)));

sourcestr.SetLength(sourcestr.Length()-1);

strcpy(frombuf,sourcestr.c_str());

strcpy(tobuf,senderstr.c_str());

FileAndFolderOperation(frombuf,tobuf,operation);

}

UpdateAll(false); //Обновление

}

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

void __fastcall TForm1::TreeView1MouseDown(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y)

{

if(DragnDrop && Button == mbLeft) //начало перетаскивания по нажатию на treeview

{

if(Shift.Contains(ssCtrl))

type_file_operation_drag_drop=FO_COPY;

else

type_file_operation_drag_drop=FO_MOVE;

TreeView1->BeginDrag(false,5);

}

}

void __fastcall TForm1::TreeView1Edited(TObject *Sender, TTreeNode *Node,

AnsiString &S)

{

S=RenameFileOrFolder(S);

UpdateTreeView(false);

}

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

void __fastcall TForm1::ListView1Edited(TObject *Sender, TListItem *Item,

AnsiString &S)

{

S=RenameFileOrFolder(S);

UpdateTreeView(false);

}

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

void __fastcall TForm1::NRenameClick(TObject *Sender)

{

if(ListView1->ItemFocused==NULL)

{

if(TreeView1->Selected!=NULL)

if(TreeView1->Selected->Level>1)

TreeView1->Selected->EditText();

}

else

if((ListView1->Selected)!=NULL)

ListView1->Selected->EditCaption();

}

void __fastcall TForm1::TreeView1ContextPopup(TObject *Sender,

TPoint &MousePos, bool &Handled)

{

TTreeNode *node;

if((node=TreeView1->GetNodeAt(MousePos.x,MousePos.y))!=NULL)

{

ListView1->ItemFocused=NULL;

TreeView1->Selected=node;

if(TreeView1->Selected->Level>0)

ViewFailAndFolderInListView(*((AnsiString *)(TreeView1->Selected->Data)));

node->Focused=true;

}

else

TreeView1->Selected=NULL;

if(TreeView1->Selected!=NULL && TreeView1->Selected->Level>0)

Handled=false;

else

Handled=true;

PNOpen->Visible=false;

PNView->Visible=false;

PNSort->Visible=false;

PNUpdate->Visible=false;

PNProperty->Visible=true;

if(TreeView1->Selected->Level>1)

{

PNCut->Visible=true;

PNCopy->Visible=true;

PNDelete->Visible=true;

PNRename->Visible=true;

}

else

{

PNCut->Visible=false;

PNCopy->Visible=false;

PNDelete->Visible=false;

PNRename->Visible=false;

}

OpenClipboard(NULL); //Проверка возможности вставки

if(IsClipboardFormatAvailable(CF_HDROP))

PNPaste->Enabled=true;

else

PNPaste->Enabled=false;

CloseClipboard();

}

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

1.3. Листинг PropertyFile.cpp

TFPropertyFile *FPropertyFile;

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

__fastcall TFPropertyFile::TFPropertyFile(TComponent* Owner)

: TForm(Owner)

{

}

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

void TFPropertyFile::Set_Change(AnsiString Name,WIN32_FILE_ATTRIBUTE_DATA &attr)

{

if (ENameFile->Modified) //Сохранение изменений

{ //Если изменнео имя файла папки

if((FileGetAttr(Name) & faDirectory)!=0)

Name.SetLength(Name.Length()-1);

char frombuf[1000]={'\0'}, tobuf[1000]={'\0'};

strcpy(frombuf,Name.c_str());

strcpy(tobuf,(ExtractFilePath(Name)+ENameFile->Text).c_str());

Form1->FileAndFolderOperation(frombuf,tobuf,FO_RENAME); //Переименовываем

}

//Сохранение атрибутов

if(CBArchiv->Checked) attr.dwFileAttributes |= FILE_ATTRIBUTE_ARCHIVE;

else attr.dwFileAttributes &= ~FILE_ATTRIBUTE_ARCHIVE;

if(CBReadOnly->Checked) attr.dwFileAttributes |= FILE_ATTRIBUTE_READONLY;

else attr.dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;

if(CBHide->Checked) attr.dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN;

else attr.dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN;

if(CBSystem->Checked) attr.dwFileAttributes |= FILE_ATTRIBUTE_SYSTEM;

else attr.dwFileAttributes &= ~FILE_ATTRIBUTE_SYSTEM;

SetFileAttributes(Name.c_str(),attr.dwFileAttributes); //Установка

ENameFile->Modified=false;

}

void TFPropertyFile::Get_Size_Folder(AnsiString dir)

{

TSearchRec sr;

if(FindFirst(dir+"*",faAnyFile,sr)!=0) //Просмотр папок в детях

return;

do

{

int Attr=FileGetAttr(dir+sr.Name);

if(Attr==-1 || sr.Name=="." || sr.Name=="..")

continue; //Проверка на отсутствующие в действиетельности папки

if(sr.Attr & faDirectory)

{

num_folder++;

Get_Size_Folder(dir+sr.Name+"\\"); //Сохранение полного имени для доступа

}

else

{

num_files++;

size+=sr.Size;

unsigned long temp;

temp=sr.Size;

if((temp/byte_in_cluster*byte_in_cluster)!=temp) //Проверка влезания файла

temp=(temp/byte_in_cluster+1)*byte_in_cluster;

size_on_disk+=temp;

}

}

while(FindNext(sr)==0);

FindClose(sr);

}

void TFPropertyFile::Prepare(AnsiString Name)

{

//Подготовка данных и показ свойств файла

unsigned long int byte_in_sector,sector_in_cluster;

GetDiskFreeSpace((ExtractFileDrive(Name)+"\\").c_str(),&sector_in_cluster,

&byte_in_sector,NULL,NULL);

byte_in_cluster=sector_in_cluster*byte_in_sector;

Name_File=Name;

GetFileAttributesEx(Name.c_str(),GetFileExInfoStandard,&attr);

FILETIME ft;

SYSTEMTIME st;

AnsiString date;

TDateTime dt;

if((FileGetAttr(Name) & faDirectory)!=0) //Если свойства папки

{

Graphics::TBitmap *i=new Graphics::TBitmap; //Загрузка иконки папки

Form1->ImageList3->GetBitmap(ImageCloseFolder,i);

IIconFile->Picture->Bitmap->Assign(i);

delete i;

ENameFile->Text=ExtractFileName(Name.SubString(1,Name.Length()-1));

LTypeFile->Caption="Папка"; //Загрузка названия

LFolder->Caption=ExtractFilePath(Name.SubString(1,Name.Length()-1));

num_files=num_folder=size=size_on_disk=0; //Запуск рекурсивной функции считающей

Get_Size_Folder(Name); //размер папки кол-во файлов и папок в ней

LSize->Caption=AnsiString(FormatFloat("#,##0", size/1024))+" KB ("+AnsiString(FormatFloat("#,##0", size))+ " байт)";

LOnDisk->Caption=AnsiString(FormatFloat("#,##0", size_on_disk/1024))+" KB ("+AnsiString(FormatFloat("#,##0", size_on_disk))+ " байт)";

LName->Caption="Содержит :";

LOpen->Caption=AnsiString("Файлов: ")+num_files+" ; Папок: "+num_folder;

}

else //Если свойства файла

{

SHFILEINFO sfi; //Структура содержащая инфу о файле

ZeroMemory(&sfi,sizeof(sfi)); //Очистка

SHGetFileInfo(Name.c_str(),FILE_ATTRIBUTE_NORMAL,&sfi,sizeof(sfi),

SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME|SHGFI_ICON | SHGFI_LARGEICON ); //Получение данных

TIcon *icon=new TIcon(); //Создание динамической иконки

icon->Handle=sfi.hIcon; //Загрузка в нее дескриптора нужной иконки

IIconFile->Picture->Icon->Assign(icon); //Занесение дескриптора в imagelist

delete icon;

ENameFile->Text=ExtractFileName(Name);

LTypeFile->Caption=(AnsiString)(sfi.szTypeName);//Занесение имени типа

LFolder->Caption=ExtractFilePath(Name); //Занесение каталога

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

//Получение атрибутов - дат размера атрибутов

unsigned long int size=attr.nFileSizeHigh<<16 | attr.nFileSizeLow;

//Вывод размеров

LSize->Caption=AnsiString(size/1024)+" KB ("+AnsiString(size)+ " байт)"; //размера

if((size/byte_in_cluster*byte_in_cluster)!=size) //Проверка влезания файла

size=(size/byte_in_cluster+1)*byte_in_cluster; //в кластеры и наличия свободного места в них

LOnDisk->Caption=AnsiString(size/1024)+" KB ("+AnsiString(size)+ " байт)";

LName->Caption="Открыт :";

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

//Определение дат

//Даты доступа

FileTimeToLocalFileTime(&(attr.ftLastAccessTime), &ft);

FileTimeToSystemTime( &ft, &st);

dt=SystemTimeToDateTime(st);

DateTimeToString(date,"d mmm yyyy г.",dt);

LOpen->Caption=date; //Запись даты доступа

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

}

//Даты создания

FileTimeToLocalFileTime(&(attr.ftCreationTime), &ft);

FileTimeToSystemTime( &ft, &st);

dt=SystemTimeToDateTime(st);

DateTimeToString(date,"d mmm yyyy г., hh:nn:ss",dt);

LCreate->Caption=date; //Запись даты создания

///Даты изменения

FileTimeToLocalFileTime(&(attr.ftLastWriteTime), &ft);

FileTimeToSystemTime( &ft, &st);

dt=SystemTimeToDateTime(st);

DateTimeToString(date,"d mmm yyyy г., hh:nn:ss",dt);

LWrite->Caption=date; //Запись даты изменения

CBArchiv->Checked=attr.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE;

CBReadOnly->Checked=attr.dwFileAttributes & FILE_ATTRIBUTE_READONLY;

CBHide->Checked=attr.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN;

CBSystem->Checked=attr.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM;

ENameFile->Modified=false;

if(FPropertyFile->ShowModal()==mrOk) //Показ формы

Set_Change(Name,attr);

}

void __fastcall TFPropertyFile::BtApplyClick(TObject *Sender)

{ //Щелчок на применить

Set_Change(Name_File,attr); //Вызов функции сохранения изменений

}

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

1.4. Листинг PropertyDrive.cpp

TFPropertyDrive *FPropertyDrive;

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

__fastcall TFPropertyDrive::TFPropertyDrive(TComponent* Owner)

: TForm(Owner)

{

}

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

void TFPropertyDrive::Prepare(AnsiString Name)

{

Name_Drive=Name;

Graphics::TBitmap *i=new Graphics::TBitmap; //Загрузка иконки папки

Caption="Свойства: Диск "+Name.SubString(1,2);

switch(GetDriveType(Name.c_str())) //Загрузка image

{

case DRIVE_REMOVABLE:

LType->Caption="Дисковод";

Form1->ImageList3->GetBitmap(ImageFloppy,i);

break;

case DRIVE_FIXED:

case DRIVE_RAMDISK:

LType->Caption="Жесткий диск";

Form1->ImageList3->GetBitmap(ImageDrive,i);

break;

case DRIVE_CDROM:

LType->Caption="CD-дисковод";

Form1->ImageList3->GetBitmap(ImageCD,i);

break;

default:

LType->Caption="Неизвестный дисковод";

Form1->ImageList3->GetBitmap(ImageWindows,i);

break;

}

IIconDisk->Picture->Bitmap->Assign(i);

delete i;

char volume[20],filesystem[20];

if(GetVolumeInformation(Name.c_str(),volume,20,NULL,NULL,NULL,filesystem,20))

{

ELabelDisk->Text=volume;

LFileSystem->Caption=filesystem;

}

else

{

ELabelDisk->Text="";

LFileSystem->Caption="";

}

__int64 FreeSpace,TotalSpace,TakenSpace;

Chart1->Series[0]->Clear();

if(Sysutils::GetDiskFreeSpaceEx(Name.c_str(),NULL,TotalSpace,&FreeSpace))

{

double c=10.0;

TakenSpace=TotalSpace-FreeSpace;

LTaken1->Caption=AnsiString(FormatFloat("#,##0", TakenSpace))+" байт";

LTaken2->Caption=AnsiString(((TakenSpace*10)/1024/1024/1024)/c)+" ГБ";

LFree1->Caption=AnsiString(FormatFloat("#,##0", FreeSpace))+" байт";

LFree2->Caption=AnsiString(((FreeSpace*10)/1024/1024/1024)/c)+" ГБ";

LCapacity1->Caption=AnsiString(FormatFloat("#,##0", TotalSpace))+" байт";

LCapacity2->Caption=AnsiString(((TotalSpace*10)/1024/1024/1024)/c)+" ГБ";

Image1->Canvas->Brush->Color=clRed;

Image1->Canvas->FillRect(Rect(0,0,Image1->Width,Image1->Height));

Chart1->Series[0]->Add(TakenSpace,"1",clRed);

Image2->Canvas->Brush->Color=clGreen;

Image2->Canvas->FillRect(Rect(0,0,Image2->Width,Image2->Height));

Chart1->Series[0]->Add(FreeSpace,"2",clGreen);

Chart1->View3DOptions->Elevation=290;

}

else

{

LTaken1->Caption="0 байт";

LTaken2->Caption="0 байт";

LFree1->Caption="0 байт";

LFree2->Caption="0 байт";

LCapacity1->Caption="0 байт";

LCapacity2->Caption="0 байт";

Image1->Canvas->Brush->Color=clRed;

Image1->Canvas->FillRect(Rect(0,0,Image1->Width,Image1->Height));

Chart1->Series[0]->Add(100,"1",clRed);

Image2->Canvas->Brush->Color=clGreen;

Image2->Canvas->FillRect(Rect(0,0,Image2->Width,Image2->Height));

Chart1->View3DOptions->Elevation=290;

}

ELabelDisk->Modified=false;

if(FPropertyDrive->ShowModal()==mrOk)

{

if(ELabelDisk->Modified)

SetVolumeLabel(Name.c_str(),ELabelDisk->Text.c_str());

}

}

void __fastcall TFPropertyDrive::BtApplyClick(TObject *Sender)

{

if(ELabelDisk->Modified)

SetVolumeLabel(Name_Drive.c_str(),ELabelDisk->Text.c_str());

ELabelDisk->Modified=false;

}

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

Список использованной литературы

1. А.Я. Архангельский. Программирование в C++ Builder 6. - М.: ЗАО «Издательство БИНОМ», 2003 г. - 1152 с.

2. А.Я. Архангельский. Справочное пособие. Книга 2. Классы и компоненты. - М.: Бином-Пресс, 2002 г. -528 с.

3. http://rsdn.ru/

4. http://www.sources.ru/

5. http://msdn.microsoft.com/

Размещено на Allbest.ru


Подобные документы

  • Понятие файлового менеджера. Специальные программы-оболочки, разработанные для операционной среды DOS. Norton Commander - популярный файловый менеджер для DOS. Обзор файловых менеджеров для операционной системы MS Windows, их основные преимущества.

    курсовая работа [4,3 M], добавлен 07.03.2015

  • Понятие и физическая структура диска, описание способности системы хранить данные. Рассмотрение особенностей файловой системы FAT16. Выявление связи между размером кластера и потерями дискового пространства. Пример создания программы файлового обмена.

    курсовая работа [146,1 K], добавлен 26.10.2015

  • Понятие "службы каталогов" и ее основные характеристики. Схемы, которые описывают типы ресурсов, применяемые в отдельно взятой предметной области. Функции службы каталогов. Группировка сетевых ресурсов в виде дерева. Служба каталогов Active Directory.

    курсовая работа [469,2 K], добавлен 19.06.2014

  • Физическая и логическая структура жёстких дисков персонального компьютера. Методы организации файлов. Процесс форматирования жёсткого диска. Разработка программы, реализующей функции файлового обмена, чтения и записи с образом файловой системы FAT16.

    курсовая работа [166,3 K], добавлен 09.06.2015

  • Стандартные функции для работы с динамической памятью. Представление списков цепочками звеньев. Организация файлового каталога в файловой системе в виде линейного списка на языке Visual C++. Создание блок-схемы и инструкции по работе с программой.

    курсовая работа [252,0 K], добавлен 22.01.2015

  • Структура компилятора PascalABC.NET. Структура дерева и примеры узлов. Упрощенный синтаксис записи модулей. Объявление имен, совпадающих с ключевыми словами. Генерация узла семантического дерева. Сериализация и десериализация узлов семантического дерева.

    курсовая работа [1,8 M], добавлен 18.12.2011

  • Особенности создания программы "Файловый менеджер" в среде объектно-ориентированного программирования Delphi. Назначение и основные функции программы, формулировка задачи. Описание программы, использованные компоненты, интерфейс и порядок применения.

    контрольная работа [1,3 M], добавлен 19.06.2012

  • Понятие сектора. Обобщенная структура диска с FAT. Расчет емкости диска с ФС FAT. Требования к файловой системе высокого уровня. Структура тома NTFS. MFT – главная файловая таблица. Номера кластеров, адреса, отрезки. Резидентные атрибуты файловой записи.

    презентация [68,4 K], добавлен 20.12.2013

  • Составление программной функции, которая вычисляет среднее арифметическое элементов непустого списка. Функция, которая находит наименьший элемент дерева. Нахождение искомых элементов, добавление элементов в дерево. Выведение состояния дерева на экран.

    лабораторная работа [636,3 K], добавлен 02.04.2014

  • Рассмотрение нелинейных динамических структур данных в виде бинарного дерева. Построение дерева двоичного поиска. Реализация трех обходов дерева, выведение обходов на экран компьютера. Разработка текста программы. Симметричноправая прошивка дерева.

    контрольная работа [81,6 K], добавлен 14.12.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.