![]() |
|
|
Курсовая работа: Файловый менеджерdir=true; } strcpy(frombuf,sourcestr->c_str()); *sourcestr=ExtractFilePath(*sourcestr)+NewName; strcpy(tobuf,sourcestr->c_str()); if(FileAndFolderOperation(frombuf,tobuf,FO_RENAME)!=0) { *sourcestr=temp; if(dir) temp.SetLength(temp.Length()-1); NewName=ExtractFileName(temp); } else if(dir) *sourcestr=*sourcestr+"\\"; return NewName; } } void TForm1::DeleteFileOrFolder() { if(ListView1->ItemFocused==NULL) { if(TreeView1->Selected!=NULL) if(TreeView1->Selected->Level>1) { char frombuf[MAX_PATH]={'\0'}; AnsiString sourcestr=*((AnsiString *)(TreeView1->Selected->Data)); sourcestr.SetLength(sourcestr.Length()-1); strcpy(frombuf,sourcestr.c_str()); FileAndFolderOperation(frombuf,NULL,FO_DELETE); } } else if((ListView1->Selected)!=NULL) { char *frombuf; PrepareBufForOperationInListView(frombuf); FileAndFolderOperation(frombuf,NULL,FO_DELETE); } UpdateAll(false); } void TForm1::ExpandTreeForFile(AnsiString FileName) { //Расширение ветвей tree до файла AnsiString Find=""; TTreeNode *p=TreeView1->Items->Item[0], *child; child=p->getFirstChild(); bool flag=false; do { flag=false; int pos=FileName.Pos("\\"); //Вычленение из имени файла папки Find=Find+FileName.SubString(1,pos); //прибавление к find FileName.Delete(1,pos); if(FileName.Pos("\\")==0) flag=true; //Критерий окончания child=p->getFirstChild(); while(1) { if(child==NULL) { child=AddChildInNodeTree(p,Find); //Если узла вообще нет то создаем его if(!p->Expanded) //и расширяем его отца p->Expand(false); } if((*(AnsiString *)(child->Data)).AnsiCompareIC(Find)==0) { if (flag) //По окончании передаем выделение на этот узел TreeView1->Selected=child; else if(!child->Expanded) //если это толлько промежуточная папка child->Expand(false); //расширяем ветвь p=child; break; } child=p->GetNextChild(child); } } while(!flag); } void TForm1::OpenFileOrFolder() { //Происходит открытие файла или папки выделенных в listview if(ListView1->Selected==NULL) return; //проверка наличия выделенного AnsiString ww=*((AnsiString *)(ListView1->Selected->Data)); if((FileGetAttr(ww) & faDirectory)!=0) //В случае папки { ViewFailAndFolderInListView(ww); //Вызываем отображение папок и файлов ExpandTreeForFile(ww); //Расширяем treeview до этого файла } else { ShellExecute(NULL,"open",ww.c_str(),NULL,NULL,SW_RESTORE); //В случае файла if(GetLastError()) //Выполняем его и проверяем ошибки lpMsgBuf ); } } void RecursDelData(TTreeNode *node) //Рекурсивная функция обходит { // дочерние узлы и удаляет данные по указателю data delete node->Data; TTreeNode *child; for(child=node->getFirstChild();child!=NULL;child=node->GetNextChild(child)) RecursDelData(child); } void TForm1::RecursTree(TTreeNode *node,bool UpdateAllways) { AnsiString dir=*((AnsiString *)(node->Data)); TSearchRec sr; TTreeNode *child; int num=0; if(((GetDriveType(dir.c_str())==DRIVE_REMOVABLE) || (GetDriveType(dir.c_str())==DRIVE_CDROM)) && !DiskIn.Contains(ExtractFileDrive(dir)[1])) 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) //Даем возможность положить объект если есть куда класть и объект из list и tree //--------------------------------------------------------------------------- void __fastcall TForm1::ListView1DragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept) 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 //Если свойства файла //Проверка влезания файла //Даты создания 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 с. 4. http://www.sources.ru/ |
![]() |
||
НОВОСТИ | ![]() |
![]() |
||
ВХОД | ![]() |
|
Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое. |
||
При использовании материалов - ссылка на сайт обязательна. |