Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Содержание
Введение……………………………………………………………………………..………………….5
1. Анализ задания и постановка задач………………………………………………………………...6
2. Теоретическая часть…………………………………………………………………………………7
3. Проектирование программы……………………………………………………………………….8
4. Реализация программы……………………………………………………………………………..9
5.Тестирование программы………………………………………………………………………….14
Заключение…………………………………………………………………………………………...16
Литература…………………………………………………………………………………………….17
Приложение «А»…………………………………………………………………………………...…18
Приложение «Б»……………………………………………………………………………………...19
Введение
Файловые менеджеры это программы упрощающие и ускоряющие работу с файлами. Они позволяют как создавать, так и удалять файлы, редактировать, копировать, перемещать и многое другое.
Ни одна операционная система на сегодняшний день не может обойтись без удобного и надежного файлового менеджера. Огромное количество нарастающих с каждым днем данных нуждается в грамотной структуризации и разделении. Не зря все современные операционные системы, как правило, включают в свой состав, в первую очередь, именно файловый менеджер, как неотъемлемую часть самой ОС и необходимый компонент для реализации всех возможностей по доступу к файловой системе. При этом такой доступ должен удовлетворять многим, зачастую противоположным условиям, к которым относятся: возможность быстрого поиска и отображения нужной информации, полнота операций над этими данными, гарантированное исключение ошибок при этих операциях, простота и т.д.
Проект состоит, помимо файлов, создаваемых системой программирования автоматически, из четырех модулей (Unit1.c, Unit2.c, Unit3.c и Unit4.c).
Раздел «Анализ задания и постановка задач» описывает процесс постановки задачи. Здесь определяются входные и выходные данные для программы.
Раздел «Теоретическая часть» приводит описание программных средств используемых при разработке. Приводится обоснование выбранных программных продуктов.
Раздел «Проектирование программы». Данный раздел предоставляет непосредственно информацию о компонентах, которые участвовали при создании программы, описывается их назначение в каждом участке программы.
Раздел «Реализация программы». Данный раздел предоставляет детальное описание работы программы, её функций.
Раздел «Тестирование программы» предоставляет информацию об объекте тестирования, необходимых инструментах тестирования, способе его проведения и результатах, полученных в результате его проведения.
В разделе «Заключение» подводится итог выполнения курсовой работы. Описываются полученные результаты.
В разделе «Литература» приводится список литературы, использованной в ходе выполнения курсовой работы.
В приложении «А» приводится функциональная схема программы.
Приложение «Б» содержит листинг программы.
1. Анализ задания и постановка задач
В ходе реализации проекта необходимо реализовать программу, которая способна производить основные действия над файлами и каталогами: копирование удаление, перемещение, создание новой директории.
Программа должна осуществлять:
2. Теоретическая часть
Курсовой проект выполнен в системе визуального программирования Borland C++Builder 6.0, с использованием библиотеки визуальных компонентов (VCL) и функций Windows API.
Borland 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 используется для обозначения панели, над которой производятся действия.
FO_DELETER=5 используется в Delete для выбора действия «помещение в корзину.
Используются глобальные переменные:
В главном модуле (Unit1), находится описание главной формы программы, создаваемой при ее запуске, в теле этого модуля находятся исходные тексты обработчиков событий, порождаемых теми или иными действиями пользователя в главной форме программы (Form1).
Во втором модуле (Unit2) описаны все функции, на вызове которых строится работа программы, кроме функций-обработчиков событий. В хедере этого модуля объявлены глобальные константы и переменные, а так же находятся прототипы функций, вызываемых из других модулей.
В третьем модуле (Unit3) находится описание и функции-обработчики событий для формы (FormDialogCreateDir), являющейся диалоговым окном создания новой директории.
В четвертом модуле (Unit4) находится описание и функции-обработчики событий для формы (FormDialogDelete), являющейся диалоговым окном удаления или помещения в корзину.
4. Реализация программы
При запуске программы создается главная форма Form1 представитель класса TForm в соответствии с рисунком 4.1 При создании формы создаются списки доступных устройств, отображаемые в FileListLeft и FileListRigh, в обеих панелях отображается корневая директория диска C:\, поскольку нами было сделано предположение, что этот логический диск должен быть практически на всех компьютерах, так же создается множество атрибутов директории DirAttribSet, используемое функциями второго модуля.
В Form1 реализовано одно событие: Create (создание, функция-обработчик: FormCreate). Далее опишем объекты, расположенные на Form1.
FileListLeft и FileListRight представителями класса TStringGrid (строковая таблица). Выполняют функцию панелей, куда происходит отображение содержимого директорий и где пользователь выбирает файл (каталог), над которым он собирается выполнять какое-либо действие. Здесь большое значение имеет понятие «активная панель». Роль активной панели играет та таблица, к которой в данный момент обращается пользователь. Все операции совершаются с файлами (каталогами), отображенными в активной панели (копирование и перемещение осуществляется в папку, содержимое который в данный момент отображено в неактивной панели). В программе предусмотрен разный вид для активной и неактивной панелей. В FileListLeft и FileListRigh реализованы следующие события: DblClick (двойной клик мыши, функции-обработчики: FileListLeftDblClick и FileListRightDblClick), Enter (вход, что означает, что панель становится активной, функции-обработчики: FileListLeftEnter и FileListRightEnter), KeyDown («горячие клавиши», функции-обработчики: FileListLeftKeyDown и FileListRightKeyDown).
ListDevicesLeft и ListDevicesRight представители класса TComboBox (выпадающий список выбора). Являются списками доступных устройств хранения информации. Выбор пользователем какого-либо устройства из этого списка означает переход к корневой директории этого устройства, которая отображается в соответствующей панели, становящейся при этом активной. В случае, если корневые директории в обеих панелях после выбора совпадают, то в активной панели отображается содержимое той же папки, что и в неактивной. В ListDevicesLeft и ListDevicesRight реализованы следующие события: Select (выбор пункта в списке, функции-обработчики: ListDevicesLeftSelect и ListDevicesRightSelect), Enter (вход, что означает, что соответствующая панель становится активной, функции-обработчики: FileListLeftEnter и FileListRightEnter).
bRemove, bCopy, bCreateDir, bDelete, bCurrentRootDirLeft и bCurrentRootDirRight представители класса TButton (кнопка). Кнопки выполняют различные функции. Во всех кнопках реализовано только одно событие Click (нажатие, функции обработчики: bCreateDirClick, bDeleteClick, bCopyClick, bRemoveClick, bCurrentRootDirLeftClick и bCurrentRootDirRightClick). При нажатии на bRemove происходит перемещение файла (каталога, со всеми вложенными каталогами) из папки, отображенной в активной панели, в папку, отображенную в неактивной. Нажатие bCopy практически аналогично нажатию на bRemove. только происходит копирование, а не перемещение. Нажатие на bCreateDir выводит диалог создания каталога FormDialogCreateDir. Нажатие на bDelete выводит диалог удаления или помещения в корзину FormDialogDelete. При нажатии на bCurrentRootDirLeft или bCurrentRootDirRight в соответствующих панелях происходит отображение корневой директории текущего устройства хранения информации.
LabelCurrentPathLeft и LabelCurrentPathRight представители класса TLabel (надпись). В этих объектах отображаются текущие пути панелей.
Рисунок 4.1 Главная форма программы
При нажатии на кнопку формы Form1 bCreateDir на экран выводится форма FormDialogCreateDir представитель класса TForm в соответствии с рисунком 4.2.
Рисунок 4.2 Форма создания нового каталога
Опишем объекты расположенные на FormDialogCreateDir.
При нажатии на кнопку формы Form1 bDelete на экран выводится форма FormDialogDelete представитель класса TForm в соответствии с рисунком 4.3.
Рисунок 4.3 Форма для удаления каталога
Опишем объекты на FormDialogDelete:
Рассмотрим функции реализации операций:
1) CreateListOfDevices.
Создает список корневых директорий доступных устройств хранения информации и отображает этот список в ListDevicesLeft и ListDevicesRight.
Функции не передаются параметры. Не возвращает значения.
Используется функция Windows API GetDriveType.
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.
3) StrucFindToFileProp.
Преобразует структуру типа WIN32_FIND_DATA в _FileProperty.
Функции передается структура типа WIN32_FIND_DATA и ссылка на структуру типа _FileProperty. Не возвращает значения.
Вызывается в ViewDirectory.
Тип _FileProperty описывается в начале модуля и используется для отображения результатов работы ScanDir в FileListLeft (FileListRight), т.к. некоторые поля WIN32_FIND_DATA не адаптированы для вывода.
4) ViewDirectory. Отображает содержимое папки, путь к которой передается в Path[] в активной панели.
Функции предается строка, заканчивающаяся нулем (char Path[]), содержащая путь, который передается в ScanDir, и переменная (int Panel), передаваемая в ScanDir, и в зависимости от значения которой, результаты отображаются в FileListLeft (если Panel=LEFT) или FileListRight (если Panel=RIGHT). Не возвращает значения.
Вызывается в HandlerOfOpen, CreateFolder, CopyOrRemove и Deleting.
5) HandlerOfOpen.
В зависимости от действий пользователя, выполняет различные операции. Если происходит выбор в ListDevicesLeft (ListDevicesRight), то отображается корневая директория, выбранного устройства при условии, что корневые директории панелей не сосвпадают, иначе в активной панели отображается открытая папка неактивной панели. Если происходит нажатие на bCurrentRootDirLeft (bCurrentRootDirRight), то отображается корневая директория текущего устройсва. Если происходит двойной клик (нажатие клавиши Enter) по FileListLeft (FileListRight), то анализируется, какая строка находится сейчас в фокусе, и в зависимости от содержимого, выполняются различные операции. Если в фокусе находится файл, то он открывается приложением, с которым ассоциирован либо, если это приложение, производится его запуск. Если в фокусе находится папка, то отображается ее содержимое. Все действия совершаются с активной панелью.
Функции передается срока, путь к корневой директории устройства (AnsiString RootDir), активная панель (int Panel) и признак смены корневой директории (int DirSel). Возвращает текущий путь активной директории.
Используется функция Windows API ShellExecute.
6) CreateFolder.
Создает директорию в активной панели.
Функции передается указание на то, какая сейчас панель активна (int Panel). Возвращает значение типа bool, в зависимости от результатов выполнения операции. Функция создает каталог в пути панели, являющейся активной. В качестве текущего пути в каждой панели используются значения соответствующих глобальных переменных.
Используются функции Windows API: CreateDirectory и MessageBox.
7) Deleting.
Удаляет или помещает в корзину объект (файл или папку, со всеми ее вложенными папками), находящийся в фокусе в активной панели.
В функцию передается признак активной панели (int Panel) и операция (int Operation), которую надо совершить, т.е. удалить или поместить в корзину. Не возвращает значения.
Используется функция Windows API SHFileOperation.
8) 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. http://program.rin.ru/
2. Шмидский Я. К. Программирование на языке С/С++. Самоучитель. М.: Вильямс, 2004. -352с.
3. http://www.kavkazchat.com/
приложение А
Блок-схема взаимодействия компонентов программы
Приложение Б
(обязательное)
Исходные тексты модулей разработанного приложения
Unit1.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"
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.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)
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.cpp
#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.cpp
#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();
}
PAGE \* MERGEFORMAT 15
Выбор элемента в левом списке устройств хранения информации
RootDirLeft=Form1->ListDevicesLeft->Text.Delete
(3,(Form1->ListDevicesLeft->Text.Length()-2));
DirSel=1;
CurrentPathLeft=HandlerOfOpen(RootDirLeft, LEFT, DirSel);
Form1->FileListLeft->SetFocus();
Б
DirSel=0;
CurrentPathRight=HandlerOfOpen(RootDirRight,RIGHT, DirSel);
DirSel=0;
CurrentPathLeft=HandlerOfOpen(RootDirLeft, LEFT, DirSel);
А
Двойной клик по элементу левой панели
Действие пользователя
Создание формы
CreateListOfDevices();
CreateDirAttribSet();
RootDirLeft="C:\\";
RootDirRight="C:\\";
DirSel=1;
CurrentPathLeft=HandlerOfOpen(RootDirLeft, LEFT, DirSel);
CurrentPathRight=HandlerOfOpen(RootDirRight, RIGHT, DirSel);
Начало
Двойной клик по элементу правой панели
Г
Нажатие кнопки «OК»
bool Result=CreateFolder(Panel);
FormDialogCreateDir->edNewDirName->SetFocus();
if (Result==true)
{
FormDialogCreateDir->edNewDirName->Text="";
FormDialogCreateDir->Hide();
}
Нажатие кнопки «Отмена»
FormDialogCreateDir->edNewDirName->Text="";
FormDialogCreateDir->edNewDirName->SetFocus();
FormDialogCreateDir->Hide();
Действие пользователя
Нажатие кнопки «Копировать»
CopyOrRemove(Panel,FO_COPY);
Нажатие кнопки «Переместить»
CopyOrRemove(Panel,FO_MOVE);
Нажатие кнопки «Создать каталог»
FormDialogCreateDir->Show();
Выбор элемента в правом списке устройств хранения информации
Б
RootDirRight=Form1->ListDevicesRight->Text.Delete
(3,(Form1->ListDevicesRight->Text.Length()-2));
DirSel=1;
CurrentPathRight=HandlerOfOpen(RootDirRight, RIGHT, DirSel);
Form1->FileListRight->SetFocus();
А
В
DirSel=2;
CurrentPathRight=HandlerOfOpen(RootDirRight, RIGHT, DirSel);
Form1->FileListRight->SetFocus();
Конец
Нажатие кнопки «Закрыть» системного меню
Нажатие правой кнопки «\»
Нажатие левой кнопки «\»
DirSel=2;
CurrentPathLeft=HandlerOfOpen(RootDirLeft, LEFT, DirSel);
Form1->FileListLeft->SetFocus();
Нажатие кнопки «Отмена»
FormDialogDelete->bRecycler->SetFocus();
FormDialogDelete->Hide();
Нажатие кнопки «В корзину»
Deleting(Panel,FO_DELETER);
FormDialogDelete->bRecycler->SetFocus();
FormDialogDelete->Hide();
Нажатие кнопки «Удалить»
Deleting(Panel,FO_DELETE);
FormDialogDelete->bRecycler->SetFocus();
FormDialogDelete->Hide();
Действие пользователя
Нажатие кнопки «Удалить»
FormDialogDelete->Show();
FormDialogDelete->bRecycler->SetFocus();
Г
В