ЗМІСТ:
Мета курсової роботи
Ідея програми
Про систему FAT
Структура системи файлів FAT
Про реалізацію завдання
Про застосованих рівнях абстракції
Про інтерфейсі
Оригінальний текст: Макроси, що викликаються подіями
Оригінальний текст: Базові події
Оригінальний текст: Макроси нижнього рівня абстракції
Список літератури, застосованої при підготовці курсової роботи
Мета:
Розробка програми, що моделює організацію файлової системи FAT.
Ідея програми:
Програма позвовяет експериментально дослідити логічну структуру файлової системи FAT, що складається з трьох областей: FAT (File Allocation Table), кореневий каталог і область файлов.1 Є панель опису операцій з файлами, що знаходяться на диску, а саме: додати файл, видалити файл, перезаписати файл (зі зміною розміру). Крім того, надана можливість графічного відображення відповідності файлів секторів на диску.
Файлова Система FAT:
Так звана файлова система FAT використовувалася у всіх версіях МСДОС і в перших двох випусках OS/2 (версії 1.0 і 1.1). Кожний логічний тому має власний FAT, який виконує дві функції: містить інформацію розподілу для кожного файлу в томі у формі списку зв'язків модулів розподілу (кластерів) і вказує, які модулі розподілу вільні.
Коли FAT був винайдений, це було чудове рішення для управління дисковим простором, головним чином тому що гнучкі диски, на яких він використовувався, рідко були розміром більше, ніж кілька Mb. FAT був досить малий, щоб перебувати в пам'яті постійно, дозволяв забезпечувати дуже швидкий довільний доступ до будь-якої частини будь-якого файлу. Коли FAT був застосований на жорстких дисках, він став занадто великим для резидентного знаходження в пам'яті і погіршував продуктивність системи. Крім того, так як інформація щодо вільного дискового простору рассредотачівалась "впоперек" великої кількості секторів FAT, його було непрактичний при розподілі файлового простору, і фрагментація файлів виявилася перешкодою високої ефективності.
Крім того, використання щодо великих кластерів на жорстких дисках призвело до великої кількості невикористаних ділянок, так як в середньому для кожного файлу половина кластеру була витрачена даремно.
Обмеження FAT на найменування файлів і каталогів успадковані з CP/M. Коли Paterson створював 86DOS, однією з його перших цілей було полегшити імпорт з CP/M в його нову операційну систему. А отже прийняті в CP/M обмеження на імена файлів і розширень перенеслися в 86DOS.
Протягом декількох років Microsoft і IBM зробили спробу продовжити життя файлової системи FAT завдяки зняття обмежень на розміри томи, поліпшенню Стратегія розподілу, кешування імен шляху, і переміщення таблиць і буферів у розширену пам'ять. Але вони можуть розцінюватися лише як тимчасові заходи, тому що файлова система просто не підходила до великих пристроїв довільного доступу.
Структура системи файлів FAT
00Н 01н Ідентифікатор дисковода
01н 09Н Файл (8 символів)
09Н 0СН Розширення (3 символи)
0СН 0ЕН Номер поточного блоку
0ЕН 10Н Розмір запису
10Н 14Н Розмір файлу
14Н 16Н Дата створення (оновлення)
16Н 18Н Час створення (оновлення)
18Н 20Н Зарезервовано
20Н 21Н Номер поточного запису
21Н 25Н Номер відносної запису
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 < br />
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
Модель файлової системи FAT
Сторінка № 16