на тему рефераты
 
Главная | Карта сайта
на тему рефераты
РАЗДЕЛЫ

на тему рефераты
ПАРТНЕРЫ

на тему рефераты
АЛФАВИТ
... А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я

на тему рефераты
ПОИСК
Введите фамилию автора:


Курсовая работа: Файловый менеджер


Событие 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. Приложение рекомендуется для работы с файловой системой и файлами. Файловый менеджер позволяет выполнять наиболее частые операции над файлами - создание, открытие/проигрывание/просмотр, редактирование, перемещение, переименование, копирование, удаление, изменение атрибутов и свойств, поиск файлов и назначение прав.


5. Экспериментальная часть

При запуске программы создается главная форма, затем приложение ожидает действия пользователя. Каждому предусмотренному действию сопоставлена какая-то функция-обработчик.

При нажатии на кнопки «Удалить» и «Создать» программа выводит на экран соответствующие диалоговые окна, где так же есть предусмотренные действия пользователя с объектами на этих формах.

После выполнения какого-либо действия, программа возвращается в режим ожидания пользовательских действий.

Для завершения работы с Файловым Менеджером пользователю достаточно нажать на кнопку «Закрыть» системного меню, находящуюся в правом верхнем углу окна программы.


Выводы

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

Программа может иметь более развитый интерфейс и двупанельный вид — в общем случае имеют две равноценных панели для списка файлов, а в данном случае программа имеет однопанельный вид. В данной курсовой работе это не было реализовано.


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

1.  Общая информация

http://yandex.ru/

http://www.google.ru/

http://ru.wikipedia.org/

2.  Информация о языке программирования

http://www.itkursi.ru/

Пауэрс Л., Снелл М. Microsoft Visual Studio 2008 => Microsoft Visual Studio 2008 Unleashed by Lars Powers and Mike Snell.

3.  Алгоритмы программы

http://program.rin.ru/

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);

Страницы: 1, 2, 3


на тему рефераты
НОВОСТИ на тему рефераты
на тему рефераты
ВХОД на тему рефераты
Логин:
Пароль:
регистрация
забыли пароль?

на тему рефераты    
на тему рефераты
ТЕГИ на тему рефераты

Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое.


Copyright © 2012 г.
При использовании материалов - ссылка на сайт обязательна.