00Н
|
01Н
|
0FFH
|
01Н
|
06Н
|
Зарезервировано
|
06Н
|
07Н
|
Байт атрибута
|
07Н
|
08Н
|
Идентификатор дисковода
|
08Н
|
10Н
|
Имя файла (8 символов)
|
10Н
|
13Н
|
Расширение (3 символа)
|
13Н
|
15Н
|
Номер текущего блока
|
15Н
|
17Н
|
Размер записи
|
17Н
|
1ВН
|
Размер файла
|
1BН
|
1DН
|
Дата создания (обновления)
|
1DН
|
1FН
|
Время создания (обновления)
|
1FН
|
27H
|
Зарезервировано
|
27H
|
28H
|
Номер текущей записи
|
28H
|
2CH
|
Номер относительной записи
|
Расширенный блок управления файлом
|
|
Резюме.
О реализации задания
Модель файловой системы представляет собой
рабочий лист Microsoft Excel, на котором в виде ячеек представлены три
логические структуры файловой системы:
· Каталог файлов
· Таблица распределения
· Область файлов
На рабочем листе также расположены две
панели управления:
1)
Операции
с файлами
·
добавить
·
удалить
·
перезаписать
2)
Визуализация
FAT
·
показать
файл
·
убрать
стрелки
Исходя из контекста вопроса параллельное
выполнение процессов или потоков (MultiThreading) реализовывать нет
необходимости. Учитывая эти факторы, а также необходимость разработки
“дружественного” интерейса с применением графических примитивов, было решено
использовать язык программирования VisualBasic (VBA) от фирмы Microsoft и
электронную таблицу Excel 5.0 фирмы Microsoft.
Так как модель является типичной управляемой
событиями системой, то алгоритм ее работы достаточно прост, а точнее
представляет собой ряд алгоритмов, которые пересекаются только в среднем уровне
абстракции. (см. ниже) События вызываются пользователем посредством воздействия
на органы управления.
О примененных уровнях абстракции
Все возможные события были тщательно
проанализированы автором и разделены на три категории, или на три уровня
абстракции:
· События, вызываемые
внешними воздействиями. Таковыми являются все события, вызываемые пользователем
посредством вызова пунктов из групп операций с файлами.[2]
· События фундаментальной
природы, т.е. базовые события, порождаемые предудущими. Их значительно меньше,
и они никак не вникают в суть породивших из внешних событий.[3]
· События низкого уровня
абстракции, которые являются искуственно синтезированными из предыдущих двух
групп событиями и имеют целью понизить сложность системы за счет
абстрагирования от непринципиальных тонкостей и усложнений в системе, диктуемых
контекстом. Таковыми, например, являются события обработки неправильных
ситуаций.[4]
Об интерфейсе
Интерфейс является интуитивно понятным и
не навязчивым, всегда, насколько это возможно, является “демократичным” по
отношению к пользователю. В программах, написанных таким стилем, очень четко
прослеживается причинно-следственная связь, хорошо знакомая любому человеку и
являющаяся неотъемлемой частью образного мышления. Это делат программу весьма
простой в использовании, а алгоритм работы простым в понимании. Вся необходимая
для работы информация представлена в диалогах, о неправильных ситуциях
программа сообщает пользователю и это единственный (и законный) случай
нарушения свободы действий пользователя.
Далее приводится исходный текст программы
с обширными комментариями, в которых делается упор не на особенности языка
программирования и конкретной реализации, а на представление составляющих
файловой системы как объектов, а процедур и функций как методов, применяемых к
этим объектам.
Макросы, вызываемые событиями
Public
Type FileID 'Тип, описывающий файл: имя,размер и точка входа в FAT
Name As String
Size As Integer
First As Integer
End Type
Sub PressAddFile() 'Макрос, вызываемый кнопкой
"Добавить Файл"
DialogSheets("Add").EditBoxes("Name").Text = ""
'подготовка диалога "Добавление файла"
DialogSheets("Add").EditBoxes("Size").Text = ""
'очистка полей ввода
Sheets("Add").Show 'Вызов диалога
"Добавление файла"
With DialogSheets("Add") 'Проверка на
правильность введенных данных
If (.EditBoxes("Name").Text =
"") Or (.EditBoxes("Size").Text = "") Or
(.EditBoxes("Size").Text = "0") Then Exit Sub
End With
Dim NewFile As FileID 'Экземпляр переменной с
описанием создаваемого файла
With DialogSheets("Add")
NewFile.Name = .EditBoxes("Name").Text
NewFile.Size = .EditBoxes("Size").Text
End With
Call AddFile(NewFile) 'Вызов процедуры добавления
файла
Refresh 'обновили графическое изображение размещения
файлов
End Sub
Sub PressDeleteFile() 'в основном рабочем листе нажата
кнопка Удалить Файл
temp = 4
With DialogSheets("Delete") 'подготавливаем
к работе диалог Delete
.ListBoxes("Name").RemoveAllItems
While Sheets("Sheet").Cells(temp; 2)
<> "" 'заполняем список имеющимися в каталоге файлами
.ListBoxes("Name").AddItem
Text:=Worksheets("Sheet").Cells(temp; 2).Value; Index:=temp - 3
temp = temp + 1
Wend
.Show 'показываем диалог Delete
If .ListBoxes("Name") = 0 Then Exit Sub
Dim File As FileID 'переменная для идентификатора
удаляемого файла.Передается процедуре DeleteFile
File.Name =
Sheets("Sheet").Cells(.ListBoxes("Name") + 3; 2)
File.Size =
Sheets("Sheet").Cells(.ListBoxes("Name") + 3; 3)
File.First =
Sheets("Sheet").Cells(.ListBoxes("Name") + 3; 4)
Call DeleteFile(File) 'Вызываем процедуру удаления
файла
Refresh 'обновили графическое изображение
размещения файлов
End With
End Sub
Sub PressRemakeFile() 'нажата кнопка
Изменить_размеры_файла
'по этому поводу подготавливаем к работе диалог Remake
temp = 4
With DialogSheets("Remake")
.ListBoxes("Name").RemoveAllItems
While Sheets("Sheet").Cells(temp; 2)
<> "" 'заполняем список имеющимися в каталоге файлами
.ListBoxes("Name").AddItem
Text:=Worksheets("Sheet").Cells(temp; 2).Value; Index:=temp - 3
temp = temp + 1
Wend
.Show 'показываем диалог Remake
'при нажатии кнопки OK в диалоге запустится макрос
DialogRemakePressOK
End With
End Sub
Sub DialogRemakePressName() 'в диалоге Перезапись выбран
файл из списка
With DialogSheets("Remake") 'и поэтому в
диалоге Перезапись обновляем поле размера файла в соотв. с выбранным файлом
.EditBoxes("Size").Text =
Sheets("Sheet").Cells(3 + .ListBoxes("Name").ListIndex;
3).Value
End With
End Sub
Sub DialogRemakePressOK() 'в диалоге изменение размеров
файла нажата кнопка OK
With DialogSheets("Remake")
.Hide 'убрали с экрана диалог
If .ListBoxes("Name").ListIndex = 0 Then
Exit Sub
Dim File As FileID 'Экземпляр типа FileID -
идентификатор файла
File.Name = Sheets("Sheet").Cells(3 +
.ListBoxes("Name").ListIndex; 2).Text
File.Size = Sheets("Sheet").Cells(3 +
.ListBoxes("Name").ListIndex; 3).Value
File.First = Sheets("Sheet").Cells(3 +
.ListBoxes("Name").ListIndex; 4).Value
'проверка на наличие изменений
If .EditBoxes("Size").Text = File.Size
Or .EditBoxes("Size").Text = "0" Then Exit Sub
'проверка на помещаемость
If .EditBoxes("Size").Text >
(FreeSize + ((File.Size - 1) \ 8 + 1) * 8) Then
temp = MsgBox("Файл " &
File.Name & " размером " & .EditBoxes("Size").Text
& " не может быть размещен"; vbExclamation; "Перезапись
файла")
Exit Sub
End If 'перезапись: удаление, а затем запись
файла, но с другим размером
Call DeleteFile(File) 'удалили
File.Size = .EditBoxes("Size").Text
'изменили размер
Call AddFile(File) 'записали
Refresh 'обновили таблицу распределения файлов
End With
End Sub
Sub Visualisation() 'визуализация файла
temp = 4
With DialogSheets("Visualisation")
'подготавливаем к работе диалог Visualisation
.ListBoxes("Name").RemoveAllItems
While Sheets("Sheet").Cells(temp; 2)
<> "" 'заполняем список имеющимися в каталоге файлами
.ListBoxes("Name").AddItem
Text:=Worksheets("Sheet").Cells(temp; 2).Value; Index:=temp - 3
temp = temp + 1
Wend
.Show 'показываем диалог Visualisation
If .ListBoxes("Name") = 0 Then Exit Sub
'выбрали ли что-нибудь ?
Dim NumberFile As Integer
NumberFile =
.ListBoxes("Name").ListIndex 'номер по каталогу визуализируемого
файла
Sheets("Sheet").Cells(NumberFile + 3;
2).ShowDependents 'показываем линии, проходящие от ячейки каталога с именем
визуализируемого файла до всех занятых им ячеек области файлов
End With
End Sub
Базовые события
Const
ColorOfPaper = 33 'цвет фона области файлов
Const
ColorUsedPartOfFAT = 2 'цвет занятой части области файлов
Sub
AddFile(NewFile As FileID) 'Процедурa добавления файла
'Проверка наличия присутствия в достаточном для создания файла количестве
свободного пространства
If NewFile.Size > FreeSize Then
temp = MsgBox("Файл " + NewFile.Name + " не может быть размещен
из-за нехватки свободного места."; vbExclamation; "Процесс создания
файла")
Exit Sub
End If
count = NewFile.Size 'счетчик уже записанной части файла
NewFile.First = NextFreeCellFAT ' задание точки входа в FAT для данного файла
Dim PreviousCellFAT As Integer 'Номер последней модифицировавшейся ячейки FAT
PreviousCellFAT = NextFreeCellFAT
Call ToFAT(PreviousCellFAT; 0) 'Записали в нее ноль-признак того, что это
последний (пока) кластер данного файла
count = count - 8 'как минимум 8 байт файла уже размещены
While count > 0 'пока весь файл не разместился
Call ToFAT(PreviousCellFAT; NextFreeCellFAT) 'в последнюю модифицировавшуюся
ячейку FAT вносим указатель на следующую свободную ячейку
PreviousCellFAT = NextFreeCellFAT
Call ToFAT(PreviousCellFAT; 0) 'Записали в нее ноль-признак того, что это
последний (пока) кластер данного файла
count = count - 8 'как минимум 8 байт файла уже размещены
Wend
End
Sub
Sub
DeleteFile(File As FileID) 'процедура удаляет заданный файл без разговоров
Call DeleteCellFromFAT(File.First)
Call DeleteFileFromCatalog(File.Name)
End
Sub
Sub
Refresh() 'обновление изображения области файлов
With Sheets("Sheet")
.Range("F6:U13").Interior.ColorIndex = ColorOfPaper 'окрасили область
файлов в цвет фона
.Range("F6:U13").Value = "" 'очистили все ячейки области
файлов
.Range("F6:U13").NumberFormat = "0" 'формат числа для
области файлов-целые числа
.ClearArrows 'убрали все стрелки
Dim PointerToFile As String
NumberFile = 1
While .Cells(NumberFile + 3; 2) <> "" 'последовательно
просматриваем область файлов. Для каждого файлавыполняется следующая процедура:
NumberCellFAT = .Cells(NumberFile + 3; 4) 'точка входа в FAT N-ного файла
PointerToFile = "=R" & NumberFile + 3 & "C2"
'указатель на ячейку каталога с именем N-ного файла
Relation = (.Cells(NumberFile + 3; 3) - 1) Mod 8 'смещение. Являет собой размер
неполностью заполненного кластера
While .Cells(3; NumberCellFAT + 5) <> 0 'просмотр FAT до признака конца
цепочки
.Range(Cells(6; NumberCellFAT + 5); Cells(6 + 7; NumberCellFAT +
5)).Interior.ColorIndex = ColorUsedPartOfFAT + NumberFile 'выделение цветом
очередного непоследнего кластера N-ного файла
.Range(Cells(6; NumberCellFAT + 5); Cells(6 + 7; NumberCellFAT +
5)).Font.ColorIndex = ColorUsedPartOfFAT + NumberFile
.Range(Cells(6; NumberCellFAT + 5); Cells(6 + 7; NumberCellFAT + 5)).Formula =
PointerToFile 'каждая ячейка этого кластера теперь указывает на ячейку с именем
файла в каталоге
NumberCellFAT = .Cells(3; NumberCellFAT + 5) 'взяли следующую ячейку FAT из
цепочки
Wend 'теперь обработка последнего кластера N-ного файла. Отличается тем, что он
может быть занят не полностью
.Range(Cells(6; NumberCellFAT + 5); Cells(6 + Relation; NumberCellFAT +
5)).Interior.ColorIndex = ColorUsedPartOfFAT + NumberFile
.Range(Cells(6; NumberCellFAT + 5); Cells(6 + Relation; NumberCellFAT +
5)).Font.ColorIndex = ColorUsedPartOfFAT + NumberFile
.Range(Cells(6; NumberCellFAT + 5); Cells(6 + Relation; NumberCellFAT +
5)).Formula = PointerToFile
NumberFile = NumberFile + 1 'работаем со следующим файлом
Wend
End With
End
Sub
Макросы нижнего уровня абстракции
Function FreeSize() As Integer 'Функция для определения
количества свободного места в области файлов
FreeSize = 0
temp = 6
While temp < 22 'просмотр области FAT
If Sheets("Sheet").Cells(3; temp).Value
= "" Then _
FreeSize = FreeSize + 8 'если ячейка FAT
пуста, то своб.места в ней 8 байт
temp = temp + 1
Wend
End Function
Function NextFreeCellFAT() As Integer 'Функция возвращает
номер первого найденного свободного элемента FAT
NextFreeCellFAT = 1
While NextFreeCellFAT < 17
If Sheets("Sheet").Cells(3;
NextFreeCellFAT + 5).Value = "" Then Exit Function
NextFreeCellFAT = NextFreeCellFAT + 1
Wend
End Function
Sub AddFileToCatalog(File As FileID) 'добавление файла в
область каталога
temp = 4
With Sheets("Sheet")
While .Cells(temp; 2) <> ""
temp = temp + 1 'поиск свободного места в
каталоге файлов
Wend 'кто дочитает до этого места-бутылка
шампанского !
.Cells(temp; 2) = File.Name 'Запись в каталог
информации о файле
.Cells(temp; 3) = File.Size
.Cells(temp; 4) = File.First
End With
End Sub
Sub DeleteFileFromCatalog(NameDeletedFile As String)
'удаление информации о файле из каталога
Position = 4
While Sheets("Sheet").Cells(Position;
2).Text <> NameDeletedFile
Position = Position + 1
Wend
For temp = Position To 16 + 3 'следующие за удаляемым
файлом ячейки сдвигаются, _
затирая запись об удаляемом файле
Sheets("sheet").Range(Cells(temp; 2);
Cells(temp; 4)).Value = _
Sheets("sheet").Range(Cells(temp +
1; 2); Cells(temp + 1; 4)).Value
Next
End Sub
Sheets("Sheet").Cells(3; NumberCell +
5).Value = Value
End Sub
Sub DeleteCellFromFAT(StartCell As Integer) 'рекурсивная
функция удаления цепочки из FAT _
Вызывается с номером точки входа
' MsgBox ("DeleteCellFromFAT, StartCell="
& StartCell)
If Sheets("Sheet").Cells(3; 5 +
StartCell).Value = 0 Then 'если в рассматриваемой точке - 0, _
то это значит, что она является указателем конца
файла
Sheets("Sheet").Cells(3; 5 + StartCell)
= "" 'и поэтому очищаем эту ячейку FAT
Else 'в противном случае это указатель на следующую
ячейку FAT - вызываем эту же процедуру
DeleteCellFromFAT
(Sheets("sheet").Cells(3; 5 + StartCell).Value) 'но с новым номером
ячейки FAT
Sheets("sheet").Cells(3; 5 + StartCell)
= "" 'и затем ее очищаем
End If
End Sub
Список
литературы, примененной при подготовке курсовой работы.
1.
Microsoft Systems Journal, Sept 1989. Получен из
Computer Library Periodicals, Jan 1990, Doc #14753
|
2.
Профессиональная работа в MS-DOS, Р.Данкан, Мир, 1993
|
3.
Excel 5.0 для профессионалов, Н.Николь, Р. Альбрехт,
Москва, “Эком”, 1996
|
[1] Необходимо заметить, что
именно такая структура использовалась в первой версии MS-DOS.
[2] PressAddFile
PressDeleteFile
PressRemakeFile
DialogRemakePressName
DialogRemakePressOK
Visualisation
[3] AddFile
DeleteFile
Visualisation
Refresh
[4] FreeSize
ToFAT
NextFreeCellFAT
AddFileToCatalog
DeleteCellFromFAT
DeleteFileFromCatalog