![]() |
|
|
Курсовая работа: Файловый менеджерСобытие OnDragOver возникает при каждый раз при перемещении перетаскиваемого элемента по объекту. Здесь необходимо определить возможность получения элемента, путем анализа источника и места помещения в приемнике. Наступление события OnDragDrop означает окончание перетаскивания. В обработчике анализируются перемещенный элемент и место его опускания. В соответствии с этими данными, а также производимой операцией, сохраненной в глобальной переменной обработчиком OnMouseDown, осуществляется заполнение буферов frombuf и tobuf и вызов FileAndFolderOperation с соответствующим кодом. 3.1.2 Работа с дискетами и дисками Работа с дискетами и дисками осложнена тем, что отсутствие носителя информации приводит к неоправданному обращению к приводу и появлению различных информационных сообщений на экране, что, безусловно, раздражает пользователя, не работающего с дискетой/диском. Для исключения таких ситуаций для приводов со сменными носителями предусмотрена глобальная переменная DiskIn в виде перечисления. Она включает в себя буквы тех приводов в которые действительно вставлены носители. Проверка таким образом наличия диска/дискеты, необходимая во многих функциях работы с деревом, вроде обновления и т.д, заключается в обращении к этой глобальной переменной. Помещение букв носителей в это множество осуществляется при удачном обращении к приводу со вставленной дискетой/диском. Удаление организуется при первом неудачном обращении к приводу дисков/дискет – имя диска удаляет из множества DiskIn. Результатом введения такой переменной стал запрет доступа к незаполненным приводам. 3.1.3 Свойства файлов, папок и дисков Важной частью файлового менеджера являются средства отображения свойств различных объектов файловой системы. Реализация этих средств была сведена к созданию двух дополнительных форм FPropertyFile и FPropertyDrive, заполняемых необходимыми данными в процессе получение свойств посредством API Windows. Разделение форм было произведено из-за существенного различия типа информации в свойствах дисков и файлов. Предварительное заполнение и отображение формы FPropertyFile осуществляется в пользовательской функции Prepare, получающей в качестве параметра путь к файлу. Ниже перечислены основные отображаемые свойства и методы их получения: иконка файла/папки, тип файла (функция SHGetFileInfo); имя файла/папки (функция ExtractFileName); папки (ExtractFilePath); размера (функция GetFileAttributesEx), размера на диске (функции GetFileAttributesEx и GetDiskFreeSpace для получения информации о размере кластера/сектора); даты создания, изменения, открытия (функции GetFileAttributesEx и FileTimeToLocalFileTime, FileTimeToSystemTime и SystemTimeToDateTime для преобразования даты к удобному виду); свойства файла/папки (функция GetFileAttributesEx). Для определения размера папки и количества, содержащихся в ней объектов, используется рекурсивная функция Get_Size_Folder, обходящая всю иерархическую структуру директории, подсчитывая и суммируя размеры отдельных объектов. Сохранение возможно измененных имени и атрибутов осуществляется в процедуре Set_Change. Аналогично FPropertyFile заполнение полей формы FPropertyDrive производится в процедуре Prepare. Свойства, отображаемые с помощью элементов формы, следующие: иконка (по типу диска функцией GetDriveType); метка диска и тип файловой системы (функция GetVolumeInformation); количество занятого и свободного места (функция GetDiskFreeSpaceEx). Кроме того занятое/свободное место отображается в виде круговой диаграммы – объект класса TChart. Единственным свойством изменение которого возможно является метка диска. Именно она изменяется по нажатию на клавиши OK или «Применить». Вызов функций отображения и подготовки форм осуществляется из процедуры ViewProperty. Единственная задача этой функции - определить какую из форм следует показать. Эта проблема решается путем сравнения пути к отображаемой папке с путем к корневому каталогу диска. 4. Техническая документация Приложение не требует установки. Для его работы следует запустить FileManager.exe. Приложение рекомендуется для работы с файловой системой и файлами. Файловый менеджер позволяет выполнять наиболее частые операции над файлами - создание, открытие/проигрывание/просмотр, редактирование, перемещение, переименование, копирование, удаление, изменение атрибутов и свойств, поиск файлов и назначение прав. При запуске программы создается главная форма, затем приложение ожидает действия пользователя. Каждому предусмотренному действию сопоставлена какая-то функция-обработчик. При нажатии на кнопки «Удалить» и «Создать» программа выводит на экран соответствующие диалоговые окна, где так же есть предусмотренные действия пользователя с объектами на этих формах. После выполнения какого-либо действия, программа возвращается в режим ожидания пользовательских действий. Для завершения работы с Файловым Менеджером пользователю достаточно нажать на кнопку «Закрыть» системного меню, находящуюся в правом верхнем углу окна программы. Выводы Результатом данной курсовой работы является программа для работы с файлами. Программа представляет собой необходимый минимум для выполнения этой задачи. Программа может иметь более развитый интерфейс и двупанельный вид — в общем случае имеют две равноценных панели для списка файлов, а в данном случае программа имеет однопанельный вид. В данной курсовой работе это не было реализовано. Список используемой литературы 1. Общая информация http://yandex.ru/ http://ru.wikipedia.org/ 2. Информация о языке программирования Пауэрс Л., Снелл М. Microsoft Visual Studio 2008 => Microsoft Visual Studio 2008 Unleashed by Lars Powers and Mike Snell. 3. Алгоритмы программы http://www.progz.ru/ Листинги 1.1. Листинг Unit1.h enum {ImageWindows, ImageFloppy, ImageDrive, ImageCD, ImageMyComp,ImageCloseFolder, ImageOpenFolder}; void strcat0(char * &dest,char *source); //Соединение строк с оставлением нулевого символа void finstr(char *dest); unsigned int lengthfinstr(char *dest); struct DROPFILES { DWORD pFiles; // offset of file list POINT pt; // drop point (client coords) BOOL fNC; // is it on NonClient area // and pt is in screen coords BOOL fWide; // WIDE character switch }; class TForm1 : public TForm { __published: // IDE-managed Components TMainMenu *MainMenu1; TMenuItem *NFile; TTreeView *TreeView1; TSplitter *Splitter1; TListView *ListView1; TImageList *ImageList1; TImageList *ImageList2; TMenuItem *NProperty; TImageList *ImageList3; TImageList *ImageList4; TControlBar *ControlBar1; TToolBar *TBMain; void __fastcall TreeView1Expanding(TObject *Sender, TTreeNode *Node, bool &AllowExpansion); void __fastcall TreeView1Compare(TObject *Sender, TTreeNode *Node1, TTreeNode *Node2, int Data, int &Compare); void __fastcall TreeView1Expanded(TObject *Sender, TTreeNode *Node); void __fastcall TreeView1Collapsing(TObject *Sender, TTreeNode *Node, bool &AllowCollapse); void __fastcall TreeView1Editing(TObject *Sender, TTreeNode *Node, bool &AllowEdit); void __fastcall ListView1Compare(TObject *Sender, TListItem *Item1, TListItem *Item2, int Data, int &Compare); void __fastcall ListView1DblClick(TObject *Sender); void __fastcall ListView1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall TreeView1DragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept); void __fastcall TreeView1DragDrop(TObject *Sender, TObject *Source, int X, int Y); void __fastcall TreeView1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall NPropertyClick(TObject *Sender); void __fastcall NOpenClick(TObject *Sender); void __fastcall NExitClick(TObject *Sender); void __fastcall NDeleteClick(TObject *Sender); void __fastcall TBDeleteClick(TObject *Sender); void __fastcall TBPropertyClick(TObject *Sender); void __fastcall TBExitClick(TObject *Sender); void __fastcall NViewClick(TObject *Sender); void __fastcall NPanelClick(TObject *Sender); void __fastcall NStatusBarClick(TObject *Sender); void __fastcall TBUpClick(TObject *Sender); void __fastcall TreeView1Edited(TObject *Sender, TTreeNode *Node, AnsiString &S); void __fastcall ListView1Edited(TObject *Sender, TListItem *Item, AnsiString &S); void __fastcall NRenameClick(TObject *Sender); void __fastcall TBRenameClick(TObject *Sender); void __fastcall NIconClick(TObject *Sender); void __fastcall NSmallIconClick(TObject *Sender); void __fastcall NListClick(TObject *Sender); void __fastcall NReportClick(TObject *Sender); void __fastcall ListView1DragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept); void __fastcall ListView1DragDrop(TObject *Sender, TObject *Source, int X, int Y); void __fastcall TBUpdateClick(TObject *Sender); void __fastcall TreeView1Click(TObject *Sender); void __fastcall TBPasteClick(TObject *Sender); void __fastcall TBCopyClick(TObject *Sender); void __fastcall TBCutClick(TObject *Sender); void __fastcall NUpdateClick(TObject *Sender); void __fastcall NCutClick(TObject *Sender); void __fastcall NPasteClick(TObject *Sender); void __fastcall NCopyClick(TObject *Sender); void __fastcall NSelectAllClick(TObject *Sender); void __fastcall ListView1ColumnClick(TObject *Sender, TListColumn *Column); void __fastcall NSort0Click(TObject *Sender); void __fastcall NCreateFolderClick(TObject *Sender); void __fastcall NFileClick(TObject *Sender); void __fastcall NEditClick(TObject *Sender); void __fastcall ListView1ContextPopup(TObject *Sender, TPoint &MousePos, bool &Handled); void __fastcall TreeView1ContextPopup(TObject *Sender, TPoint &MousePos, bool &Handled); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); void ShowDrives(); void ViewChild(TTreeNode *child); void DeleteChild(TTreeNode *Node); void ViewFailAndFolderInListView(AnsiString dir); void ExpandTreeForFile(AnsiString FileName); int FileAndFolderOperation(char *frombuf, char *tobuf, unsigned int operation); TTreeNode* AddChildInNodeTree(TTreeNode *Node, AnsiString Dir); TListItem *AddItemInListView(TSearchRec sr,AnsiString dir); void ViewProperty(); void OpenFileOrFolder(); //Открыть в Listview файл или папку void DeleteFileOrFolder(); void PrepareBufForOperationInListView(char * &frombuf); AnsiString RenameFileOrFolder(AnsiString); void RecursTree(TTreeNode *node,bool); //Рекурсивное обновление дерева void UpdateTreeView(bool); //Функция запуска рекурсивного обновления дерева void UpdateListView(bool); //Функция обновления listview void UpdateAll(bool); void PasteFileFromClipboard(); //Вставить из буфера void CopyFileToClipboard(bool); //Копировать файлы в буфер void CreateFol(); void UpdateLabel(); } ; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif 1.2. Листинг Unit1.cpp //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <shellapi.h> #include "Unit1.h" #include <winbase.h> #include <vector.h> #include "PropertyFile.h" #include "PropertyDrive.h" #include <ole2.h> #define CFSTR_PREFERREDDROPEFFECT TEXT("Preferred DropEffect") using namespace std; vector <int> set_drive_num; //Вектор с номерами установленных дисков TTreeNode *head, *tpItem; //Голова и темповая переменная //указатель на верхний отображаемый //узел для отсутствия скачков unsigned int type_file_operation_drag_drop; //Тип операции при drag drop AnsiString CurrentDir=""; //Текущий каталог TViewStyle StyleListView=vsReport; Set<char, 'A', 'Z'> DiskIn; bool DragnDrop=true; //Флаг разрешения перетаскивания int ColumnToSort=0; //Номер колонки по которой сортируют int Direct=1; //Направление соритировки //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- void FirstUpOtherDown(char *str) //Опускает все буквы кроме первой
void FirstUpOtherDown(AnsiString &str)
str[1]-=32; void GetDrives() //Определяет установленные диски { //и сохраняет их номера в set_drive_num unsigned int set_drive=GetLogicalDrives(); for(int i=0;set_drive!=0;i++) { if(set_drive%2) set_drive_num.push_back(i); set_drive>>=1; } } void TForm1::ShowDrives() //Отображает диски в дереве { char str[10]; char inf[20]; for(unsigned int i=0;i<set_drive_num.size();i++) { TTreeNode *temp; //Загрузка узла str[0]=(char)('A'+set_drive_num[i]); str[1]='\0'; strcat(str,":\\"); if(set_drive_num[i]!=0 && set_drive_num[i]!=1) //Заполнение информационного поля { if(!GetVolumeInformation(str,inf,20,NULL,NULL,NULL,NULL,NULL)) //Получение метки тома strcpy(inf,""); } else { strcpy(inf,""); } FirstUpOtherDown(inf); AnsiString *p=new AnsiString(str); temp=TreeView1->Items->AddChildObject(head,AnsiString(inf)+" ("+(char)('A'+set_drive_num[i])+":)",p); switch(unsigned int p=GetDriveType(str)) //Загрузка image { case DRIVE_REMOVABLE: temp->SelectedIndex=ImageFloppy; temp->ImageIndex=ImageFloppy; break; case DRIVE_FIXED: case DRIVE_RAMDISK: temp->SelectedIndex=ImageDrive; temp->ImageIndex=ImageDrive; break; case DRIVE_CDROM: temp->SelectedIndex=ImageCD; temp->ImageIndex=ImageCD; break; default: temp->SelectedIndex=ImageWindows; temp->ImageIndex=ImageWindows; break; } } } TTreeNode* TForm1::AddChildInNodeTree(TTreeNode *Node, AnsiString Dir) { AnsiString temp=Dir; AnsiString Name=ExtractFileName(temp.SetLength(temp.Length()-1)); FirstUpOtherDown(Name); AnsiString *p=new AnsiString(Dir); //Добавляем новый потомок к treeview TTreeNode *t=TreeView1->Items->AddChildObject(Node,Name,p); t->ImageIndex=ImageCloseFolder; t->SelectedIndex=ImageOpenFolder; return t; //Возвращаем указатель на него } void TForm1::ViewChild(TTreeNode *Node) //Отображение детей узла в treeview { //Перебор детей открывамого узла TTreeNode *child=Node->getFirstChild(); TSearchRec sr; AnsiString dir,name; do
do while((child=Node->GetNextChild(child))!=NULL); } void TForm1::DeleteChild(TTreeNode *Node) //Удаление потомков потомков узла (их уже не видно) { TTreeNode *child=Node->getFirstChild(); TTreeNode *childchild; do while((childchild=child->getFirstChild())!=NULL) { delete childchild->Data; TreeView1->Items->Delete(childchild); } while((child=Node->GetNextChild(child))!=NULL); } bool CheckExpandedChild(TTreeNode *Node) //Проверка раскрытия ветви хотя бы одного
do int TForm1::FileAndFolderOperation(char *frombuf, char *tobuf, unsigned int operation) { //Осуществление операций над файлами - копирование, перемещение //удаление, переименование SHFILEOPSTRUCT OpStruc; OpStruc.hwnd= Handle; OpStruc.wFunc= operation; OpStruc.pFrom= frombuf; OpStruc.pTo=tobuf; OpStruc.fFlags=0; OpStruc.fAnyOperationsAborted= false; OpStruc.hNameMappings= NULL; OpStruc.lpszProgressTitle= NULL; int p=SHFileOperation(&OpStruc); return p; } TListItem *TForm1::AddItemInListView(TSearchRec sr,AnsiString dir) { //Добавление записи в listview из sr и каталога dir TListItem *p; AnsiString date; int size=sr.Size/1024; p=ListView1->Items->Add(); //Добавление нового элемента FirstUpOtherDown(sr.Name); //Выравнивание у имени символов DateTimeToString(date,"dd/mm/yy h:nn",FileDateToDateTime(sr.Time)); AnsiString *a; if(sr.Attr & faDirectory) { a=new AnsiString(dir+sr.Name+"\\"); //Сохранение полного имени для доступа p->SubItems->Add(""); //Для директорий (папок) p->SubItems->Add("Папка"); p->ImageIndex=ImageCloseFolder; } else
icon->Handle=sfi.hIcon; p->SubItems->Add(date); //4 Добавление даты p->Data=a; p->Caption=sr.Name; //1 Запись названия return p; } void TForm1::ViewFailAndFolderInListView(AnsiString dir) { //Отображение в listview папки указанной dir for(int i=0;i<ListView1->Items->Count;i++) delete ListView1->Items->Item[i]->Data; //Очистка данных о полном пути к файлам ImageList2->Clear(); ImageList4->Clear(); ListView1->Clear(); //Очистка списка ImageList2->AddImages(ImageList1); ImageList4->AddImages(ImageList3); AnsiString path=dir.SubString(1,3); //Извлечение названия корневого каталога char inf[20]; unsigned int p=GetDriveType(path.c_str()); if(p==DRIVE_REMOVABLE || p==DRIVE_CDROM) { if(GetVolumeInformation(path.c_str(),inf,20,NULL,NULL,NULL,NULL,NULL)) { if(!(DiskIn.Contains(path[1]))) DiskIn<<path[1]; UpdateTreeView(false); UpdateLabel(); } else { UpdateTreeView(false); if(DiskIn.Contains(path[1])) DiskIn>>path[1]; UpdateLabel(); CurrentDir=""; return; } } while(ExtractFileDrive(dir).AnsiCompareIC(dir)!=0 && GetFileAttributes(dir.c_str())==-1) dir=ExtractFilePath(dir.SetLength(dir.Length()-1)); TSearchRec sr; if(FindFirst(dir+"*",faAnyFile,sr)!=0) //Просмотр папок в детях return; do
while(FindNext(sr)==0); FindClose(sr); CurrentDir=dir; //Запоминание текущего каталога double c=10.0; __int64 FreeSpace,TotalSpace; if(Sysutils::GetDiskFreeSpaceEx(ExtractFileDrive(dir).c_str(),NULL,TotalSpace,&FreeSpace)) StatusBar1->SimpleText=AnsiString("Объектов: ")+ListView1->Items->Count+" (Свободно на диске "+ AnsiString(((FreeSpace*10)/1024/1024/1024)/c)+" ГБ)";
} void TForm1::ViewProperty() //Отображение свойств файла папки диска { if(CurrentDir=="") return; if(ListView1->ItemFocused==NULL) { if(TreeView1->Selected!=NULL) { if(TreeView1->Selected->Level==1) FPropertyDrive->Prepare(*((AnsiString *)(TreeView1->Selected->Data))); else if(TreeView1->Selected->Level>1) FPropertyFile->Prepare(*((AnsiString *)(TreeView1->Selected->Data))); } } else { if(ListView1->Selected!=NULL) FPropertyFile->Prepare(*((AnsiString *)(ListView1->Selected->Data))); else { if(ExtractFileDrive(CurrentDir).AnsiCompareIC(CurrentDir.SubString(1,CurrentDir.Length()-1))==0) FPropertyDrive->Prepare(CurrentDir); else FPropertyFile->Prepare(CurrentDir); } } UpdateAll(true); } void TForm1::PrepareBufForOperationInListView(char * &frombuf) //Подготовка буфера данных { //над которыми производится опер frombuf=new char[ListView1->SelCount*MAX_PATH+1]; if(ListView1->SelCount==1) //Если выделен один элемент то все просто { //заполняем frombuf именем AnsiString sourcestr=*((AnsiString *)(ListView1->Selected->Data)); if((FileGetAttr(sourcestr) & faDirectory)!=0) sourcestr.SetLength(sourcestr.Length()-1); strcpy(frombuf,sourcestr.c_str()); finstr(frombuf); } else { char *temp=frombuf; bool flag=false; //Если несколько последовательно заполняем именами for(int i=0;i<ListView1->Items->Count;i++) if(ListView1->Items->Item[i]->Selected) { AnsiString sourcestr=*((AnsiString *)(ListView1->Items->Item[i]->Data)); if((FileGetAttr(sourcestr) & faDirectory)!=0) sourcestr.SetLength(sourcestr.Length()-1); if(flag) strcat0(temp,sourcestr.c_str()); else { strcpy(temp,sourcestr.c_str()); flag=true; } } finstr(temp); } } AnsiString TForm1::RenameFileOrFolder(AnsiString NewName) { char frombuf[MAX_PATH+1]={'\0'},tobuf[MAX_PATH+1]={'\0'}; if(ListView1->ItemFocused==NULL) { if(TreeView1->Selected!=NULL) if(TreeView1->Selected->Level>1) { AnsiString temp; AnsiString *sourcestr=((AnsiString *)(TreeView1->Selected->Data)); temp=*sourcestr; //Сохранение в темповой переменной старого пути sourcestr->SetLength(sourcestr->Length()-1); strcpy(frombuf,sourcestr->c_str()); //Построение нового пути *sourcestr=ExtractFilePath(*sourcestr)+NewName; strcpy(tobuf,sourcestr->c_str()); if(FileAndFolderOperation(frombuf,tobuf,FO_RENAME)!=0) //Если операция не удалась { *sourcestr=temp; //Возвращаем назад NewName=ExtractFileName(temp.SubString(1,temp.Length())); } else *sourcestr=*sourcestr+"\\"; //Если нормально меняем путь return NewName; } } else if((ListView1->Selected)!=NULL) { bool dir=false; AnsiString *sourcestr=((AnsiString *)(ListView1->Selected->Data)); AnsiString temp=*sourcestr; if((FileGetAttr(*sourcestr) & faDirectory)!=0) { sourcestr->SetLength(sourcestr->Length()-1); |
|
|||||||||||||||||||||||||||||
![]() |
|
Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое. |
||
При использовании материалов - ссылка на сайт обязательна. |