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

 

Введение


Файловые менеджеры - это программы упрощающие и ускоряющие работу с файлами. Они позволяют как создавать, так и удалять файлы, редактировать, копировать, перемещать и многое другое.

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

Проект состоит, помимо файлов, создаваемых системой программирования автоматически, из четырех модулей (Unit1.c, Unit2.c, Unit3.c и Unit4.c).

Раздел «Анализ задания и постановка задач» описывает процесс постановки задачи. Здесь определяются входные и выходные данные для программы.

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

Раздел «Проектирование программы». Данный раздел предоставляет непосредственно информацию о компонентах, которые участвовали при создании программы, описывается их назначение в каждом участке программы.

Раздел «Реализация программы». Данный раздел предоставляет детальное описание работы программы, её функций.

Раздел «Тестирование программы» предоставляет информацию об объекте тестирования, необходимых инструментах тестирования, способе его проведения и результатах, полученных в результате его проведения.

В разделе «Заключение» подводится итог выполнения курсовой работы. Описываются полученные результаты.

В разделе «Литература» приводится список литературы, использованной в ходе выполнения курсовой работы.

В приложении «А» приводится функциональная схема программы.

Приложение «Б» содержит листинг программы.

1. Анализ задания и постановка задач


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

Программа должна осуществлять:

просмотр файлов и каталогов;

копирование файлов и каталогов;

удаление файлов и каталогов;

перемещение файлов и каталогов;

создание новой директории.


. Теоретическая часть


Курсовой проект выполнен в системе визуального программирования Borlandâ C++Builderä 6.0, с использованием библиотеки визуальных компонентов (VCL) и функций Windows API.â C++Builderä 6.0 представляет собой совершенную интерактивную среду программирования на языке C++. Система обеспечивает высокую продуктивность и производительность, удовлетворяя современным требованиям к разработке приложений под Windows.

Файловые менеджеры - это программы-оболочки для работы с операционной системой. С помощью файлового менеджера пользователи могут просматривать, копировать, удалять и создавать каталоги и файлы, запускать программы и т.д. Одним из первых файловых менеджеров является Norton Commander для работы с ОС DOS, созданный Питером Нортоном. В нем впервые использован двухпанельный интерфейс. В файловом менеджере экран делится на две самостоятельные области или панели, в каждой из которых отображается содержимое каталогов и файлов на дисках. Файловый менеджер Norton Commander является основоположником класса программ - классических файловых менеджеров. К классическим файловым менеджерам относятся: DOS Navigator, FAR Manager, Volkov Commander, Windows Commander и т.д.

Классические файловые менеджеры унаследовали комбинации клавиш Norton Commander. В настоящее время опытные пользователи ПК для работы с ОС Windows предпочитают использовать файловые менеджеры FAR или Total Commander. Многие пользователи предпочитают использовать FAR Manager по причине наличия огромного количества дополнительных модулей или плагинов, которые позволяют расширить функциональность файлового менеджера.


3. Проектирование программы


Программа содержит 3 формы: Form1 - главная форма программы, FormDialogCreateDir - форма для создания нового каталога, FormDialogDelete - форма для удаления каталога.

Все глобальные константы объявлены в программе с помощью директивы define. LEFT=1 и RIGHT=0 - используется для обозначения панели, над которой производятся действия._DELETER=5 используется в Delete для выбора действия «помещение в корзину.

Используются глобальные переменные:(тип int) изменяет значение, когда в LitsDevicesLeft (ListDevicesRight) происходит выбор устройства либо происходит нажатие на bCurrentRootDirLeft (bCurrentRootDirRight). Используется для передачи в HendlerOfOpen.и RootDirRight (тип AnsiString) - текущий путь корневой директории. Используется для передачи в HendlerOfOpen.,CurrentPathRight (тип AnsiString) - текущий путь. Возвращается HendlerOfOpen. Используется для передачи в Delete, CreateFolder,CopyOrRemove.(тип int) - принимает только два значения: LEFT и RIGHT. Используется для указания активной панели.

В главном модуле (Unit1), находится описание главной формы программы, создаваемой при ее запуске, в теле этого модуля находятся исходные тексты обработчиков событий, порождаемых теми или иными действиями пользователя в главной форме программы (Form1).

Во втором модуле (Unit2) описаны все функции, на вызове которых строится работа программы, кроме функций-обработчиков событий. В хедере этого модуля объявлены глобальные константы и переменные, а так же находятся прототипы функций, вызываемых из других модулей.

В третьем модуле (Unit3) находится описание и функции-обработчики событий для формы (FormDialogCreateDir), являющейся диалоговым окном создания новой директории.

В четвертом модуле (Unit4) находится описание и функции-обработчики событий для формы (FormDialogDelete), являющейся диалоговым окном удаления или помещения в корзину.


4. Реализация программы


При запуске программы создается главная форма Form1 - представитель класса TForm в соответствии с рисунком 4.1. При создании формы создаются списки доступных устройств, отображаемые в FileListLeft и FileListRigh, в обеих панелях отображается корневая директория диска C:\, поскольку нами было сделано предположение, что этот логический диск должен быть практически на всех компьютерах, так же создается множество атрибутов директории DirAttribSet, используемое функциями второго модуля.

В Form1 реализовано одно событие: Create (создание, функция-обработчик: FormCreate). Далее опишем объекты, расположенные на Form1.и FileListRight - представителями класса TStringGrid (строковая таблица). Выполняют функцию панелей, куда происходит отображение содержимого директорий и где пользователь выбирает файл (каталог), над которым он собирается выполнять какое-либо действие. Здесь большое значение имеет понятие «активная панель». Роль активной панели играет та таблица, к которой в данный момент обращается пользователь. Все операции совершаются с файлами (каталогами), отображенными в активной панели (копирование и перемещение осуществляется в папку, содержимое который в данный момент отображено в неактивной панели). В программе предусмотрен разный вид для активной и неактивной панелей. В FileListLeft и FileListRigh реализованы следующие события: DblClick (двойной клик мыши, функции-обработчики: FileListLeftDblClick и FileListRightDblClick), Enter (вход, что означает, что панель становится активной, функции-обработчики: FileListLeftEnter и FileListRightEnter), KeyDown («горячие клавиши», функции-обработчики: FileListLeftKeyDown и FileListRightKeyDown).и ListDevicesRight - представители класса TComboBox (выпадающий список выбора). Являются списками доступных устройств хранения информации. Выбор пользователем какого-либо устройства из этого списка означает переход к корневой директории этого устройства, которая отображается в соответствующей панели, становящейся при этом активной. В случае, если корневые директории в обеих панелях после выбора совпадают, то в активной панели отображается содержимое той же папки, что и в неактивной. В ListDevicesLeft и ListDevicesRight реализованы следующие события: - Select (выбор пункта в списке, функции-обработчики: ListDevicesLeftSelect и ListDevicesRightSelect), Enter (вход, что означает, что соответствующая панель становится активной, функции-обработчики: FileListLeftEnter и FileListRightEnter)., bCopy, bCreateDir, bDelete, bCurrentRootDirLeft и bCurrentRootDirRight - представители класса TButton (кнопка). Кнопки выполняют различные функции. Во всех кнопках реализовано только одно событие - Click (нажатие, функции обработчики: bCreateDirClick, bDeleteClick, bCopyClick, bRemoveClick, bCurrentRootDirLeftClick и bCurrentRootDirRightClick). При нажатии на bRemove происходит перемещение файла (каталога, со всеми вложенными каталогами) из папки, отображенной в активной панели, в папку, отображенную в неактивной. Нажатие bCopy практически аналогично нажатию на bRemove. только происходит копирование, а не перемещение. Нажатие на bCreateDir выводит диалог создания каталога FormDialogCreateDir. Нажатие на bDelete выводит диалог удаления или помещения в корзину FormDialogDelete. При нажатии на bCurrentRootDirLeft или bCurrentRootDirRight в соответствующих панелях происходит отображение корневой директории текущего устройства хранения информации.и LabelCurrentPathRight - представители класса TLabel (надпись). В этих объектах отображаются текущие пути панелей.


Рисунок 4.1 - Главная форма программы


При нажатии на кнопку формы Form1 bCreateDir на экран выводится форма FormDialogCreateDir - представитель класса TForm в соответствии с рисунком 4.2.


Рисунок 4.2 - Форма создания нового каталога


Опишем объекты, расположенные на FormDialogCreateDir.- представитель класса TEdit (поле ввода). Поле, куда пользователь вводит имя нового каталога. В edNewDirName реализовано событие KeyDown («горячие клавиши», функция-обработчик edNewDirNameKeyDown).- представитель класса TLabel (надпись). Содержит надпись «Имя нового создаваемого каталога».и bCancel - представители класса TButton (кнопка). В bOk и bCancel реализовано одно событие: Click (нажатие, функции-обработчики: bOkClick и bCancelClick). При нажатии на bOk, если введенное имя правильное (т.е. не содержит зарезервированных символов и слов и не совпадает с именем каталога в активной панели) или нет других ошибок (например, нет прав доступа), создается каталог в папке, отображенной в активной панели, и форма скрывается, в противном случае выдается сообщение об ошибке и предлагается повторить ввод. При нажатии на bCancel форма скрывается без выполнения каких-либо других действий.

При нажатии на кнопку формы Form1 bDelete на экран выводится форма FormDialogDelete - представитель класса TForm в соответствии с рисунком 4.3.

Рисунок 4.3 - Форма для удаления каталога


Опишем объекты на FormDialogDelete:- представитель класса TLabel (надпись). Содержит надпись «Выберете действие:»., bCancel, bRecycler - представители класса TButton (кнопка). В bDelete, bCancel, bRecycler реализовано одно событие: Click (нажатие, функции-обработчики: bDeleteClick, bCancelClick и bRecyclerClick). При нажатии на bDelete файл (каталог), находящийся в фокусе в активной панели, удаляется. При нажатии на bRecycler, файл (каталог), находящийся в фокусе в активной панели, помещается в корзину. При нажатии на bCancel форма скрывается без выполнения каких-либо других действий.

Рассмотрим функции реализации операций:

) CreateListOfDevices.

Создает список корневых директорий доступных устройств хранения информации и отображает этот список в ListDevicesLeft и ListDevicesRight.

Функции не передаются параметры. Не возвращает значения.

Используется функция Windows API GetDriveType.

) ScanDir.

Функции предается строка, заканчивающаяся нулем (char Path[]), содержащая путь к директории, в которой производится поиск всех содержащихся в ней папок и файлов и переменная (int Panel), в зависимости от значения которой формируется либо DequeFindLeft (если Panel=LEFT) или DequeFindRight (если Panel=RIGHT).

Используются три функции Windows API:FindFirstFile, FindNextFile, FindClose.

Вызывается в ViewDirectory.(DequeFindRight) - это контейнер библиотеки стандартных шаблонов, являющийся очередью deque, элементами которой являются структуры типа WIN32_FIND_DATA. Тип WIN32_FIND_DATA описан в winbase.h. Ссылка на структуру передается в FindFirstFile и FindNextFile.

) StrucFindToFileProp.

Преобразует структуру типа WIN32_FIND_DATA в _FileProperty.

Функции передается структура типа WIN32_FIND_DATA и ссылка на структуру типа _FileProperty. Не возвращает значения.

Вызывается в ViewDirectory.

Тип _FileProperty описывается в начале модуля и используется для отображения результатов работы ScanDir в FileListLeft (FileListRight), т.к. некоторые поля WIN32_FIND_DATA не адаптированы для вывода.

) ViewDirectory. Отображает содержимое папки, путь к которой передается в Path[] в активной панели.

Функции предается строка, заканчивающаяся нулем (char Path[]), содержащая путь, который передается в ScanDir, и переменная (int Panel), передаваемая в ScanDir, и в зависимости от значения которой, результаты отображаются в FileListLeft (если Panel=LEFT) или FileListRight (если Panel=RIGHT). Не возвращает значения.

Вызывается в HandlerOfOpen, CreateFolder, CopyOrRemove и Deleting.

) HandlerOfOpen.

В зависимости от действий пользователя, выполняет различные операции. Если происходит выбор в ListDevicesLeft (ListDevicesRight), то отображается корневая директория, выбранного устройства при условии, что корневые директории панелей не сосвпадают, иначе в активной панели отображается открытая папка неактивной панели. Если происходит нажатие на bCurrentRootDirLeft (bCurrentRootDirRight), то отображается корневая директория текущего устройсва. Если происходит двойной клик (нажатие клавиши Enter) по FileListLeft (FileListRight), то анализируется, какая строка находится сейчас в фокусе, и в зависимости от содержимого, выполняются различные операции. Если в фокусе находится файл, то он открывается приложением, с которым ассоциирован либо, если это приложение, производится его запуск. Если в фокусе находится папка, то отображается ее содержимое. Все действия совершаются с активной панелью.

Функции передается срока, путь к корневой директории устройства (AnsiString RootDir), активная панель (int Panel) и признак смены корневой директории (int DirSel). Возвращает текущий путь активной директории.

Используется функция Windows API ShellExecute.

) CreateFolder.

Создает директорию в активной панели.

Функции передается указание на то, какая сейчас панель активна (int Panel). Возвращает значение типа bool, в зависимости от результатов выполнения операции. Функция создает каталог в пути панели, являющейся активной. В качестве текущего пути в каждой панели используются значения соответствующих глобальных переменных.

Используются функции Windows API: CreateDirectory и MessageBox.

) Deleting.

Удаляет или помещает в корзину объект (файл или папку, со всеми ее вложенными папками), находящийся в фокусе в активной панели.

В функцию передается признак активной панели (int Panel) и операция (int Operation), которую надо совершить, т.е. удалить или поместить в корзину. Не возвращает значения.

Используется функция Windows API SHFileOperation.

) CopyOrRemove.

Перемещает или копирует объект (файл или папку, со всеми ее вложенными папками), находящийся в фокусе в активной панели в папку неактивной панели.

В функцию передается признак активной панели (int Panel) и операция (int Operation), которую надо совершить, т.е. копировать или переместить. Не возвращает значения.

Используется функция Windows API SHFileOperation.


5. Тестирование программы


После запуска программы Project1 на экране появится главное окно программы в соответствии с рисунком 5.1


Рисунок 5.1 - Главное окно программы


Далее программа ожидает дальнейших действий пользователя.

Для того, чтобы скопировать какую-либо папку или файл с одного диска на другой необходимо выбрать эту папку или диск путем нажатия в одной из области, а на второй области выбрать жесткий диск и папку куда необходимо скопировать и нажать на кнопку Копировать. Если пользователь выбрал одинаковые названия каталогов или файлов для копирования, пользователь будет выведено сообщение в соответствии с рисунком 5.2.


Рисунок 5.2 - Подтверждение замены папки


Такое же сообщение будет выведено если пользователь выбрал каталог или файл, которые существуют на другом диске при нажатии на кнопку Переместить.

Если пользователем для копирования или перемещения выбран один и тот же жесткий диск и название выбранного каталога и файла одинаковы, то пользователю будет выдано сообщение в соответствии с рисунком 5.3


Рисунок 5.3 - Сообщение об ошибке


При создание нового каталога путем нажатия на кнопку Создать появиться диалоговое окно в соответствии с рисунком 5.4 для ввода имени нового каталога. Если имя нового каталога будет совпадать с именем уже существующего каталога, то пользователю будет выведено сообщение в соответствии с рисунком 5.5.

Рисунок 5.4 - Создание нового каталога


Рисунок 5.5 - Сообщение об ошибке


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


Рисунок 5.6 - Сообщение для подтверждения на удаление

Заключение


В ходе выполнения курсового проекта была создана программа «Файловый менеджер». В ней были реализованы следующие функции:

просмотр файлов и каталогов;

копирование файлов и каталогов;

удаление файлов и каталогов;

перемещение файлов и каталогов;

создание новой директории.

Созданный файловый менеджер был выполнен в системе визуального программирования Borlandâ C++Builderä 6.0, с использованием библиотеки визуальных компонентов (VCL) и функций Windows API.

В программе было создано 3 формы: главная форма программы, форма для создания нового каталога, форма для удаления каталога.

В данную программу при необходимости можно внести изменения. А именно улучшение дизайна главной формы и добавление новых функций и возможностей.

Литература


1. <#"justify">Приложение А

программа переменная каталог

Блок-схема взаимодействия компонентов программы





Приложение Б


Исходные тексты модулей разработанного приложения

.cpp

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

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

#include "Unit2.h"

#include "Unit3.h"

#include "Unit4.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"*Form1;

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

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------__fastcall TForm1::FormCreate(TObject *Sender)

{();();="C:\;="C:\;=1;=HandlerOfOpen(RootDirLeft, LEFT, DirSel);=HandlerOfOpen(RootDirRight, RIGHT, DirSel);

}__fastcall TForm1::FileListLeftDblClick(TObject *Sender)

{DirSel=0;=HandlerOfOpen(RootDirLeft, LEFT, DirSel);

}__fastcall TForm1::FileListRightDblClick(TObject *Sender)

{DirSel=0;=HandlerOfOpen(RootDirRight,RIGHT, DirSel);

}__fastcall TForm1::ListDevicesLeftSelect(TObject *Sender)

{RootDirLeft=Form1->ListDevicesLeft->Text.Delete(3,(Form1->ListDevicesLeft->Text.Length()-2));=1;=HandlerOfOpen(RootDirLeft, LEFT, DirSel);->FileListLeft->SetFocus();

}__fastcall TForm1::ListDevicesRightSelect(TObject *Sender)

{=Form1->ListDevicesRight->Text.Delete(3,(Form1->ListDevicesRight->Text.Length()-2));=1;=HandlerOfOpen(RootDirRight, RIGHT, DirSel);->FileListRight->SetFocus();

}__fastcall TForm1::FileListLeftEnter(TObject *Sender)

{=LEFT;->LabelCurrentPathLeft->Color=0x00E9E9E9;->ListDevicesLeft->Color=0x00E9E9E9;->FileListLeft->Color=clGradientInactiveCaption;->LabelCurrentPathRight->Color=0x00C4C4C4;->ListDevicesRight->Color=0x00C4C4C4;->FileListRight->Color=0x00C4C4C4;

}__fastcall TForm1::FileListRightEnter(TObject *Sender)

{=RIGHT;->LabelCurrentPathRight->Color=0x00E9E9E9;->ListDevicesRight->Color=0x00E9E9E9;->FileListRight->Color=clGradientInactiveCaption;->LabelCurrentPathLeft->Color=0x00C4C4C4;->ListDevicesLeft->Color=0x00C4C4C4;->FileListLeft->Color=0x00C4C4C4;

}__fastcall TForm1::ListDevicesLeftEnter(TObject *Sender)

{->LabelCurrentPathLeft->Color=0x00E9E9E9;->ListDevicesLeft->Color=0x00E9E9E9;->FileListLeft->Color=clGradientInactiveCaption;->LabelCurrentPathRight->Color=0x00C4C4C4;->ListDevicesRight->Color=0x00C4C4C4;->FileListRight->Color=0x00C4C4C4;

}__fastcall TForm1::ListDevicesRightEnter(TObject *Sender)

{->LabelCurrentPathRight->Color=0x00E9E9E9;->ListDevicesRight->Color=0x00E9E9E9;->FileListRight->Color=clGradientInactiveCaption;->LabelCurrentPathLeft->Color=0x00C4C4C4;->ListDevicesLeft->Color=0x00C4C4C4;->FileListLeft->Color=0x00C4C4C4;

}__fastcall TForm1::bCreateDirClick(TObject *Sender)

{>Show();

}__fastcall TForm1::bDeleteClick(TObject *Sender)

{>Show();>bRecycler->SetFocus();

}__fastcall TForm1::bCopyClick(TObject *Sender)

{(Panel,FO_COPY);

}__fastcall TForm1::bRemoveClick(TObject *Sender)

{(Panel,FO_MOVE);

}__fastcall TForm1::FileListLeftKeyDown(TObject *Sender, WORD &Key,TShiftState Shift)

{(Key)

{13: DirSel=0;=HandlerOfOpen(RootDirLeft, LEFT, DirSel);;116: CopyOrRemove(Panel,FO_COPY);;117: CopyOrRemove(Panel,FO_MOVE);;118: FormDialogCreateDir->Show();;119: FormDialogDelete->Show();>bRecycler->SetFocus();;

}}__fastcall TForm1::FileListRightKeyDown(TObject *Sender, WORD &Key,Shift)

{switch (Key)

{case 13: DirSel=0;=HandlerOfOpen(RootDirRight, RIGHT, DirSel);;116: CopyOrRemove(Panel,FO_COPY);;117: CopyOrRemove(Panel,FO_MOVE);;118: FormDialogCreateDir->Show();;119: FormDialogDelete->Show();>bRecycler->SetFocus();;

}}__fastcall TForm1::bCurrentRootDirLeftClick(TObject *Sender)

{=2;=HandlerOfOpen(RootDirLeft, LEFT, DirSel);->FileListLeft->SetFocus();

}__fastcall TForm1::bCurrentRootDirRightClick(TObject *Sender)

{=2;=HandlerOfOpen(RootDirRight, RIGHT, DirSel);->FileListRight->SetFocus();

}.cpp

#pragma hdrstop

#include "Unit1.h"

#include "Unit3.h"

#include <winbase.h>

#include <_str.h>

#include <stdlib.h>

#include <system.hpp>

#include <shellapi.h>

#include <winnt.h>

#include <deque.h>

#include <set.h>

#pragma package(smart_init)DirSel=0;// Признак совершения выбора в ListDevicesRootDirLeft,RootDirRight;// Текущая корневая директорияCurrentPathLeft,CurrentPathRight;// Текущий путьPanel=LEFT;_FileProperty //Структура вывода

{FileAttrib[12]; // атрибуты файлаCreateTime[25]; // время создания файлаAccessTime[25]; // время доступаWriteTime[25]; // время записиFileSizeBy[21]; // размер файла в БFileSizeKb[18]; // размер файла в КБ

TCHAR FileName[MAX_PATH]; // имя файла

TCHAR AlterFileName[14]; // альтернативное имя файла

}FileProperty;<WIN32_FIND_DATA> DequeFindLeft; //Очередь результатов поиска<WIN32_FIND_DATA> DequeFindRight;_FIND_DATA StructFind; //Структура результатов поискаColName=0, //Столбцы таблицы вывода=1,=2,=5,=4,=3;

//Множество атрибутов директории<unsigned long, less<unsigned long> > DirAttribSet;CreateDirAttribSet()//Создание множества атрибутов директории

{.insert(16);.insert(17);.insert(18);.insert(19);.insert(20);.insert(21);.insert(22);.insert(48);.insert(49);.insert(50);.insert(8208);

}

//Создание списка доступных устройствCreateListOfDevices()

{DriveType;RootPath[4];(char i='A'; i<='Z'; i++)

{(RootPath,"\0");[0]=i;[1]=':';[2]='\\';[3]='\0';=GetDriveType(RootPath);(DriveType)

{

case DRIVE_REMOVABLE: strcat(RootPath, " 3 1\\2 ");

Form1->ListDevicesLeft->Items->Add(RootPath);->ListDevicesRight->Items->Add(RootPath);;

case DRIVE_FIXED: strcat(RootPath," Жесткий диск");

Form1->ListDevicesLeft->Items->Add(RootPath);->ListDevicesRight->Items->Add(RootPath);;

case DRIVE_REMOTE: strcat(RootPath," Сетевой диск");

Form1->ListDevicesLeft->Items->Add(RootPath);->ListDevicesRight->Items->Add(RootPath);

case DRIVE_CDROM: strcat(RootPath," CD-ROM");

Form1->ListDevicesLeft->Items->Add(RootPath);->ListDevicesRight->Items->Add(RootPath);;

case DRIVE_RAMDISK: strcat(RootPath," RAM-Disk");

Form1->ListDevicesLeft->Items->Add(RootPath);->ListDevicesRight->Items->Add(RootPath);;

}}}

//Преобразование из структуры результатов поиска в структуру выводаStrucFindToFileProp(WIN32_FIND_DATA StructFind, _FileProperty &FileProperty)

{ //Преобразование имени(FileProperty.FileName,StructFind.cFileName);(FileProperty.AlterFileName, StructFind.cAlternateFileName);Temp[10];

//Преобразование атрибутов(StructFind.dwFileAttributes)

{1:33:strcpy(FileProperty.FileAttrib,"ROnly\0");;2:strcpy(FileProperty.FileAttrib,"Hide\0");;4:6:34:35:38:39:strcpy(FileProperty.FileAttrib,"Sys\0");;8: strcpy(FileProperty.FileAttrib,"VolID\0");;16:17:20:21:48:49:8208:strcpy(FileProperty.FileAttrib,"Dir\0");;18:strcpy(FileProperty.FileAttrib,"HideDir\0");;19:50:22:strcpy(FileProperty.FileAttrib,"HideSysDir\0");;32:strcpy(FileProperty.FileAttrib,"Arch\0");;63:strcpy(FileProperty.FileAttrib,"AnyF\0");;64:strcpy(FileProperty.FileAttrib,"Device\0");;256:strcpy(FileProperty.FileAttrib,"Temp\0");;512:strcpy(FileProperty.FileAttrib,"Sprase\0");;1024:strcpy(FileProperty.FileAttrib,"RepraseP\0");;2048:strcpy(FileProperty.FileAttrib,"Compress\0");;8192:strcpy(FileProperty.FileAttrib,"NContentInd\0");;4096:strcpy(FileProperty.FileAttrib,"Offline\0");;16384:strcpy(FileProperty.FileAttrib,"Encryp\0");;: strcpy(FileProperty.FileAttrib,ultoa(StructFind.dwFileAttributes,Temp,10));(FileProperty.FileAttrib,"\0");;}

//Преобразование размера(StructFind.nFileSizeHigh!=0)// Если старшее слово не равно нулю

{TempStr[20];(FileProperty.FileSizeBy, ultoa(StructFind.nFileSizeHigh,TempStr,10));(FileProperty.FileSizeBy, ultoa(StructFind.nFileSizeLow, TempStr,10));(FileProperty.FileSizeBy, "\0");(FileProperty.FileSizeKb,">4ГБ\0");}{char TempStr[20];// Если старшее слово равно нулю(FileProperty.FileSizeBy, ultoa(StructFind.nFileSizeLow,TempStr,10));(FileProperty.FileSizeBy, "\0");(FileProperty.FileSizeKb, ultoa((StructFind.nFileSizeLow>>10),TempStr,10));(FileProperty.FileSizeKb, "\0");

}(DirAttribSet.count(StructFind.dwFileAttributes))// Если папка, то ее размер

{ // не отображается(FileProperty.FileSizeBy, "DIR\0");(FileProperty.FileSizeKb, "DIR\0");

}((StructFind.nFileSizeLow>>10)==0) // Если размер файла меньше килобайта,

{ // то отображается его размер в байтах(FileProperty.FileSizeKb,FileProperty.FileSizeBy);(FileProperty.FileSizeKb," Б ");

}

//Преобрзование времени...FileTimeToStrTime(_FILETIME &FileTime,char CharTime[]);(StructFind.ftCreationTime, FileProperty.CreateTime);(StructFind.ftLastAccessTime, FileProperty.AccessTime);(StructFind.ftLastWriteTime, FileProperty.WriteTime);

}FileTimeToStrTime(_FILETIME &FileTime, char CharTime[])

{

_SYSTEMTIME DigitTime;TempStr[3];(&FileTime, &DigitTime);(CharTime, "\0");(CharTime, ultoa(DigitTime.wDay,TempStr,10));(CharTime, ".");(CharTime, ultoa(DigitTime.wMonth,TempStr,10));(CharTime, ".");(CharTime, ultoa(DigitTime.wYear,TempStr,10));(CharTime, " ");(CharTime, ultoa(DigitTime.wHour,TempStr,10));(CharTime, ":");(CharTime, ultoa(DigitTime.wMinute,TempStr,10));(CharTime, ":");(CharTime, ultoa(DigitTime.wSecond,TempStr,10));(CharTime, "\0");

}

//Сканирование содержимого каталогаScanDir(char Path[], int Panel)

{HWNDFind;Flag=true;(Panel==LEFT)// Если активна левая панель

{(!DequeFindLeft.empty()) DequeFindLeft.clear();// Очистка текущей очереди=FindFirstFile(Path, &StructFind);(Flag)

{Flag=FindNextFile(HWNDFind,&StructFind);(Flag) DequeFindLeft.push_back(StructFind);

}FindClose(HWNDFind);

}else // Если активна правая панель

{if (!DequeFindRight.empty()) DequeFindRight.clear();=FindFirstFile(Path, &StructFind);(Flag)

{Flag=FindNextFile(HWNDFind,&StructFind);(Flag) DequeFindRight.push_back(StructFind);

}FindClose(HWNDFind);

}}

//Отображение содержимого каталогаViewDirectory(char Path[], int Panel)

{(Path, Panel);<WIN32_FIND_DATA>::iterator iter;_FIND_DATA StructFindTemp;i=0; // Заполнение заголовков столбцов->FileListLeft->Cells[ColName][i]="Имя";->FileListLeft->Cells[ColSize][i]="Размер КБ";->FileListLeft->Cells[ColAttrib][i]="Атрибуты";->FileListLeft->Cells[ColCreTime][i]="Создан";->FileListLeft->Cells[ColAccTime][i]="Открыт";->FileListLeft->Cells[ColWriTime][i]="Изменен";->FileListRight->Cells[ColName][i]="Имя";->FileListRight->Cells[ColSize][i]="Размер КБ";->FileListRight->Cells[ColAttrib][i]="Атрибуты";->FileListRight->Cells[ColCreTime][i]="Создан";->FileListRight->Cells[ColAccTime][i]="Открыт";->FileListRight->Cells[ColWriTime][i]="Изменен";++;(Panel==LEFT)// Если активна левая панель

{=DequeFindLeft.begin();->FileListLeft->RowCount=2;// Очистка содержимого таблицы,

// куда производится отображение(iter!=DequeFindLeft.end())

{=*iter;(DirAttribSet.count(StructFindTemp.dwFileAttributes))//Отображение директорий

{ // (в таблице выше файлов)(StructFindTemp, FileProperty);->FileListLeft->Cells[ColName][i]=FileProperty.FileName;->FileListLeft->Cells[ColSize][i]=FileProperty.FileSizeKb;->FileListLeft->Cells[ColAttrib][i]=FileProperty.FileAttrib;->FileListLeft->Cells[ColCreTime][i]=FileProperty.CreateTime;->FileListLeft->Cells[ColAccTime][i]=FileProperty.AccessTime;->FileListLeft->Cells[ColWriTime][i]=FileProperty.WriteTime;->FileListLeft->RowCount=Form1->FileListLeft->RowCount+1;++;

}++;

}=DequeFindLeft.begin();(iter!=DequeFindLeft.end())// Отображение файлов (в таблице после директорий)

{=*iter;(DirAttribSet.count(StructFindTemp.dwFileAttributes)==0)

{(*iter, FileProperty);->FileListLeft->Cells[ColName][i]=FileProperty.FileName;->FileListLeft->Cells[ColSize][i]=FileProperty.FileSizeKb;->FileListLeft->Cells[ColAttrib][i]=FileProperty.FileAttrib;->FileListLeft->Cells[ColCreTime][i]=FileProperty.CreateTime;->FileListLeft->Cells[ColAccTime][i]=FileProperty.AccessTime;->FileListLeft->Cells[ColWriTime][i]=FileProperty.WriteTime;->FileListLeft->RowCount=Form1->FileListLeft->RowCount+1;++;

}++;

}(i==1)// Если нет файлов и паппок для отображения

{->FileListLeft->Cells[ColName][i]="\0";->FileListLeft->Cells[ColSize][i]="\0";->FileListLeft->Cells[ColAttrib][i]="\0";->FileListLeft->Cells[ColCreTime][i]="\0";->FileListLeft->Cells[ColAccTime][i]="\0";->FileListLeft->Cells[ColWriTime][i]="\0";

}(i>1) Form1->FileListLeft->RowCount=Form1->FileListLeft->RowCount-1;

}// Если активна правая панель

{ // (аналогично левой панели)=DequeFindRight.begin();->FileListRight->RowCount=2;(iter!=DequeFindRight.end())

{=*iter;(DirAttribSet.count(StructFindTemp.dwFileAttributes))

{(StructFindTemp, FileProperty);->FileListRight->Cells[ColName][i]=FileProperty.FileName;->FileListRight->Cells[ColSize][i]=FileProperty.FileSizeKb;->FileListRight->Cells[ColAttrib][i]=FileProperty.FileAttrib;->FileListRight->Cells[ColCreTime][i]=FileProperty.CreateTime;->FileListRight->Cells[ColAccTime][i]=FileProperty.AccessTime;->FileListRight->Cells[ColWriTime][i]=FileProperty.WriteTime;->FileListRight->RowCount=Form1->FileListRight->RowCount+1;++;

}++;}=DequeFindRight.begin();(iter!=DequeFindRight.end())

{StructFindTemp=*iter;(DirAttribSet.count(StructFindTemp.dwFileAttributes)==0)

{(*iter, FileProperty);->FileListRight->Cells[ColName][i]=FileProperty.FileName;->FileListRight->Cells[ColSize][i]=FileProperty.FileSizeKb;->FileListRight->Cells[ColAttrib][i]=FileProperty.FileAttrib;->FileListRight->Cells[ColCreTime][i]=FileProperty.CreateTime;->FileListRight->Cells[ColAccTime][i]=FileProperty.AccessTime;->FileListRight->Cells[ColWriTime][i]=FileProperty.WriteTime;->FileListRight->RowCount=Form1->FileListRight->RowCount+1;++;

}++;

}(i==1)

{->FileListRight->Cells[ColName][i]="\0";->FileListRight->Cells[ColSize][i]="\0";->FileListRight->Cells[ColAttrib][i]="\0";->FileListRight->Cells[ColCreTime][i]="\0";->FileListRight->Cells[ColAccTime][i]="\0";->FileListRight->Cells[ColWriTime][i]="\0";

}(i>1) Form1->FileListRight->RowCount=Form1->FileListRight->RowCount-1;

}}

//Обработчик открытия папки или файлаHandlerOfOpen(AnsiString RootDir, int Panel, int DirSel)

{AnsiString Mask="\\*.*\0";PathChar[256];Path;AnsiString CurrentPathLeft=RootDir;AnsiString CurrentPathRight=RootDir;int Row=Form1->FileListLeft->Row;Name=Form1->FileListLeft->Cells[ColName][Row];(Panel==LEFT)

{(DirSel!=0)// Если сменилась корневая директория

{(DirSel)

{1: //Если выбор в ListDevices(RootDir.AnsiCompare(RootDirRight)==0)// Если при смене корневой дирректории

{ // пользователь выбрал то же устройство, что=CurrentPathRight; // в другой панели, то отображеется=CurrentPathLeft+Mask; // папка открытая в той панели(PathChar, Path.c_str());(PathChar,LEFT);->LabelCurrentPathLeft->Caption=CurrentPathLeft;

}// Если выбрано устройсво, отличное от устройсва во второй панели

{=RootDir+"\;=RootDir+Mask;(PathChar, Path.c_str()); //Преобрзование AnsiString в char(PathChar, Panel);->LabelCurrentPathLeft->Caption=CurrentPathLeft;

};2://Если нажатие на bCurrentRootDir=RootDir+"\;=RootDir+Mask;(PathChar, Path.c_str()); //Преобрзование AnsiString в char(PathChar, Panel);->LabelCurrentPathLeft->Caption=CurrentPathLeft;;

}}

{if ((Form1->FileListLeft->Cells[ColAttrib][Row]=="Dir\0")||//Если двойной клик по

(Form1->FileListLeft->Cells[ColAttrib][Row]=="HideDir\0")||//директории

(Form1->FileListLeft->Cells[ColAttrib][Row]=="HideSysDir\0"))(Name=="..\0")//Если переход на один уровень вверх

{int Pos,Len=CurrentPathLeft.Length();(int i=Len-2; i>=3;i--)

{(CurrentPathLeft[i]=='\\')

{Pos=i;;

}}.Delete(Pos,(Len-Pos));=CurrentPathLeft+Mask;(PathChar, Path.c_str()); //Преобрзование AnsiString в char(PathChar, LEFT);->LabelCurrentPathLeft->Caption=CurrentPathLeft;

}//Если открытие подкаталога

{+=Name;=CurrentPathLeft+Mask;+="\;(PathChar, Path.c_str()); //Преобрзование AnsiString в char->LabelCurrentPathLeft->Caption=CurrentPathLeft;(PathChar,LEFT);}//Если открытие файла (не папки)

{(Name!="\0")

{AnsiString FilePath;=CurrentPathLeft+Name;(PathChar, FilePath.c_str());(0,"open",PathChar ,"","",1);

}}}CurrentPathLeft;

}//Если активна правая панель

{long int Row=Form1->FileListRight->Row;Name=Form1->FileListRight->Cells[ColName][Row];(DirSel!=0)//Если сменилась корневая директория

{(DirSel)

{case 1:(RootDir.AnsiCompare(RootDirLeft)==0)// Если при смене корневой дирректории

{ // пользователь выбрал то же устройство, что=CurrentPathLeft; // в другой панели, то отображеется=CurrentPathRight+Mask; // папка открытая в той панели(PathChar, Path.c_str());(PathChar,RIGHT);->LabelCurrentPathRight->Caption=CurrentPathRight;

}

{=RootDir+'\\';=RootDir+Mask;(PathChar, Path.c_str()); //Преобрзование AnsiString в char(PathChar, Panel);->LabelCurrentPathRight->Caption=CurrentPathRight;

};2:=RootDir+'\\';=RootDir+Mask;(PathChar, Path.c_str()); //Преобрзование AnsiString в char(PathChar, Panel);->LabelCurrentPathRight->Caption=CurrentPathRight;;

}}

{((Form1->FileListRight->Cells[ColAttrib][Row]=="Dir\0")|| //Если двойной клик по

(Form1->FileListRight->Cells[ColAttrib][Row]=="HideDir\0")|| //по директории

(Form1->FileListRight->Cells[ColAttrib][Row]=="HideSysDir\0"))(Name=="..\0") //Переход на один уровень вверх

{Pos,Len=CurrentPathRight.Length();(int i=Len-2; i>=3;i--)

{(CurrentPathRight[i]=='\\')

{=i;;

}}.Delete(Pos,(Len-Pos));=CurrentPathRight+Mask;(PathChar, Path.c_str()); //Преобрзование AnsiString в char(PathChar, RIGHT);->LabelCurrentPathRight->Caption=CurrentPathRight;

}//Открытие подкаталога

{+=Name;=CurrentPathRight+Mask;+="\;(PathChar, Path.c_str()); //Преобрзование AnsiString в char(PathChar, RIGHT);->LabelCurrentPathRight->Caption=CurrentPathRight;

}

{(Name!="\0") //Если двойной клик по файлу (не по папке)

{ AnsiString FilePath;=CurrentPathRight+Name;(PathChar, FilePath.c_str());(0,"open",PathChar ,"","",1);

}}

}CurrentPathRight;

}}

//Создание каталогаCreateFolder(int Panel)

{AnsiString Mask="\\*.*\0";Path;Result;PathChar[256]="\0";(Panel==LEFT) // Если активна левая панель

{=CurrentPathLeft+FormDialogCreateDir->edNewDirName->Text;(PathChar, Path.c_str()); //Преобрзование AnsiString в char=CreateDirectory(PathChar,0);(Result==false)

{(0, " Каталог не создан!\n Возможно неправильное имя -\n повторите ввод.",

"Vontrop Commander - Ошибка!", 0);

}

{=CurrentPathLeft+Mask;(PathChar, Path.c_str()); //Преобрзование AnsiString в char(PathChar, Panel);(CurrentPathLeft.AnsiCompare(CurrentPathRight)==0) ViewDirectory(PathChar, RIGHT);

}}// Если активна правая панель

{=CurrentPathRight+FormDialogCreateDir->edNewDirName->Text;(PathChar, Path.c_str()); //Преобрзование AnsiString в char=CreateDirectory(PathChar,0);(Result==false)

{(0, " Каталог не создан!\n Возможно неправильное имя -\n повторите ввод.",

"Vontrop Commander - Ошибка!", 0);

}

{=CurrentPathRight+Mask;(PathChar, Path.c_str()); //Преобрзование AnsiString в char(PathChar, Panel);

if (CurrentPathRight.AnsiCompare(CurrentPathLeft)==0) ViewDirectory(PathChar, LEFT);

}

}Result;

}

//УдалениеDeleting(int Panel, int Operation)

{AnsiString Mask="\\*.*\0";StructOperation;Name;PathChar[256]="\0";int Row;Form1->FileListLeft->Row;Path;.hNameMappings=0;.lpszProgressTitle=0;.hwnd=0;.fAnyOperationsAborted=false;.pTo="\0";(Operation)

{FO_DELETE: StructOperation.wFunc=FO_DELETE;.fFlags=0;;FO_DELETER:StructOperation.wFunc=FO_DELETE;.fFlags=FOF_ALLOWUNDO;;

}(Panel==LEFT)

{=Form1->FileListLeft->Row;=Form1->FileListLeft->Cells[ColName][Row];=CurrentPathLeft+Name;(PathChar, Path.c_str()); //Преобрзование AnsiString в char(PathChar, "\0");.pFrom=PathChar;(&StructOperation);=CurrentPathLeft+Mask;(PathChar, Path.c_str()); //Преобрзование AnsiString в char(PathChar, Panel);(CurrentPathRight.AnsiCompare(CurrentPathLeft)==0) ViewDirectory(PathChar, RIGHT);

}

{=Form1->FileListRight->Row;=Form1->FileListRight->Cells[ColName][Row];=CurrentPathRight+Name;(PathChar, Path.c_str()); //Преобрзование AnsiString в char(PathChar, "\0");.pFrom=PathChar;(&StructOperation);=CurrentPathRight+Mask;(PathChar, Path.c_str()); //Преобрзование AnsiString в char(PathChar, Panel);(CurrentPathRight.AnsiCompare(CurrentPathLeft)==0) ViewDirectory(PathChar, LEFT);

}

}

//Копирование или перемещениеCopyOrRemove(int Panel, int Operation)

{AnsiString Mask="\\*.*\0";StructOperation;Name;PathCharFrom[256]="\0";PathCharTo[256]="\0";int Row;Form1->FileListLeft->Row;Path;(CurrentPathRight.AnsiCompare(CurrentPathLeft)==0)(0, " Конечный и исходный каталоги совпадают!!!", "Vontrop Commander - Ошибка!", 0);

{.hNameMappings=0;.lpszProgressTitle=0;.hwnd=0;.fAnyOperationsAborted=false;.fFlags=0;(Operation)

{ case FO_COPY: StructOperation.wFunc=FO_COPY;

break;FO_MOVE:StructOperation.wFunc=FO_MOVE;;

}(Panel==LEFT)

{=Form1->FileListLeft->Row;=Form1->FileListLeft->Cells[ColName][Row];=CurrentPathLeft+Name;(PathCharFrom, Path.c_str()); //Преобрзование AnsiString в char.pFrom=PathCharFrom;(PathCharTo, CurrentPathRight.c_str()); //Преобрзование AnsiString в char.pTo=PathCharTo;(&StructOperation);=CurrentPathLeft+Mask;(PathCharTo, Path.c_str()); //Преобрзование AnsiString в char(PathCharTo, Panel);=CurrentPathRight+Mask;(PathCharTo, Path.c_str()); //Преобрзование AnsiString в char(PathCharTo, RIGHT);

}

{=Form1->FileListRight->Row;=Form1->FileListRight->Cells[ColName][Row];=CurrentPathRight+Name;(PathCharFrom, Path.c_str()); //Преобрзование AnsiString в char.pFrom=PathCharFrom;(PathCharTo, CurrentPathLeft.c_str()); //Преобрзование AnsiString в char.pTo=PathCharTo;(&StructOperation);=CurrentPathRight+Mask;(PathCharTo, Path.c_str()); //Преобрзование AnsiString в char(PathCharTo, Panel);=CurrentPathLeft+Mask;(PathCharTo, Path.c_str()); //Преобрзование AnsiString в char(PathCharTo, LEFT);

}}}.cpp

#include <vcl.h>

#pragma hdrstop

#include "Unit2.h"

#include "Unit3.h"

#pragma package(smart_init)

#pragma resource "*.dfm"*FormDialogCreateDir;

__fastcall TFormDialogCreateDir::TFormDialogCreateDir(TComponent* Owner)

: TForm(Owner)

{}__fastcall TFormDialogCreateDir::bCancelClick(TObject *Sender)

{>edNewDirName->Text="";>edNewDirName->SetFocus();>Hide();

}__fastcall TFormDialogCreateDir::bOkClick(TObject *Sender)

{Result=CreateFolder(Panel);>edNewDirName->SetFocus();(Result==true)

{>edNewDirName->Text="";>Hide();

}}__fastcall TFormDialogCreateDir::edNewDirNameKeyDown(TObject *Sender,&Key, TShiftState Shift)

{ bool Result;(Key)

{ case 13: Result=CreateFolder(Panel);>edNewDirName->SetFocus();(Result==true)

{>edNewDirName->Text="";>Hide();

};27: FormDialogCreateDir->edNewDirName->Text="";>edNewDirName->SetFocus();>Hide();;

}

}.cpp

#include <vcl.h>

#pragma hdrstop

#include "Unit4.h"

#pragma package(smart_init)

#pragma resource "*.dfm"*FormDialogDelete;

#include "Unit2.h"

__fastcall TFormDialogDelete::TFormDialogDelete(TComponent* Owner)

: TForm(Owner)

{

}__fastcall TFormDialogDelete::bCancelClick(TObject *Sender)

{>bRecycler->SetFocus();>Hide();

}__fastcall TFormDialogDelete::bDeleteClick(TObject *Sender)

{(Panel,FO_DELETE);>bRecycler->SetFocus();>Hide();

}__fastcall TFormDialogDelete::bRecyclerClick(TObject *Sender)

{(Panel,FO_DELETER);>bRecycler->SetFocus();>Hide();

}



Введение Файловые менеджеры - это программы упрощающие и ускоряющие работу с файлами. Они позволяют как создавать, так и удалять файлы, редактировать, ко

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ