Модель файловой системы FAT
t;" 'подготовка диалога
"Добавление файла"
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
| | скачать работу |
Модель файловой системы FAT |