|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Резюме Резюме.
О реализации задания Модель файловой системы представляет собой рабочий лист 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 .EditBoxes("Size").Text = "" 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 Call AddFileToCatalog(NewFile) 'добавили файл в каталог 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 Sub ToFAT(NumberCell As Integer; Value As Integer) 'Процедура записи в заданную ячейку FAT заданного значения 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
![]() |
Все права защищены © 2010 |
![]() |