Реферат Моделирование файловой системы FAT16
Работа добавлена на сайт bukvasha.net: 2015-10-28Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
от 25%
договор
СОДЕРЖАНИЕ
ВВЕДЕНИЕ. 3
1 ПОСТАНОВКА ЗАДАЧИ.. 4
1.1 Теоретическое введение. 4
1.2 Постановка задачи.. 7
2 ПРОЕКТИРОВАНИЕ. 8
2.1 Выбор операционной системы... 8
2.2 Выбор языка программирования.. 8
2.3 Выбор программного обеспечения промежуточного уровня.. 8
2.4 Выбор инструментальных средств.. 8
3 разработка.. 9
3.1 Выбор архитектуры системы... 9
3.2 Построение диаграмм прецедентов и последовательности.. 9
3.3 Разработка вариантов использования.. 11
3.4 Разработка графического интерфейса.. 13
3.5 Разработка архитектуры приложения.. 14
3.6 Разработка алгоритмов работы программы... 16
3.6.1 Метод FileCreate_Click класса Mainform. 17
3.6.2 Метод FileDelete_Click класса Mainform. 18
4 тестирование программы.. 19
4.1 Тестируемые функции.. 19
4.2 Тестирование. 19
5 руководство оператора.. 21
5.1 Назначение программы... 21
5.2 Технические средства для запуска программы... 21
5.3 Работа с программой.. 21
Выводы.. 25
ПЕРЕЧЕНЬ ССЫЛОК.. 26
Приложение А.. 27
ПриложениЕ Б. 31
ВВЕДЕНИЕ
Сложность программных продуктов, в том числе и операционных систем в настоящее время растет не по годам и десятилетиям, как пару десятков лет назад, а по месяцам и дням. Но изучить каждую ее часть, находящуюся на нынешнем уровне развития, представляет собой большую трудность. Именно поэтому проще начать с того, что легло в основу каждой подсистемы ОС.
С каждым днем количество людей, заинтересованных в том, как функционирует та или иная часть ОС, растет. Поэтому становится актуальным упрощение процесса обучения и знакомства пользователей с основами работы наиболее значимых частей операционной системы, а так же выполнение этой задачи в более интересном и наглядном виде.
Примером одной из основных частей ОС является файловая система. Это регламент, определяющий способ организации, хранения и именования данных на носителях информации. Она определяет формат физического хранения информации, которую принято группировать в виде файлов. Конкретная файловая система определяет размер имени файла (папки), максимальный возможный размер файла и раздела, набор атрибутов файла. Некоторые файловые системы предоставляют сервисные возможности, например, разграничение доступа или шифрование файлов.
Файловая система связывает носитель информации с одной стороны и API для доступа к файлам — с другой. Когда прикладная программа обращается к файлу, она не имеет никакого представления о том, каким образом расположена информация в конкретном файле, так же, как и на каком физическом типе носителя (CD, жёстком диске, магнитной ленте или блоке флеш-памяти) он записан. Всё, что знает программа — это имя файла, его размер и атрибуты. Эти данные она получает от драйвера файловой системы. Именно файловая система устанавливает, где и как будет записан файл на физическом носителе (например, жёстком диске).
С точки зрения операционной системы, весь диск представляет собой набор кластеров размером от 512 байт и выше. Драйверы файловой системы организуют кластеры в файлы и каталоги (реально являющиеся файлами, содержащими список файлов в этом каталоге). Эти же драйверы отслеживают, какие из кластеров в настоящее время используются, какие свободны, какие помечены как неисправные.
Целью данного проекта является наглядное моделирование работы файловой системы FAT16, которая использовалась в MS-DOS 3.31.
Для реализации данного проекта был выбран язык C#, как один из лучших объектно-ориентированных языков программирования на данный момент.
Результатом данной работы должна быть программа, которая сможет использоваться в процессе образования людьми, которым интересны основы системного программного обеспечения.
1 ПОСТАНОВКА ЗАДАЧИ
1.1 Теоретическое введение
Файловая система FAT представляет собой таблицу размещения файлов, в которой указываются:
1) непосредственно адреса участков логического диска, предназначенные для размещения файлов;
2) свободные области дискового пространства;
3) дефектные области диска.
В этой таблице каждому блоку, предназначенному для хранения данных, соответствует 16-битовое значение. Если блок свободен, то значение будет нулевым. Если же блок принадлежит файлу, то значение равно адресу следующего блока этого файла. Если это последний блок в файле, то значение - OxFFF . Существует также специальный код для обозначения плохого блока, не читаемого из-за дефекта физического носителя. В каталоге хранится номер первого блока и длина файла, измеряемая в байтах. Емкость диска при использовании 12-битовой FAT ограничена 4096 блоками (2 Мбайт), что приемлемо для дискет, но совершенно не годится для жестких дисков и других устройств большой емкости. На таких устройствах DOS использует FAT с 16-битовыми элементами. На еще больших (более 32 Мбайт) дисках DOS выделяет пространство не блоками, а кластерами из нескольких блоков.
В таблице FAT кластеры, принадлежащие файлу или каталогу, связываются в цепочки. В 16-разрядной FAT можно иметь до 65536 кластеров. Логическое объединение секторов в кластеры позволяет уменьшить размер таблицы FAT и ускорить доступ к файлу. Однако слишком большой размер кластера приводит к неэффективному использованию области данных, особенно при большом количестве маленьких файлов. Например, при размере кластера в 32 сектора (16 Кб) средняя величина потерь на файл составляет 8 Кб. Поэтому в современных файловых системах размер кластера не превышает 4 Кб.
Поскольку файлы на диске подвержены изменению (удаляются, перемещаются, увеличиваются или уменьшаются), то выделение первого свободного кластера для новой порции данных приводит к фрагментации файлов. Данные одного файла могут располагаться не в смежных кластерах, а в удаленных друг от друга.
Таблица FAT является основой данной файловой системы, поэтому она хранится на диске в двух экземплярах. Обновляются копии FAT одновременно, а для работы используется только первый экземпляр. Если он окажется поврежденным, то произойдет обращение ко второму экземпляру. Утилиты проверки и восстановления файловой системы при обнаружении несоответствия первичной и резервной таблицы FAT осуществляет восстановление основной таблицы, используя данные из её копии.
Система FAT очень проста и имеет одно серьезное достоинство: врожденную устойчивость к сбоям. В то же время у нее есть и ряд серьезных недостатков. Первый недостаток состоит в том, что при каждой операции над файлами система должна обращаться к FAT. Это приводит к частым перемещениям головок дисковода и в результате к резкому снижению производительности. Действительно, исполнение программы на одной и той же машине под MS DOS и под DOS-эмулятором систем UNIX или OS/2 различается по скорости почти в 1,5 раза. Особенно это заметно при архивировании больших каталогов.
В файловой системе FAT дисковое пространство логического диска делится на системную область и область данных. Системная область создается и инициализируется при форматировании диска, а в последующем обновляется при работе. Область данных содержит файлы и каталоги, которые образуют на диске иерархическое дерево каталогов, с единственной директорией не входящей в другие - корневым каталогом. Область данных доступна через пользовательский интерфейс операционной системы. Системная область содержит загрузочную запись, зарезервированные сектора, таблицу размещения файлов и корневой каталог. Для каждого файла и каталога в файловой системе хранится справочная информация. Каждый элемент такого справочника занимает 32 байта и содержит: имя файла или каталога, расширение имени файла, атрибуты файла - системный, архивный, только для чтения и др., дату и время создания и последнего изменения файла, номер начального кластера, размер файла.
Рисунок 1.1 – Структура файловой системы FAT16
1.2 Постановка задачи
Программа, полученная в результате этого проекта должна в точности моделировать поведение файловой системы FAT16. Результаты работы программы должны выводиться на экран в виде карты диска – последовательных цепочек из заполненных, свободных или поврежденных кластеров.
Так как пользователь сам должен задавать параметры файловой системы и создаваемых файлов, то в GUI должны присутствовать такие поля для ввода данных как задание размера раздела; задание размера кластера; задание размера файла, а также его имени и расширения. Пользователю так же должна быть предоставлена возможность удаления файлов или внесения поврежденных кластеров в созданный раздел.
В том случае, если пользователь неправильно ввел значения или задал слишком большой размер файла, программа должна вывести предупреждение об ошибке и предложить повторить процедуру ввода.
При выходе программа должна предупредить пользователя о закрытии.
Предполагаемая структура GUI изображена на рисунке 1.2.
Рисунок 1.2 – Интерфейс разрабатываемого ПО
2 ПРОЕКТИРОВАНИЕ
2.1 Выбор операционной системы
В качестве операционной системы для разработки программной системы была выбрана ОС Windows XP. Выбор операционной системы был определен ее функциональными возможностями, а также распространенностью данной ОС.
2.2 Выбор языка программирования
В качестве языка программирования был выбран язык «C#». Этот объектно-ориентированный, со статической типизацией. Он является основным языком разработки приложений для платформы Microsoft .NET.
2.3 Выбор программного обеспечения промежуточного уровня
.NET Framework является новейшей, разработанной компанией Microsoft, платформой для создания обычных программ и веб-приложений.. Данная платформа включает в себя языковую среду CLR. Основное назначение CLR — выполнение приложений, соблюдение всех программных зависимостей, управление памятью, обеспечение безопасности и изоляции приложений, интеграция с языками программирования и т.п.
Данная платформа получила широкое распространение и может быть использована на всех современных версиях операционных системах Windows (начиная с Windows 2000).
2.4 Выбор инструментальных средств
В качестве системы разработки была выбрана IDE Microsoft Visual Studio 2008. Данная система совместима с семейством операционных системам Windows и обладает рядом оптимизаций для программирования именно под эти ОС.
Данная среда разработки обладает рядом преимуществ: IntelliSense, система MSDN, встроенная подсветка ошибок.
IntelliSense – встроенная технология, позволяющая ускорить процесс набора текста программы путем автоматической генерации списка доступных для вставки в данном месте программы инструкций и ключевых слов.
Среда разработки интегрируется со справочной системой MSDN, которая содержит обширный набор информации о .NET Framework, языках программирования .NET и многом другом.
3 разработка
3.1 Выбор архитектуры системы
На данный момент существует несколько разновидностей системных архитектур. Одним из примеров является двухуровневая системная архитектура (рисунок 3.1). В основе ее уровней находятся: User Interface, Business Logic. Исходя из анализа поставленной задачи, был выбран именно этот тип системной архитектуры. Это можно объяснить тем, что разрабатываемая программа должна реализовывать определенный алгоритм – Business Logic, взаимодействовать непосредственно с пользователем – User Interface.
Рисунок 3.1 – Двухуровневая системная архитектура
3.2 Построение диаграмм прецедентов и последовательности
Проведя анализ поставленной задачи, мы выявили следующих активных актеров, работающих с разрабатываемой программой:
- пользователь;
- файловая система.
Функции, которые могут использовать файловая система и пользователь, а также отношения между ними можно визуализировать с помощью диаграммы прецедентов (рисунок 3.2).
Рисунок 3.2 – Диаграмма вариантов использования
Прецедент «Создание раздела» заключается в создании нового раздела FAT16 для работы с ним. При выполнении данного прецедента сразу попадаем в прецедент «Ввод данных с клавиатуры».
Прецедент «Создание файла» заключается в создании нового файла в заранее созданном разделе. При выполнении данного прецедента сразу попадаем в прецедент «Ввод данных с клавиатуры».
Прецедент «Удаление файла» заключается в удалении созданного файла по его порядковому номеру. При выполнении данного прецедента сразу попадаем в прецедент «Ввод данных с клавиатуры».
Прецедент «Добавление BAD кластеров» заключается в добавлении поврежденных кластеров в файловую систему. При выполнении данного прецедента попадаем в прецедент «Визуализация результата».
Прецедент «Ввод данных с клавиатуры» заключается в вводе соответствующих значений в зависимости от прецедента из которого был осуществлен переход. При выполнении данного прецедента выполняется переход в один из трех прецедентов:
1) «Расположение нового файла»;
2) «Удаление выбранного файла»;
3) «Создание раздела».
Прецедент «Расположение нового файла» заключается в размещении файловой системой нового файла в разделе. При выполнении данного прецедента сразу попадаем в прецедент «Визуализация результата».
Прецедент «Удаление выбранного файла» заключается в удалении файла из текущего раздела. При выполнении данного прецедента сразу попадаем в прецедент «Визуализация результата».
Прецедент «Создание раздела» заключается в создании нового раздела для работы с файлами. При выполнении данного прецедента сразу попадаем в прецедент «Визуализация результата».
Прецедент «Визуализация результата» отвечает за отображение всех изменений в файловой системе на карте диска и в списке файлов.
3.3 Разработка вариантов использования
Исходя из анализа построенной диаграммы прецедентов, а также функций, которые должна выполнять программа, были предусмотрены следующие варианты использования:
Номер | ВИ – 01 |
Название | Создание раздела. |
Участники | Пользователь |
Описание | При выполнении данного варианта использования пользователь вводит данные о размере раздела и размере кластера с помощью клавиатуры. |
Предварительные условия | Нет. |
Выходные условия | Параметры нового раздела переданы файловой системе. |
Порядок действий | 1. Пользователь в любом порядке вводит информацию о размере раздела и кластера. |
Альтернативный порядок действий | Нет. |
Приоритет | Высокий. |
Номер | ВИ – 02 |
Название | Создание файла. |
Участники | Пользователь. |
Описание | При выполнении данного варианта использования пользователь вводит данные о новом файле (размер, имя, расширение) с помощью клавиатуры. |
Предварительные условия | Заранее созданный раздел. |
Выходные условия | Параметры нового файла переданы файловой системе. |
Порядок действий | 1. Пользователь в любом порядке вводит информацию об имени файла, его размере и расширении. |
Альтернативный порядок действий | Нет. |
Приоритет | Высокий. |
Номер | ВИ – 03 |
Название | Удаление файла. |
Участники | Пользователь. |
Описание | При выполнении данного варианта использования пользователь задает номер удаляемого файла с помощью клавиатуры. |
Предварительные условия | Создан хотя бы один файл. |
Выходные условия | Номер удаляемого файла передан файловой системе. |
Порядок действий | 1. Пользователь вводит номер файла. |
Альтернативный порядок действий | Нет. |
Приоритет | Высокий. |
Номер | ВИ – 04 |
Название | Добавление BAD кластеров. |
Участники | Пользователь. |
Описание | При выполнении данного варианта использования в текущий раздел добавляются поврежденные кластеры, закрытые для записи. |
Предварительные условия | Создан раздел. |
Выходные условия | Файловой системой добавлены BAD кластеры. Визуализация на карте диска. |
Порядок действий | 1. Пользователь выбирает пункт меню «Добавить BAD кластеры». |
Альтернативный порядок действий | Нет. |
Приоритет | Средний. |
Номер | ВИ – 05 |
Название | Создание раздела. |
Участники | Файловая система. |
Описание | При выполнении данного варианта использования файловая система создает новый раздел. |
Предварительные условия | Выполнен ввод данных о параметрах раздела. |
Выходные условия | Создан раздел. Визуализация на карте диска. |
Порядок действий | 1. Пользователь подает запрос на создание раздела. |
Альтернативный порядок действий | Нет. |
Приоритет | Высокий. |
Номер | ВИ – 06 |
Название | Расположение нового файла. |
Участники | Файловая система |
Описание | При выполнении данного варианта использования файловая система располагает новый файл в текущем разделе. |
Предварительные условия | Выполнен ввод данных о параметрах файла. |
Выходные условия | Создан новый файл. Визуализация на карте диска и в списке файлов. |
Порядок действий | 1. Пользователь подает запрос на создание файла. |
Альтернативный порядок действий | Нет. |
Приоритет | Высокий. |
Номер | ВИ – 07 |
Название | Удаление выбранного файла. |
Участники | Файловая система |
Описание | При выполнении данного варианта использования файловая система удаляет выбранный файл из текущего раздела. |
Предварительные условия | Выполнен ввод номера файла. |
Выходные условия | Файл удален. Визуализация на карте диска и в списке файлов |
Порядок действий | 1. Пользователь подает запрос на удаление файла. |
Альтернативный порядок действий | Нет. |
Приоритет | Высокий. |
3.4 Разработка графического интерфейса
Исходя из анализа поставленной задачи, выяснилось, что графический интерфейс разрабатываемого программного продукта должен содержать: меню, область для визуализации, область для вывода списка файлов, а также информацию о текущей файловой системе (рисунок 1.2).
Ввод входных данных выполняется с помощью дополнительных диалоговых окон.
Главное меню должно включать такие пункты как «Операции с файловой системой», «Операции с файлами» и «Выход из программы». В пункте «Операции с файловой системой» должны присутствовать такие подпункты: «Создать», «Закрыть текущую», «Добавить BAD кластеры» и «Подсветить кластер». В пункте «Операции с файлами» должны присутствовать такие подпункты «Создать», «Удалить выбранный». В области для визуализации результатов работы файловой системы должна изображаться карта текущего раздела.
Уточненный графический интерфейс пользователя разрабатываемого программного продукта изображен на рисунке 3.4.
Рисунок 3.3 – Уточненный графический интерфейс пользователя
3.5 Разработка архитектуры приложения
Исходя из анализа поставленной задачи, а так же предметной области разрабатываемого проекта, были выделены такие основные сущности как FileSystem (файловая система), GUI (интерфейс пользователя). Т.к. информация о разделе, файлах и номере файла задается через диалоговые окна, то GUI можно разбить на 4 сущности: Delete (удаление файла), FileParameters (задание параметров файла), Parameters (задание параметров раздела), Mainform (визуализация и обработка команд). Следуя принципам ООП, эти сущности можно принять за шаблоны создаваемых классов.
Класс FileSystem отвечает за хранение всех параметров файловой системы и содержит следующие поля:
1) BinaryMap – массив описывающий состояние кластеров;
2) ClusterSize – размер кластера;
3) ClustOnFile – массив содержащий количество кластеров необходимое для каждого файла;
4) Cnt – счетчик;
5) Date – массив дат создания файлов;
6) DecimalMap – массив со ссылками на следующие кластеры. Фактически описывает расположение файлов на диске;
7) StartCluster – массив начальных кластеров файлов;
8) EndCluster – массив конечных кластеров файлов;
9) FileName – массив имен файлов;
10)FileSize – массив размеров файлов в байтах;
11)FreeSpace – оставшееся свободное место;
12)IsDeleted – массив описывающий удален файл или нет;
13)Map – карта диска. Представлена изображением в формате “.*bmp”;
14)NumberOfCluster – количество кластеров в разделе;
15)NumberOfFiles – количество файлов в разделе;
16)PartitionSize – размер раздела в байтах;
17)Pointer – указатель на следующий свободный кластер;
18)ToDelete – переменная для передачи данных о номере удаляемого файла.
Класс Mainform отвечает за визуализацию и обработку команд и содержит следующие методы:
1) FSCreate_Click – метод создающий новый раздел;
2) FSClose_Click – метод закрывающий текущий раздел;
3) Ld – метод инициализирующий основные массивы и переменные;
4) FileCreate_Click – метод создающий новый файл;
5) FileDelete_Click – метод удаляющий выбранный файл;
6) Highlighter_Click – подсветка кластера;
7) BADFill_Click – добавление поврежденных кластеров;
8) ExitButton_Click – выход из программы.
Класс Parameters имеет отношение ассоциации с классом Mainform, а так же содержит следующий метод:
1) OK_Click – метод для передачи параметров о разделе.
Класс FileParameters имеет отношение ассоциации с классом Mainform, а так же содержит следующий метод:
1) NewFile_Click – метод для передачи данных о новом файле.
Класс Delete имеет отношение ассоциации с классом Mainform, а так содержит следующий метод:
1) OK_Click – метод для передачи номера удаляемого файла.
Класс Cluster имеет отношение ассоциации с классом Mainform, а так содержит следующий метод:
1) OK_Click – метод для передачи номера удаляемого файла.
Диаграмма классов, с помощью которой можно визуализировать все описанные выше классы, методы и поля, изображена на рисунке 3.4.
Рисунок 3.4 – Диаграмма классов разрабатываемой программы
3.6 Разработка алгоритмов работы программы
Исходя из анализа поставленной задачи, а также разработанной диаграммы классов, была выделена группа методов, работа которых является особо важной: метод FileCreate_Click класса Mainform и метод FileDelete_Click класса Mainform. Для этих методов были разработаны обобщенные алгоритмы работы.
3.6.1 Метод FileCreate_Click класса Mainform
Метод FileCreate_Click класса Mainform, выполняет размещение нового файла в разделе. Указатель pointer, в начале алгоритма уже указывает на свободный кластер. Алгоритм работы описанного метода изображен на рисунке 3.5.
Рисунок 3.5 – Алгоритм размещения нового файла в разделе
3.6.2 Метод FileDelete_Click класса Mainform.
Метод FileDelete_Click класса Mainform, выполняет удаление созданного ранее файла по его порядковому номеру. Алгоритм работы данного метода представлен на рисунке 3.6.
Рисунок 3.6 – Алгоритм удаления выбранного файла
4 тестирование программы
4.1 Тестируемые функции
При разработке данного проекта были реализованы такие функции:
1а) функция задачи ограничения для данного сеанса работы;
Данная функция выполняется при выборе размера раздела и его создания.
2а) функция заполнения структур данных программы введенными данными;
Данная функция выполняется при вводе пользователем исходных данных с клавиатуры;
3а) функция создания раздела;
Данная функция выполняется при запросе пользователем создания раздела.
3б) функция создания файла;
Данная функция выполняется тогда, когда пользователь запрашивает создание файла.
3в) функция удаления файла;
Данная функция выполняется тогда, когда пользователь запрашивает удаление файла.
3г) функция добавления поврежденных кластеров;
Данная функция выполняется при запросе на добавление BAD кластеров, путем вызова пункта меню «Операции с ФС –> Добавить BAD кластеры..». Она добавляет поврежденные кластеры на карту диска.
4а) функция рисования карты диска;
Данная функция выполняется после каждого действия выполненного пользователем. Она выполняет визуализацию всех изменений происходящих с файловой системой.
4б) функция заполнения списка файлов;
Данная функция выполняется после создания или удаления файла.
4.2 Тестирование
С целью проверки корректности работы программного обеспечения, разработанного в данном проекте, было проведено его тестирование. Тесты и результаты их выполнения приведены в таблице 4.1.
Таблица 4.1 – Тестирование и его результаты
Тестируемая функция | Номер теста | Цель теста | Результат теста |
1а) Функция задачи ограничения для данного сеанса работы. | 1 | Проверка на ввод максимального размера раздела. | Пройден |
2 | Проверка на ввод максимального размера кластера. | Пройден | |
2а) Функция заполнения структур данных программы введенными данными | 3 | Заполнение структур данных программы, данными из GUI | Пройден |
4 | Проверка на ограничение максимального размера раздела | Не пройден | |
5 | Проверка ввода нулевого размера файла | Пройден | |
6 | Проверка ввода размера файла большего чем размер раздела | Пройден | |
7 | Проверка на ограничения размера кластера | Пройден | |
8 | Проверка ввода не существующего номера файла для удаления | Пройден | |
3а) Функция создания раздела | 9 | Проверка корректного создания раздела с заранее определенными параметрами | Пройден |
10 | Корректировка свободного места в соответствии с количеством кластеров | Пройден | |
3б) Функция создания файла | 11 | Проверка корректного создания файла с заранее определенными параметрами и его расположения в разделе | Пройден |
12 | Функция корректировки имени файла в соответствии со спецификацией FAT16 | Пройден | |
3в) Функция удаления файла | 13 | Проверка корректного удаления файла по его порядковому номеру | Пройден |
3г) Функция добавления BAD кластеров | 14 | Проверка корректного расположения BAD кластеров в созданном разделе. | Пройден |
4а) Функция рисования карты диска | 15 | Проверка корректности визуализации работы файловой системы | Пройден |
4а) Функция заполнения списка файлов | 16 | Проверка корректности визуализации работы файловой системы | Пройден |
4.3 Тестирование алгоритма
С целью проверки корректности работы алгоритма, разработанного в данном проекте, было проведено тестирование функций создания и удаления файла, а также функции создания раздела. Тесты и результаты их выполнения приведены в таблице 4.2.
Таблица 4.2 – Тестирование алгоритма и его результаты
Номер теста | Цель теста | Ожидаемый результат | Результат теста |
1 | Пользователь не ввел размер раздела | Программа должна вывести предупреждение об ошибке и предложить повторить ввод | Пройден |
2 | Пользователь не ввел размер кластера | Программа должна вывести предупреждение об ошибке и предложить повторить ввод | Пройден |
3 | Пользователь ввел размер раздела или кластера в некорректном формате | Программа должна вывести предупреждение об ошибке и предложить повторить ввод | Пройден |
4 | Пользователь не задал имя файла | Программа должна вывести предупреждение об ошибке и предложить повторить ввод | Пройден |
5 | Пользователь не задал расширения файла | Программа должна вывести предупреждение об ошибке и предложить повторить ввод | Пройден |
6 | Пользователь не задал размер файла | Программа должна вывести предупреждение об ошибке и предложить повторить ввод | Пройден |
7 | Пользователь задал размер файла в некорректном формате | Программа должна вывести предупреждение об ошибке и предложить повторить ввод | Пройден |
8 | Пользователь задал размер файла больше чем количество оставшегося места | Кнопка создания файла должна быть заблокирована. Пользователю должно быть выведено предупреждение об ошибке | Пройден |
9 | Пользователь задал нулевой размер файла | Программа должна вывести предупреждение об ошибке и предложить повторить ввод | Пройден |
10 | Пользователь задал размер файла равный количеству оставшегося места | Программа должна записать файл | Не пройден |
11 | Пользователь запросил удаление несуществующего файла | Программа должна вывести предупреждение об ошибке | Пройден |
12 | Пользователь запросил удаление файла, который был удален ранее | Программа должна вывести предупреждение об ошибке | Пройден |
5 руководство оператора
5.1 Назначение программы
Данная программа наглядно демонстрирует моделирование работы файловой системы FAT16.
Программа предоставляет возможность создания раздела и работы с файлами. Программа предназначена для наглядного обучения студентов, а так же других пользователей компьютера основам работы файловых систем. Программа предназначена эксплуатации на ПК, установленном в офисе или в домашних условиях.
Программа поставляется в виде исполнимых кодов (.exe-файлов), устанавливается на данный компьютер путем копирования в соответствующую директорию и не нуждается в обслуживании.
5.2 Технические средства для запуска программы
В состав технических средств должен входить персональный компьютер (ПЭВМ), включающий в себя:
а) процессор с тактовой частотой, ГГц – 1.5, не менее;
б) материнскую плату с FSB, МГц - 133, не менее;
в) оперативную память объемом, Мб -256, не менее;
г) свободного дискового пространства для хранения программы, Мб – 10, не менее;
д) дисплей и видеоадаптер такого типа, которые смогут отображать графическую информацию, являющуюся результатом выполнения программы;
е) клавиатуру;
к) мышь.
Для запуска программы на персональном компьютере необходимо наличие операционной системы Windows XP и Framework 3.0.
5.3 Работа с программой
Для инсталляции программы на персональный компьютер необходимо скопировать *.exe файл на жесткий диск. После чего программа готова к эксплуатации и может быть запущена путем двойного клика левой кнопки мыши на исполняемом файле (рисунок 5.1).
Рисунок 5.1 – Внешний вид программы после запуска
Операция создания раздела осуществляется путем выполнения следующих действий:
1) выбор пункта меню «Операции с файловой системой – > Создать..»;
2) в появившемся диалоговом окне задать параметры нового раздела;
3) нажать кнопку «ОК».
Выполнив все эти действия мы увидим результат создания раздела (рисунок 5.2).
Операция добавления нового файла осуществляется путем выполнения следующих действий:
1) необходимо выбрать пункт меню «Операции с файлами – > Создать..»;
2) в появившемся диалоговом окне задать параметры нового файла;
3) нажать кнопку «ОК».
Выполнив все эти действия, мы увидим результат создания файла (рисунок 5.3).
Операция удаления файла осуществляется путем выполнения следующих действий:
1) необходимо выбрать пункт меню «Операции с файлами – > Удалить..»;
2) в появившемся диалоговом окне задать номер удаляемого файла;
3) нажать кнопку «ОК».
Выполнив все эти действия, мы увидим результат удаления файла из текущего раздела (рисунок 5.4).
Операция добавления BAD кластеров осуществляется путем выполнения следующей операции:
1) необходимо выбрать пункт меню «Операции с файловой системой – > Добавить BAD кластеры..».
Рисунок 5.2 – Внешний вид программы
после создания раздела
Рисунок 5.3 – Внешний вид программы
после создания файла
Рисунок 5.4 – Внешний вид программы
после удаления файла
Выводы
Данный проект посвящен изучению и моделированию механизмов функционирования персонального компьютера. В частности моделирования работы файловой системы FAT16.
В проделанной работе было создано программное обеспечение, которое выполняет все функции описанные в техническом задании. Программа выполняет моделирование и наглядно визуализирует фрагментацию файлов, что и являлось основной целью разработки данного проекта.
Данное программное обеспечение написано для операционной системы Windows XP и работает на основе платформы .Net Framework. Программа была написана при помощи IDE Visual Studio 2008 на объектно-ориентированном языке C#.
Кроме этого были разработаны диаграмма классов, диаграмма прецедентов и диаграмма последовательности. Особо важным шагом проектирования был этап создания алгоритмов работы программы. Затем были составлены варианты использования и проведено тестирование. Итогом выполнения данного проекта было написание руководства оператора.
В дальнейшем данный программный продукт, можно усовершенствовать путем добавления функций копирования, перемещения файлов.
Еще одним путем модернизации программы является возможность добавления каталогов.
ПЕРЕЧЕНЬ ССЫЛОК
1. Столингс Вильям. Операционные системы. : Пер. с англ. – М. : Издательский дом «Вильямс», 2002. – 786 с.
2. Троелсен Эндрю. Язык программирования С# и платформа .NET 2.0, 3-е издание. : Пер. с англ. – М. : дом «Вильямс», 2007 – 1168 с.
Приложение А
1. Введение
1.1. Наименование программы
Наименование – «Программа моделирования работы файловой системы FAT16» (далее по тексту Программа).
1.2. Краткая характеристика области применения
Программа предназначена для наглядного обучения студентов принципам работы файловых систем. Программа относится к классу прикладных программ и не может использоваться в качестве реального компонента операционной системы. Ее задача – визуализация фрагментации файлов на диске.
2. Основание для разработки
2.1. Основание для проведения разработки
Основанием для разработки Программы является задание на курсовой проект кафедры "Компьютерные системы и сети" (503) Национального аэрокосмического университета им. Н.Е. Жуковского "ХАИ".
2.2. Наименование и условное обозначение разработки
Наименование темы разработки – «Разработка программы моделирования работы файловой системы FAT16».
Условное обозначение темы разработки (шифр темы) - "FSFAT-2010".
3. Назначение разработки
3.1. Функциональное назначение разработки
Данная программа позволяет пользователю иметь наглядное представление о работе файловой системы. Она должна распределять новые файлы на диске и удалять их. В итоге мы должны получить визуальный пример фрагментации файлов.
3.2. Эксплуатационное назначение
Программа работает в ручном режиме работы: ввели данные о новом файле – увидели как файловая система разместит его на диске.
Программа может функционировать в офисе и домашних условиях работы, т.е. в условиях работы настольно ПК.
Программа может работать в необслуживаемом режиме. Квалификация персонала – рядовой пользователь ПК.
Программа устанавливается путем копирования ее файлов на нужный ПК.
Отказ программы не влечет за собой критических последствий.
4. Требования к программе или программному изделию
4.1. Требования к функциональным характеристикам
4.1.1. Требования к составу выполняемых функций
Программа должна решать следующие задачи:
1) задача инициализации;
2) задача ввода исходных данных;
3) задача фрагментации файлов;
4) задача визуализации работы.
Для того чтобы решить задачу 1), должна быть реализована:
а) функция задачи ограничения для данного сеанса работы.
Для того чтобы решить задачу 2), должна быть реализована:
а) функция для принятия введенных данных с клавиатуры.
Чтобы решить задачу 3), должны быть реализованы четыре подзадачи:
а) функция создания раздела;
б) функция создания файла;
в) функция удаления файла;
г) функция добавления поврежденных кластеров.
Для того чтобы решить задачу 4), должны быть реализованы:
а) функция рисования карты диска;
б) функция заполнения списка файлов.
4.1.2. Требования к организации входных данных
Входные данные должны вводиться с клавиатуры при помощи GUI.
4.1.3. Требования к организации выходных данных
Выходными данными является графическое отображение карты диска, которая отражает фрагментацию созданных файлов.
4.1.4. Требования к временным характеристикам
Требования к временным характеристикам не предъявляются.
4.2. Требования к надежности
Данный программный продукт является прикладной программой, не работающей в системе реального времени или в области критических технологий, на выполнение запускается однократно и функционирует только в необходимый момент времени. Поэтому специальные требования к надежности программы не предъявляются.
4.3. Условия эксплуатации
4.3.1. Климатические условия эксплуатации
Климатические условия эксплуатации, при которых должны обеспечиваться заданные характеристики программы, должны удовлетворять требованиям, предъявляемым к техническим средствам в части условий их эксплуатации.
Программа предназначена для эксплуатации на ПК установленных в офисных помещениях и домашних условиях (SOHO).
4.3.2. Требования к видам обслуживания
После установки на компьютер программа не требует проведения каких-либо видов обслуживания.
4.3.3. Требования к численности и квалификации персонала
Для пользования программой хватает одной штатной единиц – конечный пользователь программы (оператор).
Программа устанавливается путем копирования на магнитный носитель. Для установки программы и ее эксплуатации необходим пользователь с обычными правами доступа, и обладающий навыками работы на компьютере.
Конечный пользователь программы (оператор) должен понимать, каким образом необходимо работать с GUI программы, т.е. должен иметь представление о назначении программы.
Персонал должен быть аттестован на II квалификационную группу по электробезопасности (для работы с конторским оборудованием).
4.4. Требования к составу и параметрам технических средств
Для исполнения программы необходим универсальный компьютер любого типа, для которого получен двоичный код, представленный в виде исполнимого файла (.exe-файла), способного выполняться установленным в ПК процессором.
В состав технических средств должен входить персональный компьютер (ПЭВМ), включающий в себя:
а) процессор с тактовой частотой, ГГц – 1.5, не менее;
б) материнскую плату с FSB, МГц - 133, не менее;
в) оперативную память объемом, Мб -256, не менее;
г) свободного дискового пространства для хранения программы, Мб – 30, не менее;
д) дисплей и видеоадаптер такого типа, которые смогут отображать графическую информацию, являющуюся результатом выполнения программы;
е) клавиатуру;
ж) НЖМД;
и) если предполагается работа со сменными дисками, необходимо наличие USB-адаптера;
к) мышь.
4.5. Требования к информационной и программной совместимости
4.5.1. Требования к информационным структурам и методам решения
Требования к информационным структурам (файлов) на входе и выходе, а также к методам решения не предъявляются.
4.5.2. Требования к исходным кодам и языкам программирования
Для разработки программы в качестве языка программирования должен использоваться язык C#.
Программа должна компилироваться компилятором среды Microsoft Visual Studio 2008.
Исходные тексты программ должны содержать достаточное количество комментариев, позволяющих выполнять их верификацию и валидацию, а также контролировать стиль программирования программиста.
Дополнительные настройки компиляторов не требуются.
4.5.3. Требования к программным средствам, используемым программой
Программа должна быть реализована в виде приложения выполняемого под управлением ОС Windows (например, MS Windows XP).
Также на ПК должна быть установлена программная платформа .NET Framework версии 3.0.
4.5.4. Требования к защите информации и программ
Требования к защите информации и программ не предъявляются.
4.6. Специальные требования
Программа должна быть реализована с использованием Windows Forms.
Программа должна осуществлять взаимодействие с пользователем при помощи GUI.
5. Требования к программной документации
5.1. Предварительный состав программной документации
В результате разработки программы должна быть представлена следующая программная документация:
а) техническое задание;
б) схемы алгоритмов;
в) тексты программ;
г) пояснительная записка;
д) руководство оператора;
Кроме программного обеспечения на диске обязательно должна находиться пояснительная записка в электронном виде, содержащая весь комплект документации, предусмотренный в пункте 5 настоящего технического задания.
ПриложениЕ Б
Текст файла Mainform.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace fat
{
public partial class Mainform : Form
{
Parameters ParametersForm = new Parameters();
Cluster ClusterForm = new Cluster();
FileParameters FParam = new FileParameters();
public Mainform()
{
InitializeComponent();
}
private void ExitButton_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Вы действительно хотите выйти?", "Выход из программы", MessageBoxButtons.YesNo,MessageBoxIcon.Question) == DialogResult.Yes)
{
Application.Exit();
}
}
private void FSCreate_Click(object sender, EventArgs e)
{
BADFill.Enabled = true;
FileOperations.Visible = true;
FSCreate.Enabled = false;
Highlighter.Enabled = true;
FSClose.Enabled = true;
// Принимаем параметры
ParametersForm.ShowDialog();
// Выводим статус
//Корректируем размер раздела
FileSystem.PartitionSize = FileSystem.PartitionSize - (FileSystem.PartitionSize % FileSystem.ClusterSize);
FileSystem.FreeSpace = FileSystem.PartitionSize;
PartitionLabel.Text += FileSystem.PartitionSize.ToString() + " байт";
ClusterLabel.Text += FileSystem.ClusterSize.ToString() + " байт";
FreeSpaceLabel.Text += FileSystem.FreeSpace.ToString() + " байт";
Status.Visible = true;
// Подсчитываем количество кластеров..
FileSystem.NumberOfClusters = (int)(FileSystem.PartitionSize / FileSystem.ClusterSize);
FileSystem.BinaryMap = new char[FileSystem.NumberOfClusters];
FileSystem.DecimalMap = new int[FileSystem.NumberOfClusters];
//... и рисуем их
FileSystem.Map = new Bitmap(1270, 5000);
Graphics Gr = Graphics.FromImage(FileSystem.Map);
int tmpX = 40;
int tmpY = 40;
int stop = 1240;
Pen tmpPen = new Pen(Color.Black, 1);
int j = 0;
Font fnt = new Font(FontFamily.GenericSansSerif, 10);
for (int i = 42; i < 1240; i += 20) //Рисуем текст по Х
{
j++;
Gr.DrawString(j.ToString(), fnt, Brushes.Black, i, 15);
}
//Рисуем текст по Y
j = 0;
for (int i = 42; i < 5000; i += 20)
{
Gr.DrawString(j.ToString(), fnt, Brushes.Black, 5, i);
j++;
}
for (int i = 0; i < FileSystem.NumberOfClusters; i++)
{
FileSystem.BinaryMap[i] = '0';
Rectangle tmpRec = new Rectangle(tmpX, tmpY, 20, 20);
Gr.DrawRectangle(tmpPen, tmpRec);
tmpX += 20;
if (tmpX == (int)(stop)) // Проверяем не достигнута ли правая граница карты
{
tmpX = 40;
tmpY += 20;
}
}
FileMap.Image = FileSystem.Map;
FileMap.Invalidate();
Gr.Dispose();
}
private void FSClose_Click(object sender, EventArgs e)
{
BADFill.Enabled = false;
FileOperations.Visible = false;
FSCreate.Enabled = true;
Highlighter.Enabled = false;
FSClose.Enabled = false;
FileSystem.ClusterSize = 0;
FileSystem.PartitionSize = 0;
Status.Visible = false;
PartitionLabel.Text = "Размер раздела: ";
ClusterLabel.Text = "Размер кластера: ";
FreeSpaceLabel.Text = "Свободного места: ";
Graphics Gr = Graphics.FromImage(FileSystem.Map);
Gr.FillRectangle(Brushes.White, 0, 0, 1280, 5000);
Gr.Dispose();
FileMap.Invalidate();
FileSystem.FileName = new string[100];
FileSystem.Date = new string[100];
FileSystem.FileSize = new int[100];
FileSystem.StartCluster = new int[100];
FileSystem.EndCluster = new int[100];
FileSystem.ClustOnFile = new int[100];
FileSystem.pointer = 1;
}
private void Highlighter_Click(object sender, EventArgs e)
{
ClusterForm.ShowDialog();
FileMap.Invalidate();
}
private void Ld(object sender, EventArgs e)
{
BADFill.Enabled = false;
Highlighter.Enabled = false;
FSClose.Enabled = false;
FileSystem.FileName = new string[100];
FileSystem.Date = new string[100];
FileSystem.FileSize = new int[100];
FileSystem.StartCluster = new int[100];
FileSystem.EndCluster = new int[100];
FileSystem.ClustOnFile = new int[100];
FileSystem.pointer = 1;
FileSystem.Cnt=0;
FileSystem.IsDeleted = new byte[100];
}
private void FileCreate_Click(object sender, EventArgs e)
{
BADFill.Enabled = false;
FileSystem.NumberOfFiles++;
FileSystem.Cnt++;
// принимаем параметры
FParam.ShowDialog();
// Переписываем свободное место
FreeSpaceLabel.Text = "Свободного места: "+FileSystem.FreeSpace.ToString() + " байт";
// добавляем новый файл в список
FileView.Items.Add(FileSystem.FileName[FileSystem.Cnt].ToString()); // имя файла
ListViewItem.ListViewSubItemCollection column = new ListViewItem.ListViewSubItemCollection(FileView.Items[FileSystem.Cnt-1]);
column.Add(FileSystem.Date[FileSystem.Cnt].ToString()); // дата
column.Add(FileSystem.FileSize[FileSystem.Cnt].ToString() + " байт"); // размер
// вычисляем количество кластеров необходимое для записи файла
FileSystem.ClustOnFile[FileSystem.Cnt] = FileSystem.FileSize[FileSystem.Cnt] / FileSystem.ClusterSize ;
FileSystem.IsDeleted[FileSystem.Cnt] = 0;
// Запускаем цикл for на количество кластеров
for (int i = 0; i < FileSystem.ClustOnFile[FileSystem.Cnt]; i++)
{
//пытаемся установить i-ый кластер в ячейку, если она пуста - устанавливаем, если нет - ищем следующую возможную для установки
bool flag = false; //флаг полной записи одного кластера
do
{
if (FileSystem.BinaryMap[FileSystem.pointer] == '0') //если кластер свободен
{
//закрываем его от записи
FileSystem.BinaryMap[FileSystem.pointer] = '1';
//Если это первый кластер , записываем его в таблицу
if (i == 0)
{
FileSystem.StartCluster[FileSystem.Cnt] = FileSystem.pointer;
column.Add(FileSystem.StartCluster[FileSystem.Cnt].ToString()); // стартовый кластер
}
// ищем следующий свободный
bool next = false;
int j = 1;
do
{
FileSystem.pointer++;
if (FileSystem.BinaryMap[FileSystem.pointer] == '0') //если найден следующий свободный
{
//добавляем его в "карту следования"
FileSystem.DecimalMap[FileSystem.pointer - j] = FileSystem.pointer;
//и закрываем от записи
//FileSystem.BinaryMap[FileSystem.pointer] = '1';
//отображаем ссылку на него в предыдущем кластере
//и закрашиваем его
Graphics Gr = Graphics.FromImage(FileSystem.Map);
int tmpypos = (int)((FileSystem.pointer - j) / 60);
int tmpxpos = (int)((FileSystem.pointer - j) % 60) -1;
if ((FileSystem.pointer - j) % 60 == 0)
{
tmpxpos = 59;
tmpypos -= 1;
}
Gr.FillRectangle(Brushes.Aqua, 40 + 20 * tmpxpos, 40 + 20 * tmpypos, 20, 20);//заливка
Font fnt = new Font(FontFamily.GenericSansSerif, 6); //текст
Gr.DrawString(FileSystem.pointer.ToString(), fnt, Brushes.Black, 41 + 20 * tmpxpos, 41 + 20 * tmpypos);
Gr.Dispose();
next = true; //следующий свободный найден
//pointer остался равным следующему свободному
}
else //если следующий занят
{
j++;
}
}
while (next == false);
flag = true; //Переходим к следующему кластеру!
}
else //Если кластер занят
{
FileSystem.pointer++;
}
}
while (flag == false);
}
//Здесь записываем конечный кластер!
FileSystem.EndCluster[FileSystem.Cnt] = FileSystem.pointer;
column.Add(FileSystem.EndCluster[FileSystem.Cnt].ToString()); // конечный кластер
column.Add(FileSystem.Cnt.ToString());//номер
//Рисуем конец файла и переводим pointer на свободную позицию
FileSystem.BinaryMap[FileSystem.pointer] = '1';
Graphics Gr2 = Graphics.FromImage(FileSystem.Map);
int tmpypos2 = (int)((FileSystem.pointer ) / 60);
int tmpxpos2 = (int)((FileSystem.pointer ) % 60) - 1;
if ((FileSystem.pointer) % 60 == 0)
{
tmpxpos2 = 59;
tmpypos2 -= 1;
}
Gr2.FillRectangle(Brushes.Aqua, 40 + 20 * tmpxpos2, 40 + 20 * tmpypos2, 20, 20);//заливка
Font fnt2 = new Font(FontFamily.GenericSansSerif, 6); //текст
Gr2.DrawString("0xfff", fnt2, Brushes.Black, 41 + 20 * tmpxpos2, 41 + 20 * tmpypos2);
Gr2.Dispose();
FileSystem.pointer++;
this.Refresh();
}
private void BADFill_Click(object sender, EventArgs e)
{
Random rnd = new Random();
for (int i = 0; i < FileSystem.NumberOfClusters / 20; i++)
{
int rndtmp = rnd.Next(1, FileSystem.NumberOfClusters - 1);
Graphics Gr2 = Graphics.FromImage(FileSystem.Map);
int tmpypos2 = (int)(rndtmp / 60);
int tmpxpos2 = (int)(rndtmp % 60) - 1;
if (rndtmp % 60 == 0)
{
tmpxpos2 = 59;
tmpypos2 -= 1;
}
Gr2.FillRectangle(Brushes.Red, 40 + 20 * tmpxpos2, 40 + 20 * tmpypos2, 20, 20);//заливка
FileSystem.BinaryMap[rndtmp] = '2';
}
this.Refresh();
FileSystem.FreeSpace -= FileSystem.NumberOfClusters / 10 * FileSystem.ClusterSize;
FreeSpaceLabel.Text = "Свободного места: " + (FileSystem.FreeSpace - FileSystem.NumberOfClusters / 10 * FileSystem.ClusterSize).ToString() + " байт + " + (FileSystem.NumberOfClusters / 10 * FileSystem.ClusterSize).ToString() + " байт в BAD-кластерах.";
}
private void FileDelete_Click(object sender, EventArgs e)
{
Del.ShowDialog();
if (FileSystem.IsDeleted[FileSystem.ToDelete] == 0)
{
FileSystem.pointer = FileSystem.StartCluster[FileSystem.ToDelete];
FileSystem.IsDeleted[FileSystem.ToDelete] = 1;
int firsttodel = FileSystem.StartCluster[FileSystem.ToDelete];
FileSystem.BinaryMap[firsttodel] = '0';
Graphics Gr2 = Graphics.FromImage(FileSystem.Map);
Pen tmpPen = new Pen(Brushes.Black, 1);
int tmpypos2 = (int)((firsttodel) / 60);
int tmpxpos2 = (int)((firsttodel) % 60) - 1;
if ((firsttodel) % 60 == 0)
{
tmpxpos2 = 59;
tmpypos2 -= 1;
}
Gr2.FillRectangle(Brushes.White, 40 + 20 * tmpxpos2, 40 + 20 * tmpypos2, 20, 20);
Gr2.DrawRectangle(tmpPen, 40 + 20 * tmpxpos2, 40 + 20 * tmpypos2, 20, 20);
int j = FileSystem.StartCluster[FileSystem.ToDelete];
for (int i = 0; i < FileSystem.ClustOnFile[FileSystem.ToDelete] + 1; i++)
{
FileSystem.BinaryMap[j] = '0';
int tmpypos = (int)((FileSystem.DecimalMap[j]) / 60);
int tmpxpos = (int)((FileSystem.DecimalMap[j]) % 60) - 1;
if ((FileSystem.DecimalMap[j]) % 60 == 0)
{
tmpxpos = 59;
tmpypos -= 1;
}
Gr2.FillRectangle(Brushes.White, 40 + 20 * tmpxpos, 40 + 20 * tmpypos, 20, 20);
Gr2.DrawRectangle(tmpPen, 40 + 20 * tmpxpos, 40 + 20 * tmpypos, 20, 20);
j = FileSystem.DecimalMap[j];
}
Gr2.Dispose();
this.Refresh();
FileSystem.FreeSpace = FileSystem.FreeSpace + FileSystem.FileSize[FileSystem.ToDelete];
FreeSpaceLabel.Text = "Свободного места: " + FileSystem.FreeSpace.ToString() + " байт";
FileView.Items[FileSystem.ToDelete - 1].BackColor = Color.Red;
}
else MessageBox.Show("Файл уже был удален!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
Текст файла Parameters.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace fat
{
public partial class Parameters : Form
{
public Parameters()
{
InitializeComponent();
}
private void OK_Click(object sender, EventArgs e)
{
try
{
FileSystem.PartitionSize = double.Parse(PartitionTxt.Text.ToString());
FileSystem.ClusterSize = int.Parse(ClusterTxt.Text.ToString());
PartitionTxt.Text =
"";
ClusterTxt.Text = "";
this.Close();
}
catch
{
MessageBox.Show("Вы ввели неверно одно из значений (размер файла задаётся цифрами, без пробелов, символов подчеркивания, точек и запятых). Попробуйте еще раз.", "Ошибка!", MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
}
}
Текст файла FileParameters.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace fat
{
public partial class FileParameters : Form
{
public FileParameters()
{
InitializeComponent();
}
private void NewFile_Click(object sender, EventArgs e)
{
if ((FileNameTxt.Text == "") || (FileSizeTxt.Text == "") || (Eof.Text == ""))
{
MessageBox.Show("Одно из полей не заполнено. Попробуйте еще раз.", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
try
{
//Пытаемся почитать размер файла
FileSystem.FileSize[FileSystem.Cnt] = int.Parse(FileSizeTxt.Text.ToString());
//читаем имя файла и преобразуем под условия FAT16
if (FileNameTxt.Text.Length > 6)
{
FileSystem.FileName[FileSystem.Cnt] = FileNameTxt.Text.Remove(6) + "~" + FileSystem.Cnt.ToString() + "." + Eof.Text;
}
else
{
FileSystem.FileName[FileSystem.Cnt] = FileNameTxt.Text + "." + Eof.Text;
}
//Записываем дату создания
FileSystem.Date[FileSystem.Cnt] = DateTime.Now.ToString();
//Считаем необходимое количество кластеров
FileSystem.ClustOnFile[FileSystem.Cnt] = FileSystem.FileSize[FileSystem.Cnt] / FileSystem.ClusterSize + 1;
//Чистим поля от значений
FileSystem.FreeSpace -= FileSystem.FileSize[FileSystem.Cnt];
FileNameTxt.Text = "";
FileSizeTxt.Text = "";
Eof.Text = "";
label5.Text = "Свободно: ";
label6.Text = "После создания: ";
this.Close();
}
catch
{
MessageBox.Show("Размер файла задан неверно. Попробуйте еще раз.", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void Ld(object sender, EventArgs e)
{
label5.Text += FileSystem.FreeSpace.ToString() + " байт";
}
private void KPress(object sender, KeyPressEventArgs e)
{
double tmp;
if (Char.IsDigit(e.KeyChar)||e.KeyChar==(char)Keys.Back)
{
if (FileSizeTxt.Text != "")
{
if (e.KeyChar == (char)Keys.Back)
{
tmp = double.Parse((FileSizeTxt.Text).ToString());
}
else
{
tmp = double.Parse((FileSizeTxt.Text + e.KeyChar).ToString());
}
if (tmp > FileSystem.FreeSpace)
{
label6.Text = "Недостаточно свободного места!";
label6.ForeColor = Color.Red;
NewFile.Enabled = false;
}
else
{
label6.ForeColor = Color.Black;
NewFile.Enabled = true;
label6.Text = "После создания: " + (FileSystem.FreeSpace - tmp).ToString() + " байт";
}
}
}
else e.KeyChar = (char)Keys.None;
}
}
}
Текст файла DeleteForm.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace fat
{
public partial class DeleteForm : Form
{
public DeleteForm()
{
InitializeComponent();
}
private void OKBut_Click(object sender, EventArgs e)
{
try
{
FileSystem.ToDelete = byte.Parse(NToDelTXT.Text);
NToDelTXT.Text = "";
this.Close();
}
catch
{
MessageBox.Show("Вы ввели неверное значение(номер файла задается одним числом, без пробелов, символов подчеркивания, точек и запятых). Попробуйте еще раз.", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void Ld(object sender, EventArgs e)
{
if (FileSystem.NumberOfFiles != 0)
{
label1.ForeColor = Color.Black;
label1.Text = "Введите номер файла(1-" + FileSystem.NumberOfFiles + "):";
OKBut.Enabled = true;
}
else
{
label1.ForeColor = Color.Red;
label1.Text = "Файлов нет!";
OKBut.Enabled = false;
}
}
}
}
Текст файла Cluster.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace fat
{
public partial class Cluster : Form
{
int tmpVal;
public Cluster()
{
InitializeComponent();
}
private void OK_Click(object sender, EventArgs e)
{
try
{
tmpVal = int.Parse(textBox1.Text.ToString());
Graphics Gr = Graphics.FromImage(FileSystem.Map);
int tmpypos = (int)(tmpVal / 60);
int tmpxpos = (int)(tmpVal % 60) - 1;
if (tmpVal % 60 == 0) tmpxpos = 0;
Pen tmp = new Pen(Brushes.Blue,2);
Gr.DrawRectangle(tmp, 40 + 20 * tmpxpos, 40 + 20 * tmpypos, 20, 20);
label1.Text = "Номер кластера";
Gr.Dispose();
this.Close();
}
catch
{
MessageBox.Show("Вы ввели неверное значение(номер кластера задается одним числом, без пробелов, символов подчеркивания, точек и запятых). Попробуйте еще раз.", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ld(object sender, EventArgs e)
{
label1.Text += "(1 - " + FileSystem.NumberOfClusters.ToString() + "): ";
}
}
}
Текст файла FileSystem.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
namespace fat
{
public static class FileSystem
{
public static double PartitionSize;
public static int ClusterSize;
public static int NumberOfClusters;
public static double FreeSpace;
public static Bitmap Map;
public static int[] DecimalMap;
public static char[] BinaryMap;
public static string[] FileName;
public static string[] Date;
public static int[] FileSize;
public static int[] StartCluster;
public static int[] EndCluster;
public static int[] ClustOnFile;
public static byte NumberOfFiles = 0;
public static byte Cnt = 0;
public static int pointer;
public static byte ToDelete;
public static byte[] IsDeleted;
}
}
ClusterTxt.Text = "";
this.Close();
}
catch
{
MessageBox.Show("Вы ввели неверно одно из значений (размер файла задаётся цифрами, без пробелов, символов подчеркивания, точек и запятых). Попробуйте еще раз.", "Ошибка!", MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
}
}
Текст файла FileParameters.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace fat
{
public partial class FileParameters : Form
{
public FileParameters()
{
InitializeComponent();
}
private void NewFile_Click(object sender, EventArgs e)
{
if ((FileNameTxt.Text == "") || (FileSizeTxt.Text == "") || (Eof.Text == ""))
{
MessageBox.Show("Одно из полей не заполнено. Попробуйте еще раз.", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
try
{
//Пытаемся почитать размер файла
FileSystem.FileSize[FileSystem.Cnt] = int.Parse(FileSizeTxt.Text.ToString());
//читаем имя файла и преобразуем под условия FAT16
if (FileNameTxt.Text.Length > 6)
{
FileSystem.FileName[FileSystem.Cnt] = FileNameTxt.Text.Remove(6) + "~" + FileSystem.Cnt.ToString() + "." + Eof.Text;
}
else
{
FileSystem.FileName[FileSystem.Cnt] = FileNameTxt.Text + "." + Eof.Text;
}
//Записываем дату создания
FileSystem.Date[FileSystem.Cnt] = DateTime.Now.ToString();
//Считаем необходимое количество кластеров
FileSystem.ClustOnFile[FileSystem.Cnt] = FileSystem.FileSize[FileSystem.Cnt] / FileSystem.ClusterSize + 1;
//Чистим поля от значений
FileSystem.FreeSpace -= FileSystem.FileSize[FileSystem.Cnt];
FileNameTxt.Text = "";
FileSizeTxt.Text = "";
Eof.Text = "";
label5.Text = "Свободно: ";
label6.Text = "После создания: ";
this.Close();
}
catch
{
MessageBox.Show("Размер файла задан неверно. Попробуйте еще раз.", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void Ld(object sender, EventArgs e)
{
label5.Text += FileSystem.FreeSpace.ToString() + " байт";
}
private void KPress(object sender, KeyPressEventArgs e)
{
double tmp;
if (Char.IsDigit(e.KeyChar)||e.KeyChar==(char)Keys.Back)
{
if (FileSizeTxt.Text != "")
{
if (e.KeyChar == (char)Keys.Back)
{
tmp = double.Parse((FileSizeTxt.Text).ToString());
}
else
{
tmp = double.Parse((FileSizeTxt.Text + e.KeyChar).ToString());
}
if (tmp > FileSystem.FreeSpace)
{
label6.Text = "Недостаточно свободного места!";
label6.ForeColor = Color.Red;
NewFile.Enabled = false;
}
else
{
label6.ForeColor = Color.Black;
NewFile.Enabled = true;
label6.Text = "После создания: " + (FileSystem.FreeSpace - tmp).ToString() + " байт";
}
}
}
else e.KeyChar = (char)Keys.None;
}
}
}
Текст файла DeleteForm.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace fat
{
public partial class DeleteForm : Form
{
public DeleteForm()
{
InitializeComponent();
}
private void OKBut_Click(object sender, EventArgs e)
{
try
{
FileSystem.ToDelete = byte.Parse(NToDelTXT.Text);
NToDelTXT.Text = "";
this.Close();
}
catch
{
MessageBox.Show("Вы ввели неверное значение(номер файла задается одним числом, без пробелов, символов подчеркивания, точек и запятых). Попробуйте еще раз.", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void Ld(object sender, EventArgs e)
{
if (FileSystem.NumberOfFiles != 0)
{
label1.ForeColor = Color.Black;
label1.Text = "Введите номер файла(1-" + FileSystem.NumberOfFiles + "):";
OKBut.Enabled = true;
}
else
{
label1.ForeColor = Color.Red;
label1.Text = "Файлов нет!";
OKBut.Enabled = false;
}
}
}
}
Текст файла Cluster.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace fat
{
public partial class Cluster : Form
{
int tmpVal;
public Cluster()
{
InitializeComponent();
}
private void OK_Click(object sender, EventArgs e)
{
try
{
tmpVal = int.Parse(textBox1.Text.ToString());
Graphics Gr = Graphics.FromImage(FileSystem.Map);
int tmpypos = (int)(tmpVal / 60);
int tmpxpos = (int)(tmpVal % 60) - 1;
if (tmpVal % 60 == 0) tmpxpos = 0;
Pen tmp = new Pen(Brushes.Blue,2);
Gr.DrawRectangle(tmp, 40 + 20 * tmpxpos, 40 + 20 * tmpypos, 20, 20);
label1.Text = "Номер кластера";
Gr.Dispose();
this.Close();
}
catch
{
MessageBox.Show("Вы ввели неверное значение(номер кластера задается одним числом, без пробелов, символов подчеркивания, точек и запятых). Попробуйте еще раз.", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ld(object sender, EventArgs e)
{
label1.Text += "(1 - " + FileSystem.NumberOfClusters.ToString() + "): ";
}
}
}
Текст файла FileSystem.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
namespace fat
{
public static class FileSystem
{
public static double PartitionSize;
public static int ClusterSize;
public static int NumberOfClusters;
public static double FreeSpace;
public static Bitmap Map;
public static int[] DecimalMap;
public static char[] BinaryMap;
public static string[] FileName;
public static string[] Date;
public static int[] FileSize;
public static int[] StartCluster;
public static int[] EndCluster;
public static int[] ClustOnFile;
public static byte NumberOfFiles = 0;
public static byte Cnt = 0;
public static int pointer;
public static byte ToDelete;
public static byte[] IsDeleted;
}
}