操作系统课设之单线程版

这段代码实现了一个简单的操作系统模拟文件系统,包括文件和目录的管理、读写、创建、删除等操作。核心数据结构有超级块、目录节点、文件控制块等,使用磁盘空间管理表进行空间分配。系统支持历史目录记录、文件浏览、目录访问、文件读取、文件创建、目录创建和删除等功能。
摘要由CSDN通过智能技术生成
// 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 =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值