Файловый менеджер
Министерство образования Российской Федерации
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧЕРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«ОРЕНБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»
Факультет информационных технологий
Кафедра программного обеспечения вычислительной техники
и автоматизированных систем
КУРСОВОЙ ПРОЕКТ
по программированию
Файловый менеджер.
Пояснительная записка
ГОУ ОГУ 220400.4405.22 ПЗ
Руководитель проекта
__________________Юркевская Л.А.
«__»____________________2005г.
Исполнитель
студент гр.04 ПОВТ-2
________________Портнов Д.И.
«__»____________________2005г.
Оренбург 2005
Министерство образования Российской Федерации
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧЕРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«ОРЕНБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»
Факультет информационных технологий
Кафедра программного обеспечения вычислительной техники и
автоматизированных систем
Задание на курсовой проект
Файловый менеджер.
Исходные данные: Операционная система: Microsoftâ Windows
NT 4.0 и старше.
Количество устройств хранения информации
и их тип определяется программой.
Файловая система любая, поддерживаемая
операционной системой.
Интерфейс графический, двух панельный.
Язык разработки C++ любой реализации,
возможно применение средств визуального
программирования.
Разработать: 1) Пользовательский интерфейс работы
с файлами.
2) Реализацию заложенных в интерфейсе
возможностей: выбора устройства хранения
информации, просмотра содержимого
директорий, создания новых директорий,
операций с файлами и директориями
(копирования, перемещения и удаления).
Дата выдачи задания «14» апреля 2005г.
Руководитель Юркевская Л.А.
Исполнитель
студент группы 04 ПОВТ-2 Портнов Д.И.
Срок защиты проекта «30» мая 2005г.
Аннотация Пояснительная записка содержит 38 страниц, в том числе 3 рисунка, 30 источников, 2 приложения. В данном проекте разработан файловый менеджер для операционных систем семейства Microsoftâ Windows NT 4.0 и старше, в котором реализованы базовые операции с файлами и папками: открытие, перемещение, копирование, удаление, помещение в корзину. Интерфейс программы был сделан по возможности наиболее интуитивно понятным и эргономичным. |
||||||||||
ГОУ ОГУ 220400.4405.22 ПЗ |
||||||||||
Изм |
Лист |
№ докум. |
Подпись |
Дата |
||||||
Разраб. |
Портнов |
Файловый менеджер. Пояснительная записка. |
Лит |
Лист |
Листов |
|||||
Провер. |
Юркевская |
К |
3 |
38 |
||||||
ГОУ ОГУ ФИТ ПОВТАС 04 ПОВТ-2 |
||||||||||
Н.контр. |
||||||||||
Зав.каф. |
Соловьев |
|||||||||
Содержание
TOC \h \z \t "Заголовок раздела;1;Заголовок подраздела;2;Приложение;1" Введение. \h 5
1.1 Главная форма программы.. \h 6
1.2 Диалог создания каталога. \h 8
1.3 Диалог создания удаления или перемещения в корзину. \h 8
2.1 Принцип работы программы.. \h 9
2.2. Глобальные переменные и константы.. \h 9
2.3 Функции реализации операций. \h 10
Список использованных источников. \h 12
Приложение А Блок-схема взаимодействия компонентов программы.. \h 13
Приложение Б Исходные тексты программы.. \h 15
Введение
Курсовой проект (получивший рабочее название Vontrop Commander) выполнен в системе визуального программирования Borlandâ C++Builderä 6.0, с использованием библиотеки визуальных компонентов (VCL) и функций Windows API.
В Borlandâ C++Builderä проектом называется совокупность файлов, создаваемых в процессе разработки программы. В дальнейшем мы будем использовать слово «проект» именно в этом смысле.
Проект Vontrop Commander’а состоит, помимо файлов, создаваемых системой программирования автоматически, из четырех модулей (Unit1.c, Unit2.c, Unit3.c и Unit4.c).
В заголовочном файле (хедере) первого модуля (Unit1), находится описание главной формы программы, создаваемой при ее запуске, в теле этого модуля находятся исходные тексты обработчиков событий, порождаемых теми или иными действиями пользователя в главной форме программы (Form1).
Во втором модуле (Unit2) описаны все функции, на вызове которых строится работа программы, кроме функций-обработчиков событий. В хедере этого модуля объявлены глобальные константы и переменные, а так же находятся прототипы функций, вызываемых из других модулей.
В третьем модуле (Unit3) находится описание и функции-обработчики событий для формы (FormDialogCreateDir), являющейся диалоговым окном создания новой директории.
В четвертом модуле (Unit4) находится описание и функции-обработчики событий для формы (FormDialogDelete), являющейся диалоговым окном удаления или помещения в корзину.
1 Формы программы
1.1 Главная форма программы
1.1.1 При запуске программы создается главная форма Form1 – представитель класса TForm (рисунок 1). При создании формы создаются списки доступных устройств, отображаемые в FileListLeft и FileListRigh, в обеих панелях отображается корневая директория диска C:\, поскольку нами было сделано предположение, что этот логический диск должен быть практически на всех компьютерах, так же создается множество атрибутов директории DirAttribSet, используемое функциями второго модуля.
В Form1 реализовано одно событие: Create (создание, функция-обработчик: FormCreate).Опишем объекты, расположенные на Form1.
1.1.2 FileListLeft и FileListRight – представителями класса TStringGrid (строковая таблица). Выполняют функцию панелей, куда происходит отображение содержимого директорий и где пользователь выбирает файл (каталог), над которым он собирается выполнять какое-либо действие. Здесь большое значение имеет понятие «активная панель». Роль активной панели играет та таблица, к которой в данный момент обращается пользователь. Все операции совершаются с файлами (каталогами), отображенными в активной панели (копирование и перемещение осуществляется в папку, содержимое который в данный момент отображено в неактивной панели). В программе предусмотрен разный вид для активной и неактивной панелей.
В FileListLeft и FileListRigh реализованы следующие события: DblClick (двойной клик мыши, функции-обработчики: FileListLeftDblClick и FileListRightDblClick), Enter (вход, что означает, что панель становится активной, функции-обработчики: FileListLeftEnter и FileListRightEnter), KeyDown («горячие клавиши», функции-обработчики: FileListLeftKeyDown и FileListRightKeyDown).
1.1.3 ListDevicesLeft и ListDevicesRight – представители класса TComboBox (выпадающий список выбора). Являются списками доступных устройств хранения информации. Выбор пользователем какого-либо устройства из этого списка означает переход к корневой директории этого устройства, которая отображается в соответствующей панели, становящейся при этом активной. В случае, если корневые директории в обеих панелях после выбора совпадают, то в активной панели отображается содержимое той же папки, что и в неактивной.
В ListDevicesLeft и ListDevicesRight реализованы следующие события: – Select (выбор пункта в списке, функции-обработчики: ListDevicesLeftSelect и ListDevicesRightSelect), Enter (вход, что означает, что соответствующая панель становится активной, функции-обработчики: FileListLeftEnter и FileListRightEnter).
1.1.4 bRemove, bCopy, bCreateDir, bDelete, bCurrentRootDirLeft и bCurrentRootDirRight – представители класса TButton (кнопка). Кнопки выполняют различные функции. Во всех кнопках реализовано только одно событие – Click (нажатие, функции обработчики: bCreateDirClick, bDeleteClick, bCopyClick, bRemoveClick, bCurrentRootDirLeftClick и bCurrentRootDirRightClick).
При нажатии на bRemove происходит перемещение файла (каталога, со всеми вложенными каталогами) из папки, отображенной в активной панели, в папку, отображенную в неактивной. Нажатие bCopy практически аналогично нажатию на bRemove. только происходит копирование, а не перемещение. Нажатие на bCreateDir выводит диалог создания каталога FormDialogCreateDir. Нажатие на bDelete выводит диалог удаления или помещения в корзину FormDialogDelete. При нажатии на bCurrentRootDirLeft или bCurrentRootDirRight в соответствующих панелях происходит отображение корневой директории текущего устройства хранения информации.
Рисунок 1 – Внешний вид Form1.
1.2 Диалог создания каталога
1.2.1 При нажатии на кнопку формы Form1 bCreateDir на экран выводится форма FormDialogCreateDir – представитель класса TForm (рисунок 2).
Опишем объекты расположенные на FormDialogCreateDir.
1.2.2 edNewDirName – представитель класса TEdit (поле ввода). Поле, куда пользователь вводит имя нового каталога. В edNewDirName реализовано событие KeyDown («горячие клавиши», функция-обработчик edNewDirNameKeyDown).
1.2.3 Label1 – представитель класса TLabel (надпись). Содержит надпись «Создать каталог:».
1.2.4 bOk и bCancel – представители класса TButton (кнопка). В bOk и bCancel реализовано одно событие: Click (нажатие, функции-обработчики: bOkClick и bCancelClick). При нажатии на bOk, если введенное имя правильное (т.е. не содержит зарезервированных символов и слов и не совпадает с именем каталога в активной панели) или нет других ошибок (например, нет прав доступа), создается каталог в папке, отображенной в активной панели, и форма скрывается, в противном случае выдается сообщение об ошибке и предлагается повторить ввод. При нажатии на bCancel форма скрывается без выполнения каких-либо других действий.
Рисунок 2 – Внешний вид FormDialogCreateDir.
1.3 Диалог создания удаления или перемещения в корзину.
1.3.1 При нажатии на кнопку формы Form1 bDelete на экран выводится форма FormDialogDelete – представитель класса TForm (рисунок 3).
Опишем объекты на FormDialogDelete.
1.3.2 Label1 – представитель класса TLabel (надпись). Содержит надпись «Выберете действие:».
1.3.3. bDelete, bCancel, bRecycler – представители класса TButton (кнопка). В bDelete, bCancel, bRecycler реализовано одно событие: Click (нажатие, функции-обработчики: bDeleteClick, bCancelClick и bRecyclerClick). При нажатии на bDelete файл (каталог), находящийся в фокусе в активной панели, удаляется. При нажатии на bRecycler, файл (каталог), находящийся в фокусе в активной панели, помещается в корзину. При нажатии на bCancel форма скрывается без выполнения каких-либо других действий.
Рисунок 3 – Внешний вид FormDialogDelete.
2 Работа программы
2.1 Принцип работы программы
Принцип работы программы отражен в блок-схеме (Приложение А). Прокомментируем ее.
При запуске программы создается главная форма, затем приложение ожидает действия пользователя. Каждому предусмотренному действию сопоставлена какая-то функция-обработчик.
При нажатии на кнопки «Удалить» и «Создать» программа выводит на экран соответствующие диалоговые окна, где так же есть предусмотренные действия пользователя с объектами на этих формах.
После выполнения какого-либо действия, программа возвращается в режим ожидания пользовательских действий.
Для завершения работы с Vontrop Commander пользователю достаточно нажать на кнопку «Закрыть» системного меню, находящуюся в правом верхнем углу окна программы.
В Приложении Б приведены исходные тексты всех модулей программы, а так же исходный текст заголовочного файла второго модуля (т.к. он, в отличие от заголовочных файлов других модулей не был сгенерирован автоматически).
Все функции-обработчики событий во всех формах вызывают функции реализации операций из второго модуля программы.
Но для начала опишем используемые в программе глобальные переменные и константы.
2.2. Глобальные переменные и константы
2.2.1. Глобальные константы.
Все глобальные константы объявлены в программе с помощью директивы define. LEFT=1 и RIGHT=0 – используется для обозначения панели, над которой производятся действия.
FO_DELETER=5 используется в Delete для выбора действия «помещение в корзину.
2.2.2 Глобальные переменные.
DirSel (тип int) изменяет значение, когда в LitsDevicesLeft (ListDevicesRight) происходит выбор устройства либо происходит нажатие на bCurrentRootDirLeft (bCurrentRootDirRight). Используется для передачи в HendlerOfOpen.
RootDirLeft и RootDirRight (тип AnsiString) – текущий путь корневой директории. Используется для передачи в HendlerOfOpen.
CurrentPathLeft,CurrentPathRight (тип AnsiString) – текущий путь. Возвращается HendlerOfOpen. Используется для передачи в Delete, CreateFolder,CopyOrRemove.
Panel (тип int) – принимает только два значения: LEFT и RIGHT. Используется для указания активной панели.
2.3 Функции реализации операций
2.3.1 CreateListOfDevices[1].
Создает список корневых директорий доступных устройств хранения информации и отображает этот список в ListDevicesLeft и ListDevicesRight.
Функции не передаются параметры. Не возвращает значения.
Используется функция Windows API GetDriveType.
2.3.2 ScanDir.
Функции предается строка, заканчивающаяся нулем (char Path[]), содержащая путь к директории, в которой производится поиск всех содержащихся в ней папок и файлов и переменная (int Panel), в зависимости от значения которой формируется либо DequeFindLeft (если Panel=LEFT) или DequeFindRight (если Panel=RIGHT).
Используются три функции Windows API:FindFirstFile, FindNextFile, FindClose.
Вызывается в ViewDirectory.
DequeFindLeft (DequeFindRight) – это контейнер библиотеки стандартных шаблонов, являющийся очередью deque, элементами которой являются структуры типа WIN32_FIND_DATA. Тип WIN32_FIND_DATA описан в winbase.h. Ссылка на структуру передается в FindFirstFile и FindNextFile.
2.3.3 StrucFindToFileProp.
Преобразует структуру типа WIN32_FIND_DATA в _FileProperty.
Функции передается структура типа WIN32_FIND_DATA и ссылка на структуру типа _FileProperty. Не возвращает значения.
Вызывается в ViewDirectory.
Тип _FileProperty описывается в начале модуля и используется для отображения результатов работы ScanDir в FileListLeft (FileListRight), т.к. некоторые поля WIN32_FIND_DATA не адаптированы для вывода.
2.3.4 ViewDirectory.
Отображает содержимое папки, путь к которой передается в Path[] в активной панели.
Функции предается строка, заканчивающаяся нулем (char Path[]), содержащая путь, который передается в ScanDir, и переменная (int Panel), передаваемая в ScanDir, и в зависимости от значения которой, результаты отображаются в FileListLeft (если Panel=LEFT) или FileListRight (если Panel=RIGHT). Не возвращает значения.
Вызывается в HandlerOfOpen, CreateFolder, CopyOrRemove и Deleting.
2.3.5 HandlerOfOpen.
В зависимости от действий пользователя, выполняет различные операции. Если происходит выбор в ListDevicesLeft (ListDevicesRight), то отображается корневая директория, выбранного устройства при условии, что корневые директории панелей не сосвпадают, иначе в активной панели отображается открытая папка неактивной панели. Если происходит нажатие на bCurrentRootDirLeft (bCurrentRootDirRight), то отображается корневая директория текущего устройсва. Если происходит двойной клик (нажатие клавиши Enter) по FileListLeft (FileListRight), то анализируется, какая строка находится сейчас в фокусе, и в зависимости от содержимого, выполняются различные операции. Если в фокусе находится файл, то он открывается приложением, с которым ассоциирован либо, если это приложение, производится его запуск. Если в фокусе находится папка, то отображается ее содержимое. Все действия совершаются с активной панелью.
Функции передается срока, путь к корневой директории устройства (AnsiString RootDir), активная панель (int Panel) и признак смены корневой директории (int DirSel). Возвращает текущий путь активной директории.
Используется функция Windows API ShellExecute.
2.3.6 CreateFolder.
Создает директорию в активной панели.
Функции передается указание на то, какая сейчас панель активна (int Panel). Возвращает значение типа bool, в зависимости от результатов выполнения операции. Функция создает каталог в пути панели, являющейся активной. В качестве текущего пути в каждой панели используются значения соответствующих глобальных переменных.
Используются функции Windows API: CreateDirectory и MessageBox.
2.3.7 Deleting.
Удаляет или помещает в корзину объект (файл или папку, со всеми ее вложенными папками), находящийся в фокусе в активной панели.
В функцию передается признак активной панели (int Panel) и операция (int Operation), которую надо совершить, т.е. удалить или поместить в корзину. Не возвращает значения.
Используется функция Windows API SHFileOperation.
2.3.8 CopyOrRemove.
Перемещает или копирует объект (файл или папку, со всеми ее вложенными папками), находящийся в фокусе в активной панели в папку неактивной панели.
В функцию передается признак активной панели (int Panel) и операция (int Operation), которую надо совершить, т.е. копировать или переместить. Не возвращает значения.
Используется функция Windows API SHFileOperation.
Список использованных источников
8 http://delphiworld.narod.ru/
13 http://www.buildercpp.net.ru/
30
приложение А
(обязательное)
Блок-схема взаимодействия компонентов программы
Двойной клик по элементу правой панели |
Начало |
CreateListOfDevices(); CreateDirAttribSet(); RootDirLeft="C:\\"; RootDirRight="C:\\"; DirSel=1; CurrentPathLeft=HandlerOfOpen(RootDirLeft, LEFT, DirSel); CurrentPathRight=HandlerOfOpen(RootDirRight, RIGHT, DirSel); |
Создание формы |
Действие пользователя |
Двойной клик по элементу левой панели |
А |
DirSel=0; CurrentPathLeft=HandlerOfOpen(RootDirLeft, LEFT, DirSel); |
DirSel=0; CurrentPathRight=HandlerOfOpen(RootDirRight,RIGHT, DirSel); |
Б |
RootDirLeft=Form1->ListDevicesLeft->Text.Delete (3,(Form1->ListDevicesLeft->Text.Length()-2)); DirSel=1; CurrentPathLeft=HandlerOfOpen(RootDirLeft, LEFT, DirSel); Form1->FileListLeft->SetFocus(); |
Выбор элемента в левом списке устройств хранения информации |
В |
А |
RootDirRight=Form1->ListDevicesRight->Text.Delete (3,(Form1->ListDevicesRight->Text.Length()-2)); DirSel=1; CurrentPathRight=HandlerOfOpen(RootDirRight, RIGHT, DirSel); Form1->FileListRight->SetFocus(); |
Б |
Выбор элемента в правом списке устройств хранения информации |
FormDialogCreateDir->Show(); |
Нажатие кнопки «Создать каталог» |
CopyOrRemove(Panel,FO_MOVE); |
Нажатие кнопки «Переместить» |
CopyOrRemove(Panel,FO_COPY); |
Нажатие кнопки «Копировать» |
Действие пользователя |
FormDialogCreateDir->edNewDirName->Text=""; FormDialogCreateDir->edNewDirName->SetFocus(); FormDialogCreateDir->Hide(); |
Нажатие кнопки «Отмена» |
bool Result=CreateFolder(Panel); FormDialogCreateDir->edNewDirName->SetFocus(); if (Result==true) { FormDialogCreateDir->edNewDirName->Text=""; FormDialogCreateDir->Hide(); } |
Нажатие кнопки «OК» |
Г |
(продолжение)
ПРИЛОЖЕНИЕ А
(продолжение)
В |
Г |
FormDialogDelete->Show(); FormDialogDelete->bRecycler->SetFocus(); |
Нажатие кнопки «Удалить» |
Действие пользователя |
Deleting(Panel,FO_DELETE); FormDialogDelete->bRecycler->SetFocus(); FormDialogDelete->Hide(); |
Нажатие кнопки «Удалить» |
Deleting(Panel,FO_DELETER); FormDialogDelete->bRecycler->SetFocus(); FormDialogDelete->Hide(); |
Нажатие кнопки «В корзину» |
FormDialogDelete->bRecycler->SetFocus(); FormDialogDelete->Hide(); |
Нажатие кнопки «Отмена» |
DirSel=2; CurrentPathLeft=HandlerOfOpen(RootDirLeft, LEFT, DirSel); Form1->FileListLeft->SetFocus(); |
Нажатие левой кнопки «\» |
Нажатие правой кнопки «\» |
Нажатие кнопки «Закрыть» системного меню |
Конец |
DirSel=2; CurrentPathRight=HandlerOfOpen(RootDirRight, RIGHT, DirSel); Form1->FileListRight->SetFocus(); |
В |
Г |
FormDialogDelete->Show(); FormDialogDelete->bRecycler->SetFocus(); |
Нажатие кнопки «Удалить» |
Действие пользователя |
Deleting(Panel,FO_DELETE); FormDialogDelete->bRecycler->SetFocus(); FormDialogDelete->Hide(); |
Нажатие кнопки «Удалить» |
Deleting(Panel,FO_DELETER); FormDialogDelete->bRecycler->SetFocus(); FormDialogDelete->Hide(); |
Нажатие кнопки «В корзину» |
FormDialogDelete->bRecycler->SetFocus(); FormDialogDelete->Hide(); |
Нажатие кнопки «Отмена» |
DirSel=2; CurrentPathLeft=HandlerOfOpen(RootDirLeft, LEFT, DirSel); Form1->FileListLeft->SetFocus(); |
Нажатие левой кнопки «\» |
Нажатие правой кнопки «\» |
Нажатие кнопки «Закрыть» системного меню |
Конец |
DirSel=2; CurrentPathRight=HandlerOfOpen(RootDirRight, RIGHT, DirSel); Form1->FileListRight->SetFocus(); |
(обязательное)
Исходные тексты программы.
Unit1.c
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
#include "Unit4.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
CreateListOfDevices();
CreateDirAttribSet();
RootDirLeft="C:\\";
RootDirRight="C:\\";
DirSel=1;
CurrentPathLeft=HandlerOfOpen(RootDirLeft, LEFT, DirSel);
CurrentPathRight=HandlerOfOpen(RootDirRight, RIGHT, DirSel);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FileListLeftDblClick(TObject *Sender)
{
DirSel=0;
CurrentPathLeft=HandlerOfOpen(RootDirLeft, LEFT, DirSel);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FileListRightDblClick(TObject *Sender)
{
DirSel=0;
CurrentPathRight=HandlerOfOpen(RootDirRight,RIGHT, DirSel);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListDevicesLeftSelect(TObject *Sender)
{
RootDirLeft=Form1->ListDevicesLeft->Text.Delete
(3,(Form1->ListDevicesLeft->Text.Length()-2));
DirSel=1;
CurrentPathLeft=HandlerOfOpen(RootDirLeft, LEFT, DirSel);
Form1->FileListLeft->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListDevicesRightSelect(TObject *Sender)
{
RootDirRight=Form1->ListDevicesRight->Text.Delete
(3,(Form1->ListDevicesRight->Text.Length()-2));
DirSel=1;
CurrentPathRight=HandlerOfOpen(RootDirRight, RIGHT, DirSel);
Form1->FileListRight->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FileListLeftEnter(TObject *Sender)
{
Panel=LEFT;
Form1->LabelCurrentPathLeft->Color=0x00E9E9E9;
Form1->ListDevicesLeft->Color=0x00E9E9E9;
Form1->FileListLeft->Color=clGradientInactiveCaption;
Form1->LabelCurrentPathRight->Color=0x00C4C4C4;
Form1->ListDevicesRight->Color=0x00C4C4C4;
Form1->FileListRight->Color=0x00C4C4C4;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FileListRightEnter(TObject *Sender)
{
Panel=RIGHT;
Form1->LabelCurrentPathRight->Color=0x00E9E9E9;
Form1->ListDevicesRight->Color=0x00E9E9E9;
Form1->FileListRight->Color=clGradientInactiveCaption;
Form1->LabelCurrentPathLeft->Color=0x00C4C4C4;
Form1->ListDevicesLeft->Color=0x00C4C4C4;
Form1->FileListLeft->Color=0x00C4C4C4;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListDevicesLeftEnter(TObject *Sender)
{
Form1->LabelCurrentPathLeft->Color=0x00E9E9E9;
Form1->ListDevicesLeft->Color=0x00E9E9E9;
Form1->FileListLeft->Color=clGradientInactiveCaption;
Form1->LabelCurrentPathRight->Color=0x00C4C4C4;
Form1->ListDevicesRight->Color=0x00C4C4C4;
Form1->FileListRight->Color=0x00C4C4C4;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListDevicesRightEnter(TObject *Sender)
{
Form1->LabelCurrentPathRight->Color=0x00E9E9E9;
Form1->ListDevicesRight->Color=0x00E9E9E9;
Form1->FileListRight->Color=clGradientInactiveCaption;
Form1->LabelCurrentPathLeft->Color=0x00C4C4C4;
Form1->ListDevicesLeft->Color=0x00C4C4C4;
Form1->FileListLeft->Color=0x00C4C4C4;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::bCreateDirClick(TObject *Sender)
{
FormDialogCreateDir->Show();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::bDeleteClick(TObject *Sender)
{
FormDialogDelete->Show();
FormDialogDelete->bRecycler->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::bCopyClick(TObject *Sender)
{
CopyOrRemove(Panel,FO_COPY);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::bRemoveClick(TObject *Sender)
{
CopyOrRemove(Panel,FO_MOVE);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FileListLeftKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
switch (Key)
{
case 13: DirSel=0;
CurrentPathLeft=HandlerOfOpen(RootDirLeft, LEFT, DirSel);
break;
case 116: CopyOrRemove(Panel,FO_COPY);
break;
case 117: CopyOrRemove(Panel,FO_MOVE);
break;
case 118: FormDialogCreateDir->Show();
break;
case 119: FormDialogDelete->Show();
FormDialogDelete->bRecycler->SetFocus();
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FileListRightKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
switch (Key)
{
case 13: DirSel=0;
CurrentPathRight=HandlerOfOpen(RootDirRight, RIGHT, DirSel);
break;
case 116: CopyOrRemove(Panel,FO_COPY);
break;
case 117: CopyOrRemove(Panel,FO_MOVE);
break;
case 118: FormDialogCreateDir->Show();
break;
case 119: FormDialogDelete->Show();
FormDialogDelete->bRecycler->SetFocus();
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::bCurrentRootDirLeftClick(TObject *Sender)
{
DirSel=2;
CurrentPathLeft=HandlerOfOpen(RootDirLeft, LEFT, DirSel);
Form1->FileListLeft->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::bCurrentRootDirRightClick(TObject *Sender)
{
DirSel=2;
CurrentPathRight=HandlerOfOpen(RootDirRight, RIGHT, DirSel);
Form1->FileListRight->SetFocus();
}
//---------------------------------------------------------------------------
Unit2.h
//---------------------------------------------------------------------------
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#endif
#define LEFT 1
#define RIGHT 0
#define FO_DELETER 5
extern int DirSel;
extern AnsiString RootDirLeft,RootDirRight;
extern AnsiString CurrentPathLeft,CurrentPathRight;
extern int Panel;
void CreateDirAttribSet();
AnsiString HandlerOfOpen(AnsiString RootDir, int Panel, int DirSel);
void CreateListOfDevices();
bool CreateFolder(int Panel);
void Deleting(int Panel, int Operation);
void CopyOrRemove(int Panel, int Operation);
Unit2.c
//---------------------------------------------------------------------------
#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)
//---------------------------------------------------------------------------
int DirSel=0;// Признак совершения выбора в ListDevices
AnsiString RootDirLeft,RootDirRight;// Текущая корневая директория
AnsiString CurrentPathLeft,CurrentPathRight;// Текущий путь
int Panel=LEFT;
struct _FileProperty //Структура вывода
{
char FileAttrib[12]; // атрибуты файла
char CreateTime[25]; // время создания файла
char AccessTime[25]; // время доступа
char WriteTime[25]; // время записи
char FileSizeBy[21]; // размер файла в Б
char FileSizeKb[18]; // размер файла в КБ
TCHAR FileName[MAX_PATH]; // имя файла
TCHAR AlterFileName[14]; // альтернативное имя файла
}FileProperty;
deque<WIN32_FIND_DATA> DequeFindLeft; //Очередь результатов поиска
deque<WIN32_FIND_DATA> DequeFindRight;
WIN32_FIND_DATA StructFind; //Структура результатов поиска
int ColName=0, //Столбцы таблицы вывода
ColSize=1,
ColAttrib=2,
ColCreTime=5,
ColAccTime=4,
ColWriTime=3;
//Множество атрибутов директории
set<unsigned long, less<unsigned long> > DirAttribSet;
void CreateDirAttribSet()//Создание множества атрибутов директории
{
DirAttribSet.insert(16);
DirAttribSet.insert(17);
DirAttribSet.insert(18);
DirAttribSet.insert(19);
DirAttribSet.insert(20);
DirAttribSet.insert(21);
DirAttribSet.insert(22);
DirAttribSet.insert(48);
DirAttribSet.insert(49);
DirAttribSet.insert(50);
DirAttribSet.insert(8208);
}
//---------------------------------------------------------------------------
//Создание списка доступных устройств
void CreateListOfDevices()
{
UINT DriveType;
char RootPath[4];
for(char i='A'; i<='Z'; i++)
{
strcpy(RootPath,"\0");
RootPath[0]=i;
RootPath[1]=':';
RootPath[2]='\\';
RootPath[3]='\0';
DriveType=GetDriveType(RootPath);
switch (DriveType)
{
case DRIVE_REMOVABLE: strcat(RootPath, " 3 1\\2 \"");
Form1->ListDevicesLeft->Items->Add(RootPath);
Form1->ListDevicesRight->Items->Add(RootPath);
break;
case DRIVE_FIXED: strcat(RootPath," Жесткий диск");
Form1->ListDevicesLeft->Items->Add(RootPath);
Form1->ListDevicesRight->Items->Add(RootPath);
break;
case DRIVE_REMOTE: strcat(RootPath," Сетевой диск");
Form1->ListDevicesLeft->Items->Add(RootPath);
Form1->ListDevicesRight->Items->Add(RootPath);
case DRIVE_CDROM: strcat(RootPath," CD-ROM");
Form1->ListDevicesLeft->Items->Add(RootPath);
Form1->ListDevicesRight->Items->Add(RootPath);
break;
case DRIVE_RAMDISK: strcat(RootPath," RAM-Disk");
Form1->ListDevicesLeft->Items->Add(RootPath);
Form1->ListDevicesRight->Items->Add(RootPath);
break;
}
}
}
//------------------------------------------------------------------------------
//Преобразование из структуры результатов поиска в структуру вывода
void StrucFindToFileProp(WIN32_FIND_DATA StructFind, _FileProperty &FileProperty)
{
//Преобразование имени
strcpy(FileProperty.FileName,StructFind.cFileName);
strcpy(FileProperty.AlterFileName, StructFind.cAlternateFileName);
char Temp[10];
//Преобразование атрибутов
switch (StructFind.dwFileAttributes)
{
case 1:
case 33:strcpy(FileProperty.FileAttrib,"ROnly\0");
break;
case 2:strcpy(FileProperty.FileAttrib,"Hide\0");
break;
case 4:
case 6:
case 34:
case 35:
case 38:
case 39:strcpy(FileProperty.FileAttrib,"Sys\0");
break;
case 8: strcpy(FileProperty.FileAttrib,"VolID\0");
break;
case 16:
case 17:
case 20:
case 21:
case 48:
case 49:
case 8208:strcpy(FileProperty.FileAttrib,"Dir\0");
break;
case 18:strcpy(FileProperty.FileAttrib,"HideDir\0");
break;
case 19:
case 50:
case 22:strcpy(FileProperty.FileAttrib,"HideSysDir\0");
break;
case 32:strcpy(FileProperty.FileAttrib,"Arch\0");
break;
case 63:strcpy(FileProperty.FileAttrib,"AnyF\0");
break;
case 64:strcpy(FileProperty.FileAttrib,"Device\0");
break;
case 256:strcpy(FileProperty.FileAttrib,"Temp\0");
break;
case 512:strcpy(FileProperty.FileAttrib,"Sprase\0");
break;
case 1024:strcpy(FileProperty.FileAttrib,"RepraseP\0");
break;
case 2048:strcpy(FileProperty.FileAttrib,"Compress\0");
break;
case 8192:strcpy(FileProperty.FileAttrib,"NContentInd\0");
break;
case 4096:strcpy(FileProperty.FileAttrib,"Offline\0");
break;
case 16384:strcpy(FileProperty.FileAttrib,"Encryp\0");
break;
default: strcpy(FileProperty.FileAttrib,ultoa(StructFind.dwFileAttributes,Temp,10));
strcat(FileProperty.FileAttrib,"\0");
break;
}
//Преобразование размера
if (StructFind.nFileSizeHigh!=0)// Если старшее слово не равно нулю
{
char TempStr[20];
strcpy(FileProperty.FileSizeBy, ultoa(StructFind.nFileSizeHigh,TempStr,10));
strcat(FileProperty.FileSizeBy, ultoa(StructFind.nFileSizeLow, TempStr,10));
strcat(FileProperty.FileSizeBy, "\0");
strcpy(FileProperty.FileSizeKb,">4ГБ\0");}
else {char TempStr[20];// Если старшее слово равно нулю
strcpy(FileProperty.FileSizeBy, ultoa(StructFind.nFileSizeLow,TempStr,10));
strcat(FileProperty.FileSizeBy, "\0");
strcpy(FileProperty.FileSizeKb, ultoa((StructFind.nFileSizeLow>>10),TempStr,10));
strcat(FileProperty.FileSizeKb, "\0");
}
if (DirAttribSet.count(StructFind.dwFileAttributes))// Если папка, то ее размер
{ // не отображается
strcpy(FileProperty.FileSizeBy, "DIR\0");
strcpy(FileProperty.FileSizeKb, "DIR\0");
}
else
if ((StructFind.nFileSizeLow>>10)==0) // Если размер файла меньше килобайта,
{ // то отображается его размер в байтах
strcpy(FileProperty.FileSizeKb,FileProperty.FileSizeBy);
strcat(FileProperty.FileSizeKb," Б ");
}
//Преобрзование времени...
void FileTimeToStrTime(_FILETIME &FileTime,char CharTime[]);
FileTimeToStrTime(StructFind.ftCreationTime, FileProperty.CreateTime);
FileTimeToStrTime(StructFind.ftLastAccessTime, FileProperty.AccessTime);
FileTimeToStrTime(StructFind.ftLastWriteTime, FileProperty.WriteTime);
}
void FileTimeToStrTime(_FILETIME &FileTime, char CharTime[])
{
_SYSTEMTIME DigitTime;
char TempStr[3];
FileTimeToSystemTime(&FileTime, &DigitTime);
strcpy(CharTime, "\0");
strcat(CharTime, ultoa(DigitTime.wDay,TempStr,10));
strcat(CharTime, ".");
strcat(CharTime, ultoa(DigitTime.wMonth,TempStr,10));
strcat(CharTime, ".");
strcat(CharTime, ultoa(DigitTime.wYear,TempStr,10));
strcat(CharTime, " ");
strcat(CharTime, ultoa(DigitTime.wHour,TempStr,10));
strcat(CharTime, ":");
strcat(CharTime, ultoa(DigitTime.wMinute,TempStr,10));
strcat(CharTime, ":");
strcat(CharTime, ultoa(DigitTime.wSecond,TempStr,10));
strcat(CharTime, "\0");
}
//------------------------------------------------------------------------------
//Сканирование содержимого каталога
void ScanDir(char Path[], int Panel)
{
HANDLE HWNDFind;
bool Flag=true;
if (Panel==LEFT)// Если активна левая панель
{
if (!DequeFindLeft.empty()) DequeFindLeft.clear();// Очистка текущей очереди
HWNDFind=FindFirstFile(Path, &StructFind);
while (Flag)
{
Flag=FindNextFile(HWNDFind,&StructFind);
if (Flag) DequeFindLeft.push_back(StructFind);
}
FindClose(HWNDFind);
}
else // Если активна правая панель
{
if (!DequeFindRight.empty()) DequeFindRight.clear();
HWNDFind=FindFirstFile(Path, &StructFind);
while (Flag)
{
Flag=FindNextFile(HWNDFind,&StructFind);
if (Flag) DequeFindRight.push_back(StructFind);
}
FindClose(HWNDFind);
}
}
//------------------------------------------------------------------------------
//Отображение содержимого каталога
void ViewDirectory(char Path[], int Panel)
{
ScanDir(Path, Panel);
deque<WIN32_FIND_DATA>::iterator iter;
WIN32_FIND_DATA StructFindTemp;
int i=0; // Заполнение заголовков столбцов
Form1->FileListLeft->Cells[ColName][i]="Имя";
Form1->FileListLeft->Cells[ColSize][i]="Размер КБ";
Form1->FileListLeft->Cells[ColAttrib][i]="Атрибуты";
Form1->FileListLeft->Cells[ColCreTime][i]="Создан";
Form1->FileListLeft->Cells[ColAccTime][i]="Открыт";
Form1->FileListLeft->Cells[ColWriTime][i]="Изменен";
Form1->FileListRight->Cells[ColName][i]="Имя";
Form1->FileListRight->Cells[ColSize][i]="Размер КБ";
Form1->FileListRight->Cells[ColAttrib][i]="Атрибуты";
Form1->FileListRight->Cells[ColCreTime][i]="Создан";
Form1->FileListRight->Cells[ColAccTime][i]="Открыт";
Form1->FileListRight->Cells[ColWriTime][i]="Изменен";
i++;
if (Panel==LEFT)// Если активна левая панель
{
iter=DequeFindLeft.begin();
Form1->FileListLeft->RowCount=2;// Очистка содержимого таблицы,
// куда производится отображение
while (iter!=DequeFindLeft.end())
{
StructFindTemp=*iter;
if (DirAttribSet.count(StructFindTemp.dwFileAttributes))//Отображение директорий
{ // (в таблице выше файлов)
StrucFindToFileProp (StructFindTemp, FileProperty);
Form1->FileListLeft->Cells[ColName][i]=FileProperty.FileName;
Form1->FileListLeft->Cells[ColSize][i]=FileProperty.FileSizeKb;
Form1->FileListLeft->Cells[ColAttrib][i]=FileProperty.FileAttrib;
Form1->FileListLeft->Cells[ColCreTime][i]=FileProperty.CreateTime;
Form1->FileListLeft->Cells[ColAccTime][i]=FileProperty.AccessTime;
Form1->FileListLeft->Cells[ColWriTime][i]=FileProperty.WriteTime;
Form1->FileListLeft->RowCount=Form1->FileListLeft->RowCount+1;
i++;
}
iter++;
}
iter=DequeFindLeft.begin();
while (iter!=DequeFindLeft.end())// Отображение файлов (в таблице после директорий)
{
StructFindTemp=*iter;
if (DirAttribSet.count(StructFindTemp.dwFileAttributes)==0)
{
StrucFindToFileProp (*iter, FileProperty);
Form1->FileListLeft->Cells[ColName][i]=FileProperty.FileName;
Form1->FileListLeft->Cells[ColSize][i]=FileProperty.FileSizeKb;
Form1->FileListLeft->Cells[ColAttrib][i]=FileProperty.FileAttrib;
Form1->FileListLeft->Cells[ColCreTime][i]=FileProperty.CreateTime;
Form1->FileListLeft->Cells[ColAccTime][i]=FileProperty.AccessTime;
Form1->FileListLeft->Cells[ColWriTime][i]=FileProperty.WriteTime;
Form1->FileListLeft->RowCount=Form1->FileListLeft->RowCount+1;
i++;
}
iter++;
}
if (i==1)// Если нет файлов и паппок для отображения
{
Form1->FileListLeft->Cells[ColName][i]="\0";
Form1->FileListLeft->Cells[ColSize][i]="\0";
Form1->FileListLeft->Cells[ColAttrib][i]="\0";
Form1->FileListLeft->Cells[ColCreTime][i]="\0";
Form1->FileListLeft->Cells[ColAccTime][i]="\0";
Form1->FileListLeft->Cells[ColWriTime][i]="\0";
}
if (i>1) Form1->FileListLeft->RowCount=Form1->FileListLeft->RowCount-1;
}
else // Если активна правая панель
{ // (аналогично левой панели)
iter=DequeFindRight.begin();
Form1->FileListRight->RowCount=2;
while (iter!=DequeFindRight.end())
{
StructFindTemp=*iter;
if (DirAttribSet.count(StructFindTemp.dwFileAttributes))
{
StrucFindToFileProp (StructFindTemp, FileProperty);
Form1->FileListRight->Cells[ColName][i]=FileProperty.FileName;
Form1->FileListRight->Cells[ColSize][i]=FileProperty.FileSizeKb;
Form1->FileListRight->Cells[ColAttrib][i]=FileProperty.FileAttrib;
Form1->FileListRight->Cells[ColCreTime][i]=FileProperty.CreateTime;
Form1->FileListRight->Cells[ColAccTime][i]=FileProperty.AccessTime;
Form1->FileListRight->Cells[ColWriTime][i]=FileProperty.WriteTime;
Form1->FileListRight->RowCount=Form1->FileListRight->RowCount+1;
i++;
}
iter++;
}
iter=DequeFindRight.begin();
while (iter!=DequeFindRight.end())
{
StructFindTemp=*iter;
if (DirAttribSet.count(StructFindTemp.dwFileAttributes)==0)
{
StrucFindToFileProp (*iter, FileProperty);
Form1->FileListRight->Cells[ColName][i]=FileProperty.FileName;
Form1->FileListRight->Cells[ColSize][i]=FileProperty.FileSizeKb;
Form1->FileListRight->Cells[ColAttrib][i]=FileProperty.FileAttrib;
Form1->FileListRight->Cells[ColCreTime][i]=FileProperty.CreateTime;
Form1->FileListRight->Cells[ColAccTime][i]=FileProperty.AccessTime;
Form1->FileListRight->Cells[ColWriTime][i]=FileProperty.WriteTime;
Form1->FileListRight->RowCount=Form1->FileListRight->RowCount+1;
i++;
}
iter++;
}
if (i==1)
{
Form1->FileListRight->Cells[ColName][i]="\0";
Form1->FileListRight->Cells[ColSize][i]="\0";
Form1->FileListRight->Cells[ColAttrib][i]="\0";
Form1->FileListRight->Cells[ColCreTime][i]="\0";
Form1->FileListRight->Cells[ColAccTime][i]="\0";
Form1->FileListRight->Cells[ColWriTime][i]="\0";
}
if (i>1) Form1->FileListRight->RowCount=Form1->FileListRight->RowCount-1;
}
}
//------------------------------------------------------------------------------
//Обработчик открытия папки или файла
AnsiString HandlerOfOpen(AnsiString RootDir, int Panel, int DirSel)
{
const AnsiString Mask="\\*.*\0";
char PathChar[256];
AnsiString Path;
static AnsiString CurrentPathLeft=RootDir;
static AnsiString CurrentPathRight=RootDir;
long int Row=Form1->FileListLeft->Row;
AnsiString Name=Form1->FileListLeft->Cells[ColName][Row];
if (Panel==LEFT)
{
if (DirSel!=0)// Если сменилась корневая директория
{
switch (DirSel)
{
case 1: //Если выбор в ListDevices
if (RootDir.AnsiCompare(RootDirRight)==0)// Если при смене корневой дирректории
{ // пользователь выбрал то же устройство, что
CurrentPathLeft=CurrentPathRight; // в другой панели, то отображеется
Path=CurrentPathLeft+Mask; // папка открытая в той панели
strcpy(PathChar, Path.c_str());
ViewDirectory(PathChar,LEFT);
Form1->LabelCurrentPathLeft->Caption=CurrentPathLeft;
}
else // Если выбрано устройсво, отличное от устройсва во второй панели
{
CurrentPathLeft=RootDir+"\\";
Path=RootDir+Mask;
strcpy(PathChar, Path.c_str()); //Преобрзование AnsiString в char
ViewDirectory(PathChar, Panel);
Form1->LabelCurrentPathLeft->Caption=CurrentPathLeft;
}
break;
case 2://Если нажатие на bCurrentRootDir
CurrentPathLeft=RootDir+"\\";
Path=RootDir+Mask;
strcpy(PathChar, Path.c_str()); //Преобрзование AnsiString в char
ViewDirectory(PathChar, Panel);
Form1->LabelCurrentPathLeft->Caption=CurrentPathLeft;
break;
}
}
else
{
if ((Form1->FileListLeft->Cells[ColAttrib][Row]=="Dir\0")||//Если двойной клик по
(Form1->FileListLeft->Cells[ColAttrib][Row]=="HideDir\0")||//директории
(Form1->FileListLeft->Cells[ColAttrib][Row]=="HideSysDir\0"))
if (Name=="..\0")//Если переход на один уровень вверх
{
int Pos,Len=CurrentPathLeft.Length();
for (int i=Len-2; i>=3;i--)
{
if (CurrentPathLeft[i]=='\\')
{
Pos=i;
break;
}
}
CurrentPathLeft.Delete(Pos,(Len-Pos));
Path=CurrentPathLeft+Mask;
strcpy(PathChar, Path.c_str()); //Преобрзование AnsiString в char
ViewDirectory(PathChar, LEFT);
Form1->LabelCurrentPathLeft->Caption=CurrentPathLeft;
}
else //Если открытие подкаталога
{
CurrentPathLeft+=Name;
Path=CurrentPathLeft+Mask;
CurrentPathLeft+="\\";
strcpy(PathChar, Path.c_str()); //Преобрзование AnsiString в char
Form1->LabelCurrentPathLeft->Caption=CurrentPathLeft;
ViewDirectory(PathChar,LEFT);
}
else //Если открытие файла (не папки)
{
if (Name!="\0")
{
AnsiString FilePath;
FilePath=CurrentPathLeft+Name;
strcpy(PathChar, FilePath.c_str());
ShellExecute(0,"open",PathChar ,"","",1);
}
}
}
return CurrentPathLeft;
}
else //Если активна правая панель
{
long int Row=Form1->FileListRight->Row;
AnsiString Name=Form1->FileListRight->Cells[ColName][Row];
if (DirSel!=0)//Если сменилась корневая директория
{
switch (DirSel)
{
case 1:
if (RootDir.AnsiCompare(RootDirLeft)==0)// Если при смене корневой дирректории
{ // пользователь выбрал то же устройство, что
CurrentPathRight=CurrentPathLeft; // в другой панели, то отображеется
Path=CurrentPathRight+Mask; // папка открытая в той панели
strcpy(PathChar, Path.c_str());
ViewDirectory(PathChar,RIGHT);
Form1->LabelCurrentPathRight->Caption=CurrentPathRight;
}
else
{
CurrentPathRight=RootDir+'\\';
Path=RootDir+Mask;
strcpy(PathChar, Path.c_str()); //Преобрзование AnsiString в char
ViewDirectory(PathChar, Panel);
Form1->LabelCurrentPathRight->Caption=CurrentPathRight;
}
break;
case 2:
CurrentPathRight=RootDir+'\\';
Path=RootDir+Mask;
strcpy(PathChar, Path.c_str()); //Преобрзование AnsiString в char
ViewDirectory(PathChar, Panel);
Form1->LabelCurrentPathRight->Caption=CurrentPathRight;
break;
}
}
else
{
if ((Form1->FileListRight->Cells[ColAttrib][Row]=="Dir\0")|| //Если двойной клик (Form1->FileListRight->Cells[ColAttrib][Row]=="HideDir\0")|| //по директории
(Form1->FileListRight->Cells[ColAttrib][Row]=="HideSysDir\0"))
if (Name=="..\0") //Переход на один уровень вверх
{
int Pos,Len=CurrentPathRight.Length();
for (int i=Len-2; i>=3;i--)
{
if (CurrentPathRight[i]=='\\')
{
Pos=i;
break;
}
}
CurrentPathRight.Delete(Pos,(Len-Pos));
Path=CurrentPathRight+Mask;
strcpy(PathChar, Path.c_str()); //Преобрзование AnsiString в char
ViewDirectory(PathChar, RIGHT);
Form1->LabelCurrentPathRight->Caption=CurrentPathRight;
}
else //Открытие подкаталога
{
CurrentPathRight+=Name;
Path=CurrentPathRight+Mask;
CurrentPathRight+="\\";
strcpy(PathChar, Path.c_str()); //Преобрзование AnsiString в char
ViewDirectory(PathChar, RIGHT);
Form1->LabelCurrentPathRight->Caption=CurrentPathRight;
}
else
{
if (Name!="\0") //Если двойной клик по файлу (не по папке)
{
AnsiString FilePath;
FilePath=CurrentPathRight+Name;
strcpy(PathChar, FilePath.c_str());
ShellExecute(0,"open",PathChar ,"","",1);
}
}
}
return CurrentPathRight;
}
}
//------------------------------------------------------------------------------
//Создание каталога
bool CreateFolder(int Panel)
{
const AnsiString Mask="\\*.*\0";
AnsiString Path;
bool Result;
char PathChar[256]="\0";
if(Panel==LEFT) // Если активна левая панель
{
Path=CurrentPathLeft+FormDialogCreateDir->edNewDirName->Text;
strcpy(PathChar, Path.c_str()); //Преобрзование AnsiString в char
Result=CreateDirectory(PathChar,0);
if (Result==false)
{
MessageBox(0, " Каталог не создан!\n Возможно неправильное имя -\n повторите ввод.",
"Vontrop Commander - Ошибка!", 0);
}
else
{
Path=CurrentPathLeft+Mask;
strcpy(PathChar, Path.c_str()); //Преобрзование AnsiString в char
ViewDirectory(PathChar, Panel);
if (CurrentPathLeft.AnsiCompare(CurrentPathRight)==0) ViewDirectory(PathChar, RIGHT);
}
}
else// Если активна правая панель
{
Path=CurrentPathRight+FormDialogCreateDir->edNewDirName->Text;
strcpy(PathChar, Path.c_str()); //Преобрзование AnsiString в char
Result=CreateDirectory(PathChar,0);
if (Result==false)
{
MessageBox(0, " Каталог не создан!\n Возможно неправильное имя -\n повторите ввод.",
"Vontrop Commander - Ошибка!", 0);
}
else
{
Path=CurrentPathRight+Mask;
strcpy(PathChar, Path.c_str()); //Преобрзование AnsiString в char
ViewDirectory(PathChar, Panel);
if (CurrentPathRight.AnsiCompare(CurrentPathLeft)==0) ViewDirectory(PathChar, LEFT);
}
}
return Result;
}
//------------------------------------------------------------------------------
//Удаление
void Deleting(int Panel, int Operation)
{
const AnsiString Mask="\\*.*\0";
SHFILEOPSTRUCT StructOperation;
AnsiString Name;
char PathChar[256]="\0";
long int Row;Form1->FileListLeft->Row;
AnsiString Path;
StructOperation.hNameMappings=0;
StructOperation.lpszProgressTitle=0;
StructOperation.hwnd=0;
StructOperation.fAnyOperationsAborted=false;
StructOperation.pTo="\0";
switch (Operation)
{
case FO_DELETE: StructOperation.wFunc=FO_DELETE;
StructOperation.fFlags=0;
break;
case FO_DELETER:StructOperation.wFunc=FO_DELETE;
StructOperation.fFlags=FOF_ALLOWUNDO;
break;
}
if (Panel==LEFT)
{
Row=Form1->FileListLeft->Row;
Name=Form1->FileListLeft->Cells[ColName][Row];
Path=CurrentPathLeft+Name;
strcpy(PathChar, Path.c_str()); //Преобрзование AnsiString в char
strcat(PathChar, "\0");
StructOperation.pFrom=PathChar;
SHFileOperation(&StructOperation);
Path=CurrentPathLeft+Mask;
strcpy(PathChar, Path.c_str()); //Преобрзование AnsiString в char
ViewDirectory(PathChar, Panel);
if (CurrentPathRight.AnsiCompare(CurrentPathLeft)==0) ViewDirectory(PathChar, RIGHT);
}
else
{
Row=Form1->FileListRight->Row;
Name=Form1->FileListRight->Cells[ColName][Row];
Path=CurrentPathRight+Name;
strcpy(PathChar, Path.c_str()); //Преобрзование AnsiString в char
strcat(PathChar, "\0");
StructOperation.pFrom=PathChar;
SHFileOperation(&StructOperation);
Path=CurrentPathRight+Mask;
strcpy(PathChar, Path.c_str()); //Преобрзование AnsiString в char
ViewDirectory(PathChar, Panel);
if (CurrentPathRight.AnsiCompare(CurrentPathLeft)==0) ViewDirectory(PathChar, LEFT);
}
}
//------------------------------------------------------------------------------
//Копирование или перемещение
void CopyOrRemove(int Panel, int Operation)
{
const AnsiString Mask="\\*.*\0";
SHFILEOPSTRUCT StructOperation;
AnsiString Name;
char PathCharFrom[256]="\0";
char PathCharTo[256]="\0";
long int Row;Form1->FileListLeft->Row;
AnsiString Path;
if (CurrentPathRight.AnsiCompare(CurrentPathLeft)==0)
MessageBox(0, " Конечный и исходный каталоги совпадают!!!", "Vontrop Commander - Ошибка!", 0);
else
{
StructOperation.hNameMappings=0;
StructOperation.lpszProgressTitle=0;
StructOperation.hwnd=0;
StructOperation.fAnyOperationsAborted=false;
StructOperation.fFlags=0;
switch (Operation)
{
case FO_COPY: StructOperation.wFunc=FO_COPY;
break;
case FO_MOVE:StructOperation.wFunc=FO_MOVE;
break;
}
if (Panel==LEFT)
{
Row=Form1->FileListLeft->Row;
Name=Form1->FileListLeft->Cells[ColName][Row];
Path=CurrentPathLeft+Name;
strcpy(PathCharFrom, Path.c_str()); //Преобрзование AnsiString в char
StructOperation.pFrom=PathCharFrom;
strcpy(PathCharTo, CurrentPathRight.c_str()); //Преобрзование AnsiString в char
StructOperation.pTo=PathCharTo;
SHFileOperation(&StructOperation);
Path=CurrentPathLeft+Mask;
strcpy(PathCharTo, Path.c_str()); //Преобрзование AnsiString в char
ViewDirectory(PathCharTo, Panel);
Path=CurrentPathRight+Mask;
strcpy(PathCharTo, Path.c_str()); //Преобрзование AnsiString в char
ViewDirectory(PathCharTo, RIGHT);
}
else
{
Row=Form1->FileListRight->Row;
Name=Form1->FileListRight->Cells[ColName][Row];
Path=CurrentPathRight+Name;
strcpy(PathCharFrom, Path.c_str()); //Преобрзование AnsiString в char
StructOperation.pFrom=PathCharFrom;
strcpy(PathCharTo, CurrentPathLeft.c_str()); //Преобрзование AnsiString в char
StructOperation.pTo=PathCharTo;
SHFileOperation(&StructOperation);
Path=CurrentPathRight+Mask;
strcpy(PathCharTo, Path.c_str()); //Преобрзование AnsiString в char
ViewDirectory(PathCharTo, Panel);
Path=CurrentPathLeft+Mask;
strcpy(PathCharTo, Path.c_str()); //Преобрзование AnsiString в char
ViewDirectory(PathCharTo, LEFT);
}
}
}
//------------------------------------------------------------------------------
Unit3.c
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormDialogCreateDir *FormDialogCreateDir;
//---------------------------------------------------------------------------
__fastcall TFormDialogCreateDir::TFormDialogCreateDir(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TFormDialogCreateDir::bCancelClick(TObject *Sender)
{
FormDialogCreateDir->edNewDirName->Text="";
FormDialogCreateDir->edNewDirName->SetFocus();
FormDialogCreateDir->Hide();
}
//---------------------------------------------------------------------------
void __fastcall TFormDialogCreateDir::bOkClick(TObject *Sender)
{
bool Result=CreateFolder(Panel);
FormDialogCreateDir->edNewDirName->SetFocus();
if (Result==true)
{
FormDialogCreateDir->edNewDirName->Text="";
FormDialogCreateDir->Hide();
}
}
//---------------------------------------------------------------------------
void __fastcall TFormDialogCreateDir::edNewDirNameKeyDown(TObject *Sender,
WORD &Key, TShiftState Shift)
{
bool Result;
switch (Key)
{
case 13: Result=CreateFolder(Panel);
FormDialogCreateDir->edNewDirName->SetFocus();
if (Result==true)
{
FormDialogCreateDir->edNewDirName->Text="";
FormDialogCreateDir->Hide();
}
break;
case 27: FormDialogCreateDir->edNewDirName->Text="";
FormDialogCreateDir->edNewDirName->SetFocus();
FormDialogCreateDir->Hide();
break;
}
}
//---------------------------------------------------------------------------
Unit4.c
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit4.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormDialogDelete *FormDialogDelete;
#include "Unit2.h"
//---------------------------------------------------------------------------
__fastcall TFormDialogDelete::TFormDialogDelete(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TFormDialogDelete::bCancelClick(TObject *Sender)
{
FormDialogDelete->bRecycler->SetFocus();
FormDialogDelete->Hide();
}
//---------------------------------------------------------------------------
void __fastcall TFormDialogDelete::bDeleteClick(TObject *Sender)
{
Deleting(Panel,FO_DELETE);
FormDialogDelete->bRecycler->SetFocus();
FormDialogDelete->Hide();
}
//---------------------------------------------------------------------------
void __fastcall TFormDialogDelete::bRecyclerClick(TObject *Sender)
{
Deleting(Panel,FO_DELETER);
FormDialogDelete->bRecycler->SetFocus();
FormDialogDelete->Hide();
}
//---------------------------------------------------------------------------
[1] Если в описании функции нет указания, откуда она вызывается, значит она вызывается из других модулей программы, т.е. в функциях-обработчиках событий. (см. Приложение A).