скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты

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

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

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

Разработка файлового менеджера. (Аналог 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().

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

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


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

© 2010.