Файловый менеджер
Простой и быстрый переход по иерархической файловой системе. Наличие файлового менеджера. Ряд глобальных переменных. Основные пользовательские функции. Основная идея формирования дерева. Функция добавления записи в список. Обновление дерева каталогов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 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(),§or_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