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

Borland и C++Builder 6.0 как совершенная интерактивная среда программирования на языке C++. Проектирование программы, глобальные переменные. Форма создания нового каталога. Объекты на Form Dialog Delete. Блок-схема взаимодействия компонентов программы.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 27.08.2014
Размер файла 836,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Введение

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

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

Проект состоит, помимо файлов, создаваемых системой программирования автоматически, из четырех модулей (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 для выбора действия «помещение в корзину.

Используются глобальные переменные:

DirSel (тип int) изменяет значение, когда в LitsDevicesLeft (ListDevicesRight) происходит выбор устройства либо происходит нажатие на bCurrentRootDirLeft (bCurrentRootDirRight). Используется для передачи в HendlerOfOpen.

RootDirLeft и RootDirRight (тип AnsiString) - текущий путь корневой директории. Используется для передачи в HendlerOfOpen.

CurrentPathLeft,CurrentPathRight (тип AnsiString) - текущий путь. Возвращается HendlerOfOpen. Используется для передачи в Delete, CreateFolder,CopyOrRemove.

Panel (тип int) - принимает только два значения: LEFT и RIGHT. Используется для указания активной панели.

В главном модуле (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.

edNewDirName - представитель класса TEdit (поле ввода). Поле, куда пользователь вводит имя нового каталога. В edNewDirName реализовано событие KeyDown («горячие клавиши», функция-обработчик edNewDirNameKeyDown).

Label1 - представитель класса TLabel (надпись). Содержит надпись «Имя нового создаваемого каталога».

bOk и bCancel - представители класса TButton (кнопка). В bOk и bCancel реализовано одно событие: Click (нажатие, функции-обработчики: bOkClick и bCancelClick). При нажатии на bOk, если введенное имя правильное (т.е. не содержит зарезервированных символов и слов и не совпадает с именем каталога в активной панели) или нет других ошибок (например, нет прав доступа), создается каталог в папке, отображенной в активной панели, и форма скрывается, в противном случае выдается сообщение об ошибке и предлагается повторить ввод. При нажатии на bCancel форма скрывается без выполнения каких-либо других действий.

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

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

Опишем объекты на FormDialogDelete:

Label1 - представитель класса TLabel (надпись). Содержит надпись «Выберете действие:».

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

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

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

}

Размещено на Allbest.ru


Подобные документы

  • Работа в Borland C++ Builder. Среда разработки и компоненты C++ Builder. Свойства компонентов. Менеджер проектов. Создание приложений в C++ Builder. Выбор компонентов для групповых операций. Работа с базами данных в Borland C++ Builder.

    курсовая работа [35,8 K], добавлен 11.06.2007

  • Особенности создания программы "Файловый менеджер" в среде объектно-ориентированного программирования Delphi. Назначение и основные функции программы, формулировка задачи. Описание программы, использованные компоненты, интерфейс и порядок применения.

    контрольная работа [1,3 M], добавлен 19.06.2012

  • Интегрированная среда программирования C++ Builder 6. Методы вычерчивания графических примитивов. Основные свойства инструментов рисования. Разработка рисунка паутины с центром в точке с произвольным числом лучей. Алгоритм программы в виде блок-схемы.

    курсовая работа [842,5 K], добавлен 13.10.2017

  • Составление программы, с помощью которой пользователь может получать статистические сведения о текстовой информации. Для разработки программы использовался язык С++ и среда программирования Borland C++ Builder 6. Постановка задачи и описание ее решения.

    курсовая работа [1,6 M], добавлен 03.07.2011

  • Ознакомление с возможностями языка Си как средой программирования высокого уровня. Циклы программирования параметрического оператора for и функции форматированного ввода. Разработка программы средствами Си: блок-схема, текст и тестирование программы.

    контрольная работа [204,4 K], добавлен 26.01.2013

  • Особенности среды визуального проектирования Borland Delphi 7.0. Этапы разработки программы и составления блок-схемы алгоритмов. Способы вычисления кусочно-заданной функции одной переменной. Рассмотрение компонентов среды Delphi, ее предназначение.

    контрольная работа [703,8 K], добавлен 24.09.2012

  • Освоение языка программирования Delphi. Построение блок-схемы запуска главного таймера и основная логика программы. Использованные свойства и события Form, MediaPlayer, Timer, MainMenu. Запуск, пауза и остановка анимациии. Создание листинга программы.

    курсовая работа [771,9 K], добавлен 22.06.2014

  • Проектирование программного модуля в среде программирования Borland Delphi 7.0. Схемы алгоритмов решения задач по темам "Символьные переменные и строки", "Массивы", "Работа с файлами", "Создание анимации". Реализация программного модуля, код программы.

    отчет по практике [961,6 K], добавлен 21.04.2012

  • Разработка программы в среде программирования Borland Pascal, которая является электронным тестирующим пособием в области химии для 8-10 классов. Написание алгоритма решения задачи, определение необходимых функций, процедур, модулей, файловых переменных.

    контрольная работа [389,3 K], добавлен 19.09.2010

  • Разработка прикладной программы для операций создания и уничтожения объектов в системе визуального объектно-ориентированного программирования C++Builder. Алгоритм работы программы, набор функций и операторов, компонент и модулей, кнопки событий.

    дипломная работа [672,5 K], добавлен 16.08.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.