Задание на курсовую работу:
Разработка файлового менеджера. (Аналог FarManager, TotalCommander и т.п.).
Оглавление
Задание на курсовую работу
Введение
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), контекстные меню, панель управления и др.
Данный файловый менеджер не претендует на звание самого удобного или самого полного, а лишь отражает взгляд автора на то, каким должен быть простой, но вместе с тем функциональный проводник по файловой системе. Доступ к информации о системе полностью осуществляется через APIWindows, что делает программу легко переносимой среди ОС этого класса. Программа написана в среде Microsoft Visual Studio 2008.
1. Аналитическая часть
Основной концепцией стало сосредоточение максимума информации в одном окне таким образом, чтобы обеспечить простой и быстрый переход по иерархической файловой системе. Для этого главное окно программы было разбито мысленно на 4 части: иерархическое окно папок, последовательный список файлов, управляющие меню и панель и окно информации (панель состояния). Все эти компоненты безусловно связаны между собой и выполняют общую задачу – наиболее полное отображение информации.
Дерево папок представляет собой объект класса TTreeView, в который программным образом загружается иерархическая файловая структура носителей информации ПК. Данный компонент должен обеспечить быстрый доступ к отдельным контейнерам (папкам, директориям, дискам) файловой системы, корнем дерева служит виртуальный компонент «Мой компьютер», замыкающий на себе все диски. Список файлов представлен объектом класса TListViewи содержит список содержимого, активизированной в данный момент в дереве директории. При этом связь между списком и деревом не только прямая, но и обратная – открытие вложенных папок в списке влечет за собой последовательное раскрытие дерева. Список содержит довольно полную информацию о файле (вложенной директории), начиная с имени и заканчивая датой создания. Дерево и список взаимодействуют между собой и в процессе обмена файлами посредством перетаскивания. Перетаскивание может осуществляться как в пределах одного компонента (папки в папку в TreeView, файла в папку в ListView), так и между компонентами.
Меню (класс TMainMenu) и панель управления (класс TControlBar) реализуют набор операций над элементами файловой системы: создание папки, копирование, удаление, вырезание и т.д. А, кроме того, позволяют изменять само отображение этих элементов, а также порядок их сортировки, что в некоторых случаях бывает крайне полезно. Важным свойством элементов управления является их интерактивность – те команды, которые в текущих обстоятельствах не могут быть выполнены, скрываются или отображаются в элементах блеклым цветом. К компонентам управления следует отнести и контекстное меню, подменяющее пункты главного и позволяющее не отвлекаться от списка и дерева путем обращения к нему нажатием правой клавиши.
Наконец информационная панель (панель состояния, статуса) (класс TStatusBar) жестко связана со списком файлов и отображает количество элементов, а также свободное место на диске.
Итак, все компоненты хотя и графически разделены, но логически связаны между собой в любой момент времени, что позволяет пользователю не отвлекаться от главной задачи – доступа к некоторому элементу файловой системы и выполнения операции над ним. Именно поэтому была выбрана такая структура программы (панель папок – панель файлов) в противовес организации двух списков файлов в стиле NortonCommander, ведь работа с одной из панелей полностью автономна по отношению к другой. Доступ к глубоко лежащим в структуре объектам в такой системе, по мнению автора неудобна, в отличие от использования панели папок, которая позволяет за несколько щелчков добраться до любого контейнера. К тому же именно структура «папки – список» позволяет логично организовать работу с объектами в стиле Drag’n’Drop.
2. Теоритическая часть
Все операции при реализации программы были сознательно вынесены из обработчиков событий в отдельные функции-члены класса, для удобства их вызова из любых мест программы и большей структурированности кода. Поэтому большее внимание при описании реализации будет уделено именно таким функция, а не обработчикам событий, которые лишь содержат их вызовы.
Код программы содержит ряд глобальных переменных, хранящих информацию о состоянии ее выполнения: виде отображения значков, вставленных дисках, отсортированной колонке и т.д.
Данные об установленных жестких дисках и приводов дискет хранят 2 переменные - set_drive_num и DiskIn, причем первая содержит номера присутствующих приводов, вторая же имена тех из них, в которые вставлена дискета или оптических диск, что позволяет динамически отслеживать пустые приводы и запрещать обращение к ним.
Ряд переменных хранит информацию о состоянии списка файлов и папок ListView1: CurrentDir – название текущего каталога, StyleListView – стиль отображения значков (список, таблица…), ColumnToSort – номер сортируемой колонки, Direct – направление сортировки (прямое, обратное).
Переменная type_file_operation_drag_drop указывает на необходимость копирования или переноса файла при перетаскивании, что определяется по нажатию соответствующих функциональных клавиш, а установкой DragnDrop в ложь можно вовсе запретить всякие операции посредством переноса.
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. Функции формирования дерева: voidViewChild(TTreeNode *), voidDeleteChild(TTreeNode* Node) и вспомогательная функция boolCheckExpandedChild(TTreeNode *).
Основная идея формирования дерева – нет необходимости в полном его построении в начале выполнения программы, что, безусловно, сокращает время на запуск и уничтожает необходимость в обходе всех папок на диске. В этой ситуации возникает проблема динамического построения дерева во время его раскрытия – свертывания. Реализацией этой идеи и стали функции ViewChildи DeleteChild. Первая принимает в качестве параметра указатель на раскрываемый узел, который использует для обхода всех его потомков (вложенных папок узла) и благодаря которому находит для этих потомков свои вложенные папки. При обходе для этих вложенных папок добавляются соответствующие узлы. Таким образом, в целом функция предназначена для добавления в дерево потомков потомков (внуков) раскрываемых узлов. Это позволяет вовремя добавлять узлы, тем самым, скрывая неполноту дерева. Необходимость наличия при раскрытии узла именно внуков, а не только детей связана с тем, что в раскрытой ветви, составленной из детей, уже должно быть очевидно наличие возможного продолжения раскрытия.