// An highlighted block
#include<iostream>
#include<string>
#include<stdio.h>
#include<time.h>
#pragma warning(disable:4996)
constexpr auto disk_size = 1024*1024;
constexpr auto linebtye = 40;//每行字节数
using namespace std;
struct catalg;
struct loadingblock
{
int times;//测试次数
float VarNumber;//版本号
char name[100];
};
struct freetable {
int address; //已分分区起始地址
int length; //已分分区长度,单位为字节
int flag; //已分配表区登记栏标志,用0表示空栏目,
}free_table[100];
struct superblock//超级块
{
int Size;
int FileNumber;
catalg* itree;
freetable* ftree;
char* buffer;
};
struct fcb//文件管理结构
{
string name;
char change_time[100];
int classnumber;//1为可读写
long address;
int size;
};
struct catalg//目录节点
{
string name;
char change_time[100];
catalg* above;
catalg* down[100];;//每级目录至多100个文件目录
fcb inode [100];//每级目录至多100个文件
int cnumber;
int inumber;
};
loadingblock* load;
superblock* ZhnSuper;
catalg* ctree;
catalg* nowcpoint;
char* buffer;
int fs;
catalg* last[3]; int lasti;//历史目录记录
void catalg_write(FILE* t, catalg* g)
{
fwrite(g, sizeof(catalg), 1, t);
catalg* m;
int i = 0;
while (i < g->cnumber)
{
m = g->down[i++];
catalg_write(t, m);
}
}
void catalg_read(FILE* t, catalg* g)
{
fread(g, sizeof(catalg), 1, t);
catalg* m;
int i = 0;
while (i < g->cnumber)
{
g->down[i] = new catalg;
m = g->down[i++];
catalg_read(t, m);
m->above = g;
}
}
string getnow(int i)//获取当前时间
{
time_t now = time(NULL);string t = ctime(&now);
if(i==1) cout << t;
for (int i = 0; i <t.size(); i++)
{
if (t[i] != '\n')
t[i] = t[i];
else
t[i] = 0;
}
return t;
}
void stringtochar(char *a,string b)//string转char
{
strcpy(a, b.c_str());
}
void superblock_info()//超级块信息
{
getnow(1);
cout << "现有文件" << ZhnSuper->FileNumber << "个,\n共" << ZhnSuper->Size << "B\n";
}
void delete_fcb(int t)
{
for (int i = t; i < nowcpoint->inumber; i++)
{
nowcpoint->inode[i] = nowcpoint->inode[i + 1];
}
}
void var();
void copy_(string name, catalg* p,catalg* nowc);
void copy(string name, catalg* p);
void init()//操作系统初始化
{
getnow(1); cout << "系统开始载入\n";
FILE* disk = fopen("disk.txt", "rb");
ZhnSuper = new superblock;
load = new loadingblock;
ctree = new catalg;
if (!disk)//创建系统盘
{
getnow(1);
cout << "欢迎第一次使用该模拟系统\n开始创建系统盘\n";
disk = fopen("disk.txt", "wb");
fs = 0;
ZhnSuper->buffer = new char[disk_size];
buffer = ZhnSuper->buffer;
for (int i = 0; i < disk_size; i++)
{
ZhnSuper->buffer[i] = '\0';
}
strcpy(load->name, "计创18张海纳");
load->times = 116; load->VarNumber = 2.1;
ZhnSuper->FileNumber = 0;
ZhnSuper->ftree = NULL;
ZhnSuper->Size = 0;
ZhnSuper->itree = NULL;
ctree->cnumber = 0;
string a = getnow(0);
ctree->inumber = 0;
ctree->above = NULL;
ctree->name = "root";
stringtochar(ctree->change_time, getnow(0));
ZhnSuper->itree = ctree;
fcb one;
one.name= "os.txt";
time_t now = time(NULL);
stringtochar(one.change_time, getnow(0));
string temp = "This is fox's disk that cost whole week to creat it";
one.classnumber = 1;
one.size = strlen(temp.c_str()) ;
one.address =0;
for (int i = 0; i <one.size; i++)
{
buffer[i + one.address] = temp[i];
}
free_table[fs].address = one.address+one.size;
free_table[fs].flag =1;
free_table[fs].length = disk_size - one.size;
catalg* os = new catalg;
os->name = "os";
os->above = ctree;
ctree->down[ctree->cnumber++] = os;
os->inumber = 0;
os->cnumber = 0;
os->inode[os->inumber++] = one;
stringtochar(os->change_time, getnow(0));
ZhnSuper->FileNumber++;
ZhnSuper->Size += one.size;
int lasti = 0; last[lasti++] = ctree;
fwrite(load, sizeof(loadingblock), 1, disk);
fwrite(ZhnSuper, sizeof(superblock), 1, disk);
catalg_write(disk, ctree);
fwrite(&free_table, sizeof(freetable), 100, disk);
fwrite(ZhnSuper->buffer, sizeof(char) * disk_size, 1, disk);
fclose(disk);
nowcpoint = ctree;
getnow(1);
cout << "系统盘创建成功\n";
return;
}
int lasti = 0; last[lasti++] = ctree;
int mt;
mt = fread(load, sizeof(loadingblock), 1, disk);
load->times++;
mt=fread(ZhnSuper, sizeof(superblock), 1, disk);
catalg_read(disk, ctree);
mt = fread(&free_table, sizeof(freetable), 100, disk);
ZhnSuper->buffer = new char[disk_size];
mt = fread(ZhnSuper->buffer, sizeof(char) * disk_size, 1, disk);
buffer = ZhnSuper->buffer;
nowcpoint = ctree;
var();
superblock_info();
fclose(disk);
}
void update()//更新数据
{
FILE* disk = fopen("disk.txt", "wb");
fwrite(load, sizeof(loadingblock), 1, disk);
fwrite(ZhnSuper, sizeof(superblock), 1, disk);
catalg_write(disk, ctree);
fwrite(&free_table, sizeof(freetable), 100, disk);
fwrite(ZhnSuper->buffer, sizeof(char) * disk_size, 1, disk);
fclose(disk);
}
void recyce(int address,int size)
{
int il, ir, flagl, flagr; flagl = flagr =
操作系统课设之单线程版
最新推荐文章于 2024-01-17 21:14:32 发布
这段代码实现了一个简单的操作系统模拟文件系统,包括文件和目录的管理、读写、创建、删除等操作。核心数据结构有超级块、目录节点、文件控制块等,使用磁盘空间管理表进行空间分配。系统支持历史目录记录、文件浏览、目录访问、文件读取、文件创建、目录创建和删除等功能。
摘要由CSDN通过智能技术生成