操作系统 实验四 文件系统管理

实验目的:

利用文件内容和命令实现树型目录结构。利用位示图表示外存的分配情况,新建文件时分配必要的空间,模拟文件分配表(FAT)记录文件在外存上的存储方式。

内容要求:

 在文件中保存目录内容,创建文件或子目录可以用命令行命令:MD、CD、RD、MK(创建文

件)、DEL(删除文件)和DIR。目录项包括文件或目录名称、类型(文件、目录或空目录项)、创建日期以及下一个目录项指针、下一级目录项指针。

① 创建初始文件,建立根目录的“.”和“..”目录项。

②实现 ‘*’,‘?’的模糊查询功能。

③ 输入命令后根据命令含义完成相应文件操作:

MD:在目录文件中创建子目录,同时搜索当前目录最后一个目录项,并保存指针信息;

CD:根据当前目录切换到指定目录;

RD:搜索所要删除的目录是否为空目录,若是则删除;

MK:在当前目录中创建文件名称;(申请空间利用位示图修改FAT)

DEL:搜索所要删除的文件是否存在,若是则删除;(恢复位示图修改FAT)

DIR:列出当前目录的所有目录项。

④ 在创建文件的时候分配空闲的磁盘空间,采用显示链接的方式,利用文件分配表(FAT)记录文件在外存上的存储情况。

⑤当删除文件时,回收外存上的空间,修改位示图和文件分配表。


实现过程:

#include
#include
using namespace std;

struct FCB
{
		char	name[100];
		int		year,month,day,hour,minute,second;
		int		length;
		int		startaddr;
		int		node;
	
}fcb[1000];

struct Directory
{
		char	name[100][100];
		int		year,month,day,hour,minute,second;
		int		judge[100];			/*0为文件夹,1为文件*/
		int		link[100];		
		int		node;
		int		num;
}Dir[1000];

int		path = 1,Time = 1,used_fcb = 0,used_dir = 1;

int		step = 0;	
char	steps[100][100];		/*step保存当前工作路径深度,steps保存当前工作路径*/

int		FAT[256];	/*	FAT表	*/

int		Memory = 0;

char	bitmap[32];	/*	位示图	*/

time_t T; /*用来存系统时间*/
struct tm *TimeP; /*用来存localtime传回的地址*/	

void init(int n,int root)		/*对新结点初始化*/
{
		strcpy(Dir[n].name[0],".");
		strcpy(Dir[n].name[1],"..");
		Dir[n].judge[0]=Dir[n].judge[1] = 0;
		Dir[n].link[0]	= Time;
		Dir[n].link[1]	= root;
		Dir[n].node		= Time ++;
		Dir[n].num		= 2;
	

		T = time(NULL);
		TimeP = localtime( &T ); 
		Dir[n].year   = (TimeP->tm_year) +1900;
		Dir[n].month  = (TimeP->tm_mon) + 1;
		Dir[n].day    = (TimeP->tm_mday);
		Dir[n].hour   = (TimeP->tm_hour);
		Dir[n].minute = (TimeP->tm_min);
		Dir[n].second = (TimeP->tm_sec);
}
bool get_bit_map(int n);
void init_bit_map()	/*初始化位示图*/
{
		int				i;
		for(i = 0 ; i < 32 ; i ++)
				bitmap[i] = rand()%256;
		for(i = 0 ; i < 256 ; i ++)
				FAT[i] = -1;
		for(i = 0 ; i < 256 ; i++)
				if(get_bit_map(i) == 0)
						Memory ++;

		
}

void show_bit_map()	/*显示位示图*/
{
		int				i,j;
		cout << "位示图" <>op;
		for(i = 2 ;i < Dir[path-1].num ; i ++)
				if(!Dir[path-1].judge[i] && !strcmp(Dir[path-1].name[i],op))
				{
						cout<<"文件夹已经存在"<>op;
		for(i = 2 ; i < Dir[path-1].num ; i ++)
				if(!Dir[path-1].judge[i] && !strcmp(Dir[path-1].name[i],op))
				{
						if(Dir[Dir[path-1].link[i]-1].num  >2)
								cout<<"该文件夹不为空, 不能删除"<\t";
					cout<=strlen(choose))
				{
						if(!Dir[path-1].judge[i])
						{
								cout<\t";
								cout<>op;
		if(!strcmp(op,"\\"))
		{
			path=1;
			step=0;	
			return ;
		}
		for(i = 0 ; i < Dir[path-1].num ; i ++)
				if(!Dir[path-1].judge[i] && !strcmp(Dir[path-1].name[i],op))
				{
						path=Dir[path-1].link[i];
						
						if(i == 1 && step)
								step--;
						else if(i != 1 && i)
						{
								strcpy(steps[step++],op);
						}
						
						return ;
				}
		cout<<"不存在该文件夹"<>fcb[used_fcb].name;
		cin>>fcb[used_fcb].length;
		
		Memory -= fcb[used_fcb].length;

		for(i = 2 ; i < Dir[path-1].num ; i ++)
				if(Dir[path-1].judge[i] && !strcmp(Dir[path-1].name[i],fcb[used_fcb].name))
				{
						cout<<"文件重名,创建失败"<tm_year) + 1900;
		fcb[used_fcb].month  = (TimeP->tm_mon) + 1;
		fcb[used_fcb].day  = (TimeP->tm_mday) ;
		fcb[used_fcb].hour   = (TimeP->tm_hour);
		fcb[used_fcb].minute = (TimeP->tm_min);
		fcb[used_fcb].second = (TimeP->tm_sec);
	
		Dir[path-1].num++;
		used_fcb++;
		
}

void rk()		/*删除文件*/
{
		int i,j,k;
		
		char na[100];
		cin>>na;
		for(i = 2 ; i < Dir[path-1].num ; i ++)
				if(Dir[path-1].judge[i] && !strcmp(Dir[path-1].name[i],na))
				{
						k = fcb[Dir[path-1].link[i]].startaddr;
						for(j=0;j";
		for(int i = 0 ; i < step ; i ++)
		{
				cout<';
		}
		return true;
}

void choose()
{	
		char op[100],choose[100];
		
		while(outputpath()	&& cin>>op && strcmp(op,"exit"))
		{
				memset(choose,'\0',sizeof(choose));
				if(!strcmp(op,"cd"))
				{
						cd();
				}
				else if(!strcmp(op,"rd"))
				{
						rd();
				}
				else if(!strcmp(op,"md"))
				{
						md();
				}
				else if(!strcmp(op,"tree"))
				{
						tree(path,0);
						
				}
				else if(!strcmp(op,"mk"))
				{
						mk();
				}
				else if(!strcmp(op,"rk"))
				{
						rk();
				}
				else if(!strcmp(op,"dir"))
				{
						getchar();
						gets(choose);
						if(choose[0]!='\0')
								_dir(choose);
						else
								dir();
				}
				else if(!strcmp(op,"cls"))
				{
						system("cls");
				}
				
		}
		
}




int main()
{
		init(0,1);
		cout << "Microsoft Windows XP [版本 5.1.2600]\n(C) 版权所有 20092612 Zhang Bing.\n\n" << endl;
		init_bit_map();
		choose();
		return 0;
}


你可能感兴趣的:(操作系统)