- •Уточнение задания по тп v2.0
- •Пояснение задания
- •Некоторые моменты
- •Описание подпрограмм
- •Создать файловую систему с заданными параметрами (форматировать диск)
- •Удалить файл
- •Переименовать файл
- •Добавить информацию в существующий файл
- •Изменение типа файла
- •Сжатие файловой системы
- •Записать метку тома и владельца
Пояснение задания
В результате некоторого обсуждения программы было решено отойти от представления модели в виде файла с блоками по 512 байт и перейти к представлению в виде класса. В результате такого перехода работа над программой упрощается до безобразия. Класс содержит только поля, к которым действительно необходимо обращаться в процессе работы и процесс обращения к данным на порядок проще, чем в случае с файлом. Кроме того, было решено отказаться от представления самой информации, содержащейся в системе, то есть работать предполагается только с таблицей размещения(каталогом) файлов.
Структура полей класса файловой системы:
Вот описание полей класса, а заодно и конструктора с деструктором:
struct SB{ //системный блок
unsigned short vers; //версия системы
char tomename[12];//метка тома
char ownername[12];//имя владельца
char sysname[12];//имя системы
};
struct FRec{ //запись о файле
unsigned short rectype; //тип записи
char name[6];//имя файла
char type[4]; //тип файла
unsigned short len; //число блоков, занимаемых файлом
unsigned short date;//дата создания файла
};
struct segment{//сегмент
unsigned short catsize;//размер каталога
unsigned short nextseg;//номер следующего сегмента
unsigned short seginuse;//счетчик используемых сегментов
unsigned short startblock;//номер блока на носителе, с которого размещаются файлы, описанные в сегменте
FRec files[63];//таблица записей о файлах
};
class FS{//файловая система
SB sb;//системный блок
segment *catalog;//каталог-массив сегментов
public:
FS(unsigned long size, unsigned short V, char* NT, char* NO, char *NS);//конструктор класса, будет форматировать систему
~FS();
};
FS::FS(unsigned long size, unsigned short V, char* NT, char* NO, char *NS) {
sb.vers=V;
int i=0;
for (i=0; NT[i]; i++)//записывается информация в системный блок
sb.tomename[i]=NT[i];
for (; i<12; i++)
sb.tomename[i]=0;
for (i=0; NO[i]; i++)
if (NO[i]!='\0') sb.ownername[i]=NO[i];
for (; i<12; i++)
sb.ownername[i]=0;
for (i=0; NS[i]; i++)
if (NS[i]!='\0') sb.sysname[i]=NS[i];
for (; i<12; i++)
sb.sysname[i]=0;
unsigned long CS=size/62+1;//расчитывается...
unsigned char cs=CS;
if (cs>31) cs=31;
if (cs==0) cs=1;
catalog= new segment[cs];//...и выделяется память под каталог
for (unsigned char i=0; i<cs; i++){
catalog[i].catsize=cs;//заполняются заголовки сегментов
catalog[i].nextseg=i+1;
catalog[i].seginuse=1;
catalog[i].startblock=0;
catalog[i].files[0].rectype=5;//в сегментах создаются записи-признаки конца записей(аналог символа '0', указывает, что нужно прекратить чтение из сегмента)
}
catalog[0].startblock=6+2*cs;// в первом сегменте редактируется заголовок,...
catalog[0].files[1]=catalog[0].files[0];//...запись-признак конца записей сдвигается вниз,...
catalog[0].files[0].rectype=2;//...на первое место добавляется запись о нераспределенной памяти...
catalog[0].files[0].len=size-(6+2*cs);// ...размером, соответствующим размеру оставшейся памяти
catalog[cs-1].nextseg=0;//в последнем сегменте каталога указывается, что после него нет сегметов
}
FS::~FS(){
delete catalog;
};
В блоке системной информации указывается версия системы, её имя, владелец и метка тома. Каталог состоит из сегментов, сегменты состоят из заголовка и 63-х записей о файлах. Заголовок сегмента содержит количество сегментов в каталоге, номер следующего сегмента, счетчик используемых сегментов и номер блока (адрес), с которого начинается размещение файлов, указанных в сегменте. Записи о файлах содержат тип записи, имя файла, тип файла, его размер и дату создания.
В работе используются 3 типа записи о файлах:
2-запись о свободной области
3-запись о файле
5-признак конца записей в сегменте
Работа с каталогом:
Первоначально, после того как файловая система отформатирована , в 1-м сегменте содержатся 2 записи- запись о всем свободном пространстве на диске(о нераспределенной памяти) и запись-признак конца записей в сегменте. В остальных сегментах содержится 1 запись-признак конца записей.
При добавлении файла в систему в таблице определяется запись о свободной области подходящего размера, на её место добавляется запись о созданном файле, все последующие записи сдвигаются на одну позицию вниз и на освободившееся место (после созданной записи о файле) добавляется запись о свободной области с размером, равным разнице размеров записанного файла и исходной свободной области.
При удалении файла тип записи о нем в таблице изменяется на «запись о свободной области». Позднее на это место в таблице может быть записан другой файл, размер которого меньше либо равен размеру этой области.
Постепенно, по мере удаления файлов из системы, в таблице образуется много небольших свободных мест, которые затрудняют рациональное использование памяти. Чтобы прекратить это безобразие проводится дефрагментация- все свободные области сдвигаются в старшие адреса памяти, т.е. в конец таблицы, где образуется одна запись о нераспределенной памяти.
Как уже было сказано, от моделирования работы с самими файлами на диске решено отказаться, т.е. работа происходит только с таблицей.
