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

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

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

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


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


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

Задание на курсовую работу:

Разработка файлового менеджера. (Аналог Far Manager, Total Commander и т.п.).


Оглавление

Задание на курсовую работу

Введение

1. Аналитическая часть

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

2.1 Глобальные переменные

2.2 Пользовательские функции

3. Конструкторская часть

3.1 Дополнительные возможности

3.1.1 Копирование/перемещение перетаскиванием

3.1.2 Работа с дискетами и дисками

3.1.3 Свойства файлов, папок и дисков

4. Техническая документация

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

Вывод

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


Введение

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

Наличие файлового менеджера в самих ОС не останавливает пользователей в поисках программы «для себя». В данной программе сделана попытка объединить только самые нужные для пользователя функции по работе с файловой системой в наглядном и простом виде. Включение всех возможных операций не было главной целью автора программы, основная задача – необходимый минимум в сочетании с простотой. Программа реализует в себе все способы взаимодействия с пользователем и другими программами, предоставляемые операционной средой Windows, как то: работа с буфером Clipboard, перемещение и копирование посредством перетаскивания (Drag’n’Drop), контекстные меню, панель управления и др.

Данный файловый менеджер не претендует на звание самого удобного или самого полного, а лишь отражает взгляд автора на то, каким должен быть простой, но вместе с тем функциональный проводник по файловой системе. Доступ к информации о системе полностью осуществляется через API Windows, что делает программу легко переносимой среди ОС этого класса. Программа написана в среде Microsoft Visual Studio 2008.


1. Аналитическая часть

Основной концепцией стало сосредоточение максимума информации в одном окне таким образом, чтобы обеспечить простой и быстрый переход по иерархической файловой системе. Для этого главное окно программы было разбито мысленно на 4 части: иерархическое окно папок, последовательный список файлов, управляющие меню и панель и окно информации (панель состояния). Все эти компоненты безусловно связаны между собой и выполняют общую задачу – наиболее полное отображение информации.

Дерево папок представляет собой объект класса TTreeView, в который программным образом загружается иерархическая файловая структура носителей информации ПК. Данный компонент должен обеспечить быстрый доступ к отдельным контейнерам (папкам, директориям, дискам) файловой системы, корнем дерева служит виртуальный компонент «Мой компьютер», замыкающий на себе все диски. Список файлов представлен объектом класса TListView и содержит список содержимого, активизированной в данный момент в дереве директории. При этом связь между списком и деревом не только прямая, но и обратная – открытие вложенных папок в списке влечет за собой последовательное раскрытие дерева. Список содержит довольно полную информацию о файле (вложенной директории), начиная с имени и заканчивая датой создания. Дерево и список взаимодействуют между собой и в процессе обмена файлами посредством перетаскивания. Перетаскивание может осуществляться как в пределах одного компонента (папки в папку в TreeView, файла в папку в ListView), так и между компонентами.

Меню (класс TMainMenu) и панель управления (класс TControlBar) реализуют набор операций над элементами файловой системы: создание папки, копирование, удаление, вырезание и т.д. А, кроме того, позволяют изменять само отображение этих элементов, а также порядок их сортировки, что в некоторых случаях бывает крайне полезно. Важным свойством элементов управления является их интерактивность – те команды, которые в текущих обстоятельствах не могут быть выполнены, скрываются или отображаются в элементах блеклым цветом. К компонентам управления следует отнести и контекстное меню, подменяющее пункты главного и позволяющее не отвлекаться от списка и дерева путем обращения к нему нажатием правой клавиши.

Наконец информационная панель (панель состояния, статуса) (класс TStatusBar) жестко связана со списком файлов и отображает количество элементов, а также свободное место на диске.

Итак, все компоненты хотя и графически разделены, но логически связаны между собой в любой момент времени, что позволяет пользователю не отвлекаться от главной задачи – доступа к некоторому элементу файловой системы и выполнения операции над ним. Именно поэтому была выбрана такая структура программы (панель папок – панель файлов) в противовес организации двух списков файлов в стиле Norton Commander, ведь работа с одной из панелей полностью автономна по отношению к другой. Доступ к глубоко лежащим в структуре объектам в такой системе, по мнению автора неудобна, в отличие от использования панели папок, которая позволяет за несколько щелчков добраться до любого контейнера. К тому же именно структура «папки – список» позволяет логично организовать работу с объектами в стиле Drag’n’Drop.


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

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

2.1 Глобальные переменные

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

Данные об установленных жестких дисках и приводов дискет хранят 2 переменные - set_drive_num и DiskIn, причем первая содержит номера присутствующих приводов, вторая же имена тех из них, в которые вставлена дискета или оптических диск, что позволяет динамически отслеживать пустые приводы и запрещать обращение к ним.

Ряд переменных хранит информацию о состоянии списка файлов и папок ListView1: CurrentDir – название текущего каталога, StyleListView – стиль отображения значков (список, таблица…), ColumnToSort – номер сортируемой колонки, Direct – направление сортировки (прямое, обратное).

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


2.2   Пользовательские функции

I.   Вспомогательные функции: void FirstUpOtherDown(char) и void FirstUpOtherDown(AnsiString).

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

II.  Функции поиска и отображения, содержащихся в системе носителей данных и приводов: void GetDrives() и void ShowDrives().

Функция GetDrives осуществляет первичный поиск носителей и осуществляет загрузку их номеров в глобальную переменную. Само отображение выполняется в ShowDrives, где помимо анализа полученной информации осуществляется построение названия диска, исходя из его номера и имени метки. Определение типа привода позволяет загрузить соответствующее изображение, а точнее выбрать его из списка изображений ImageList.

III.  Функции добавления элементов (записей, узлов) в дерево и список файлов: TTreeNode* AddChildInNodeTree(TTreeNode, AnsiString), TListItem *AddItemInListView (TSearchRec, AnsiString).

Функция добавления записи в дерево осуществляет вставку потомка для переданного в функцию узла. Осуществляется настройка свойств вставляемого элемента: пути к нему (свойство Data), значка (свойство ImageIndex и SelectedIndex), имени (свойство Name).

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

IV.  Функции формирования дерева: void ViewChild(TTreeNode *), void DeleteChild(TTreeNode* Node) и вспомогательная функция bool CheckExpandedChild(TTreeNode *).

Основная идея формирования дерева – нет необходимости в полном его построении в начале выполнения программы, что, безусловно, сокращает время на запуск и уничтожает необходимость в обходе всех папок на диске. В этой ситуации возникает проблема динамического построения дерева во время его раскрытия – свертывания. Реализацией этой идеи и стали функции ViewChild и DeleteChild. Первая принимает в качестве параметра указатель на раскрываемый узел, который использует для обхода всех его потомков (вложенных папок узла) и благодаря которому находит для этих потомков свои вложенные папки. При обходе для этих вложенных папок добавляются соответствующие узлы. Таким образом, в целом функция предназначена для добавления в дерево потомков потомков (внуков) раскрываемых узлов. Это позволяет вовремя добавлять узлы, тем самым, скрывая неполноту дерева. Необходимость наличия при раскрытии узла именно внуков, а не только детей связана с тем, что в раскрытой ветви, составленной из детей, уже должно быть очевидно наличие возможного продолжения раскрытия.

Функция DeleteChild выполняет обратную операцию – удаляет внуков сворачиваемого узла, тем самым предостерегается возможность двукратного дополнения узла в дерево.

Из этих правил есть одно исключение – ситуация, когда среди потомков сворачиваемого узла есть развернутые ветви. Удаление внуков в этом случае приведет к нарушению структуры дерева (развернутые внутри сворачиваемого узла узлы будут свернуты). Проверку такой ситуации осуществляет функция CheckExpandedChild – она возвращает true в случае наличия хотя бы одного развернутого потомка у переданного в качестве параметра узла.

V.  Функция формирования списка файлов и каталогов: void ViewFailAndFolderInListView (AnsiString dir).

Задача функции проста: вывести на экран содержание переданной по параметру папки dir. Порядок ее осуществления: очистка списка, поиск файлов (папок) в указанном каталоге функциями FindFirst, FindNext, FindClose, добавление соответствующих найденным файлам записей вышеописанной функцией AddItemInListView, сохранение текущего каталога, обновление статусной панели информации.

VI.  Функция выполнения операций над файлами int FileAndFolderOperation(char *frombuf, char *tobuf, unsigned int operation) и вспомогательная функция формирования строки-списка файлов void PrepareBufForOperationInListView(char * &).

Функция FileAndFolderOperation выполняет простую операцию – согласно полученным данным: символьному массиву «откуда копировать» frombuf и массиву «куда копировать» tobuf, а также коду операции заполняет структуру SHFILEOPSTRUCT и передает ее на обработку API функции SHFileOperation, а также возвращает результат ее выполнения.

Самой сложной частью выполнения операций над файлами является заполнение символьной строки frombuf, особенно для ListView, т.к. позволяется выделение целой группы файлов и папок. Буфер же frombuf должен содержать пути ко всем объектам, разделенные символом ‘\0’ и заканчивающиеся двойным символом нуля. Именно для этого введена процедура PrepareBufForOperationInListView. В данной процедуре осуществляется анализ выделенных объектов в ListView и соответствующее заполнение буфера frombuf. Для этого используется ряд вспомогательных процедур: strcat0 и finstr. Первая соединяет две строки, оставляя между ними символ нуля, вторая финализирует строку – добавляет в конце два символа двойного нуля.

VII.  Функции обновления дерева, списка, меток: void UpdateTreeView(bool UpdateAllways), void UpdateListView(bool UpdateAllways), void UpdateLabel(), void UpdateAll(bool UpdateAllways) и вспомогательная функция void RecursTree(TTreeNode *node,bool UpdateAllways).

Обновление дерева каталогов осуществляется двумя функциями – UpdateTreeView и RecursTree. Первая – бутафорская и осуществляет лишь запуск рекурсивной функции RecursTree. Ее основная задача – найти вершину дерева и передать ее в RecursTree.

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

Обновление списка файлов аналогично и даже проще. Отпадает необходимость использования рекурсивных функций – уровень только один. В функции UpdateListView аналогично осуществляется сравнение количества папок в текущем каталоге с количеством записей, их несоответствие приводит к ряду проверок, описанных выше. Добавляется еще одна проверка на наличие текущего каталога. Его отсутствие означает простую очистку списка и указания текущей пустой папки.

В задачу функции UpdateLabel входит просмотр меток всех приводов и переформирование заголовков дисков дерева в соответствии с найденной информацией.

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

Во все функции обновления передается в качестве параметра булева переменная UpdateAllways. Установка этой переменной в true означает принудительную проверку списка и дерева даже в том случае, если количество записей совпадает с числом сопоставленных элементов. Это полезно например при переименовании – число записей не меняется, но меняются их имена.

VIII.  Функция переименования AnsiString RenameFileOrFolder(AnsiString NewName).

Данная функция получает параметром новое имя для находящегося в фокусе объекта. Путем проверки состояния ListView и TreeView и определения находящегося в фокусе узла, определяется текущий объект и путь к нему (по свойству Data). Затем формируются символьные массивы » frombuf, исходя из бывшего пути, и tobuf, по новому имени. Осуществление попытки переименования заканчивается возвратом либо нового имени, в случае ее удачи, либо прежнего, если переименование не удалось. Это полезно в функция редактирования имен узлов – узлу назначается имени, возвращенное функцией.

IX.  Функция удаления void DeleteFileOrFolder().

Работа функции довольно проста – необходимо определить какой из элементов в фокусе (ListView или TreeView), заполнить массив frombuf путями, соответствующими выделенным там узлам (согласно свойству узлов Data), передать все это на обработку функции FileAndFolderOperation с указанием операции – FO_DELETE.

X.  Функция создания папки void CreateFol().

Идея построения данной функции такова – создается папка с произвольным именем, но после создания фокус немедленно передается записи, отображающей ее, с указанием редактирования. Тем самым пользователь получает возможность немедленно изменить ее имя на любое другое. Таким образом задействуется вышеописанная функция переименования. Формирование имени папки осуществляется из сочетания «Новая папка» и числа, которое подбирается таким образом, чтобы соответствующая папка отсутствовала в системе.

XI.  Служебные функции ListView: void ExpandTreeForFile(AnsiString FileName) и void OpenFileOrFolder().

Функция OpenFileOrFolder вызывается при клике на элементе списка ListView и осуществляет соответствующую операцию: при клике на папке – открывает ее, при клике на файле – запускает его. По щелчку на папке происходит вызов ViewFailAndFolderInListView с указанием пути к ней для отображения содержимого, по щелчку на файле предпринимается попытка запустить его функцией ShellExecute. Если попытка запуска неудачна, на экран выводится сообщение об ошибке, возвращаемое GetLastError.

Вызов функции ExpandTreeForFile осуществляется лишь из процедуры OpenFileOrFolder и предназначен для раскрытия ветвей дерева до текущей папки, при ее изменении. Новая текущая папка передается в функцию в качестве параметра, где этот путь последовательно разбивается на части и сопоставляется различным узлам дерева. Последовательным проходом сверху-вниз осуществляется раскрытие узлов, соответствующих родительским директориям, содержащим данную папку, и выделение новой текущей директории в дереве TreeView. Так становится возможной связь компонента ListView с TreeView: изменение текущей директории в ListView приводит к изменению выделения текущего контейнера в TreeView.

XII.  Функции работы с буфером: void PasteFileFromClipboard(), void CopyFileToClipboard(bool Copy).

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

Исходя из этого, реализация операции по вставке файлов из буфера была осуществлена в следующем порядке: открытие буфера OpenClipboard, проверка наличия в буфере данных нужного формата функцией IsClipboardFormatAvailable; получение указателя на данные GetClipboardData и, наконец, определение их количества и последовательное извлечение строк API функцией DragQueryFile. На основании полученных строк формируется массив frombuf передаваемый на обработку.

Еще одной проблемой стало получение информации о необходимости копирования, либо перемещения файла. Стандартом является получение указателя из буфера по регистрируемому формату CFSTR_PREFERREDDROPEFFECT. Указатель содержит адрес в памяти, по которому находится четыре байта информации о типе перемещения/копирования. Сравнением этих данных с константами и вызовом функции FileAndFolderOperation и завершается вставка файлов (папок) из буфера. Закрытие буфера по окончании функции разрешает доступ к нему для других программ.

Функция void CopyFileToClipboard(bool Copy) универсальная и в зависимости от переданного ей параметра осуществляет либо копирование, либо перемещение файла в буфер (точнее, лишь указание на перемещение или копирование). Результатом анализа переданного параметра является выделением памяти под двойное слово и помещение в нее соответствующей константы DROPEFFECT_COPY или DROPEFFECT_MOVE. Передача информации о копируемых файлах осуществляется последовательным заполнением структуры DROPFILES, построением буфера frombuf и перемещения этих данных в память. После открывается буфер, функцией SetClipboardData в буфере размещаются данные о фалах и типе операции, буфер закрывается – данные готовы к копированию (перемещению).


3.Конструкторская часть

файловый менеджер система пользовательский

I.  TreeView1 : TTreeView

Данный визуальный объект изображает дерево каталогов и настраивается динамически в процессе работы путем добавления/удаления узлов. Основные события, участвующие в формировании дерева – OnExpanded и OnCollapsing, возникающие соответственно при раскрытии и свертывании некоторого узла. По первому событию осуществляется помещение в дерево внуков раскрываемого узла посредством функции ViewChild, по последнему – удаление внуков сворачиваемого узла процедурой DeleteChild. Пользователь полностью скрыт от информации об изменении структуры дерева.

Обработчик события OnClick обеспечивает реакцию на щелчок на изображении некоторой папки. Задача обработчика – вызов процедуры перерисовки списка файлов в соответствии с изменившемся текущим каталогом.

Сортировка элементов дерева, осуществляется стандартным способом: путем включения условия сравнения в обработчик события OnCompare.

II.  ListView1 : TListView

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

Сортировка аналогично TreeView осуществляется вписыванием нужного условия по событию OnCompare. А вот само условие сравнение может меняться и зависит от глобальных переменных ColumnToSort и Direct. Изменение колонки сортировки и направления может происходить как из меню, но чаще путем клика на заголовке столбца. Для этой ситуации предназначен обработчик события – OnColumnClick. Извлекающий данные о новом сортируемом столбце и вызывающий процедуру пересортировки списка – AlphaSort.

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

III.  StatusBar1 : TStatusBar

Этот компонент служит для вывода справочной информации, вывод которой осуществляется в пользовательских функциях: ViewFailAndFolderInListView и UpdateAll.

IV.  Элементы управления MainMenu1 : TMainMenu, ControlBar1 : TControlBar и PopupMenu1 : TPopupMenu.

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

Работа компонента MainMenu организуется обработкой нажатий на отдельные пункты меню, как-то «Создать папку», «Удалить», «Переименовать» и т.д. Обработчики нажатий, как правило, содержат лишь вызов соответствующих процедур. ControlBar1 и PopupMenu1 в основном дублируют пункты меню и содержат аналогичные обработчики. Они введены для удобства пользователя и более быстрому доступу к отдельным командам.

Эти компоненты отличаются лишь способом динамического формирования меню. Для ControlBar1, правда, вообще отсутствуют какие-либо изменения, а вот MainMenu1 и PopupMenu1 меняют состав своих компонентов. Для MainMenu1 осуществляется динамического отслеживание активных компонентов и при открытии группы команд происходит отключение (подсвечивание блеклым светом) тех из них, которые не могут быть доступны в текущий момент. Так как компонент PopupMenu1 представляет собой довольно длинный линейный список команд, закрывающий собой большую часть экрана, ненужные действия просто изымаются из всплывающего меню. Пользователь видит лишь те, которые возможны в текущий момент.

3.1  Дополнительные возможности

 

3.1.1Копирование/перемещение перетаскиванием

Копирование/перемещение осуществляется перетаскиванием между двумя компонентами ListView и TreeView. Для осуществления такой возможности используются 3 события в каждом из компонентов: OnMouseDown, OnDragOver и OnDragDrop (расставлены в порядке использования). Первое из них начинает процесс перетаскивания, а именно: проверяет нажата ли левая клавиша на компоненте, осуществляет распознавание типа перетаскивания (копирование/перемещения) путем анализа нажатия клавиши CTRL, начинает перетаскивание методом BeginDrag.

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


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

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

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


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