⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file.h

📁 模拟操作系统,主要完成了文件管理,程管理等
💻 H
📖 第 1 页 / 共 2 页
字号:
		{
			for(;name[j]!='\0'&&k<2&&name[j]!='.';j++,k++)
				tname[k]=name[j];
		}
		for(;k<2;k++)
			tname[k]='/0';
		if((d=search(pathname,8,&dn,&bn))==false)  /*找到目录路径*/
		{
			printf("目录不存在,不能建立");
			return(false);
		}
		b=-1;
		fseek(fc,d*64L,SEEK_SET);
		fread(buffer2,64L,1,fc);      /*读出d盘块的内容*/
		for(t=0;t<8;t++)
		{
			if(buffer2[t].name[0]==dname[0]&&buffer2[t].name[1]==dname[1]&&buffer2[t].name[2]==dname[2]&&buffer2[t].type[0]==tname[0]&&buffer2[t].type[1]==tname[1])
			{/* 找到名字dname的文件,建立失败 */
				printf("文件已经存在,不能建立\n");
				return(false);
			}
			if(buffer2[t].name[0]=='$'&&b==-1)
				b=t;
		}/* for */
		if(b==-1)               /*没有空目录项,建立失败*/
		{
			printf("目录无空间\n");
			return(false);
		}
		if((dd=allocate())==false)  /*分配给建立目录的磁盘盘块dd*/
		{
			printf("建立文件失败\n");
			return(false);
		}
		/*填写目录项*/
		for(I=0;I<3;I++)
			buffer2[b].name[I]=dname[I];
		for(I=0;I<2;I++)
			buffer2[b].type[I]=tname[I];
		buffer2[b].attribute=attribute;
		buffer2[b].address=dd;
		buffer2[b].length=0;
		fseek(fc,d*64L,SEEK_SET);
		fwrite(buffer2,64L,1,fc);
		/*填写已打开文件表*/
		strcpy(x.name,name);
		x.attribute=attribute;
		x.number=dd;
		x.length=0;
		x.flag=1;
		x.read.dnum=x.write.dnum=dd;
		x.read.bnum=x.write.bnum=0;
		iopen(&x);
}/*建立文件结束*/

open_file(char *name,int attribute)
{
	OFILE x;
	int dnum,bnum,last,I,d;
	if((d=search(name,4,&dnum,&bnum))==false)
	{
		printf("文件不存在,打开操作失败\n");
		return(false);
	}
	fseek(fc,dnum*64L,SEEK_SET); /*读出对应目录项*/
	fread(buffer2,64,1,fc);
	if((buffer2[bnum].attribute%2==1)&&attribute==1) /*对只读文件要求写*/
	{
		printf("文件不能写,打开失败");
		return(false);
	}
	strcpy(x.name,name);
	x.attribute=buffer2[bnum].attribute;
	x.number=buffer2[bnum].address;
	x.read.dnum=x.write.dnum=buffer2[bnum].address;
	x.read.bnum=x.write.bnum=0;
	x.flag=attribute;
	if(attribute==1)
	{
		while(d!='\xff')           /*寻找文件末尾*/
		{
			fseek(fc, d/64*64L,SEEK_SET);
			fread(buffer1,64L,1,fc);    /*读出dnum项所在FAT*/
			last=d;
			d=buffer1[d%64];            /*读出dnum块下一块内容赋给dnum*/
		}/*while*/
		x.write.dnum=last;          /*填写写指针*/
		fseek(fc,last*64L,SEEK_SET);
		fread(buffer1,64L,1,fc);
		for(I=0;I<64&&buffer1[I]!='#';I++);
		x.write.bnum=I;
		x.length=(buffer2[bnum].length-1)*64+I;
	}
	iopen(&x);                 /*填写已打开文件夹*/
}

close_file(char *name)
/*关闭文件函数*/
{
	int I,dnum,bnum;
	if((I=sopen(name))==-1)
	{
		printf(" 打开的文件中没有该文件,关闭失败\n");
		return(false);
	}
	if(openfile.file[I].flag==1)   /*写文件的追加文件结束符*/
	{
		fseek(fc,openfile.file[I].write.dnum*64L,SEEK_SET);
		fread(buffer1,64,1,fc);
		buffer1[openfile.file[I].write.bnum]='#';
		fseek(fc,openfile.file[I].write.dnum*64L,SEEK_SET);
		fwrite(buffer1,64,1,fc);
		fputc('#',fc);
		search(name,4,&dnum,&bnum);/*查找该文件目录位置*/
		/*修改目录中的文件长度*/
		fseek(fc,dnum*64L,SEEK_SET);
		fread(buffer2,64,1,fc);
		buffer2[bnum].length=openfile.file[I].length/64+1;
		fseek(fc,dnum*64L,SEEK_SET);
		fwrite(buffer2,64,1,fc);
	}
	/*在已打开文件表中删除该文件的登记项*/
	if(openfile.length>1)
		copen(&openfile.file[I],&openfile.file[openfile.length-1]);
	openfile.length--;
}

deletefile(char *name)		//删除文件
{
	int dnum,bnum,t;
	if((t=search(name,4,&dnum,&bnum))==false)  /*查找文件*/
	{
		printf(" 文件不存在\n");
		return(false);
	}
	if(sopen(name)!=-1)                      /*文件打开,不能删除*/
	{
		printf("该文件打开,不能删除\n");
		return(false);
	}
	fseek(fc,dnum*64L,SEEK_SET);
	fwrite(buffer2,64,1,fc);
	buffer2[bnum].name[0]='$';              /*将该文件的目录置成空目录*/
	fseek(fc,dnum*64L,SEEK_SET);
	fwrite(buffer2,64,1,fc);
	while(t!='\xff')                      /*通过FAT查找每一个盘块号,并依次删除*/
	{
		dnum=t;
		fseek(fc,dnum/64*64,SEEK_SET);
		fread(buffer1,64,1,fc);
		t=buffer1[dnum%64];
		buffer1[dnum%64]=0;
		fseek(fc, dnum/64*64L, SEEK_SET);
		fwrite(buffer1,64,1,fc);
	}
}/*文件删除结束*/

md(char *name)
/*建立目录函数,目录路径名name*/
{
	int dnum,bnum,I,j,last,k,s,d,t,tt,b,dd, flag,dn,bn;
	char dname[3],pathname[20];
	I=2;                     /*i=根目录的起始盘块号*/
	/*将name分成两部分,目录路径pathname和目录名name*/
	for(j=0;name[j]!='\0';j++)   /*查找最后一个"/"*/
		if(name[j]=='/')
			s=j;
		/*分离目录路径*/
	for(j=0;j<s;j++)
			pathname[j]=name[j];
	pathname[j]='\0';
		/*分离目录名*/
	for(k=0,j=s+1;name[j]!='\0'&&k<3&&name[j]!='.';j++,k++)
			dname[k]=name[j];
	if(k==0)
	{
		printf("错误文件名或目录名\n");
		return(false);
	}
	for(;k<3;k++)
		dname[k]=' ';
	if((d=search(pathname,8,&dn,&bn))==false) /*找到目录路径*/
	{
		printf("目录不存在,不能建立\n");
		return(false);
	}
	b=-1;
	/*确认该目录不存在的同时查找空目录项*/
	fseek(fc,d*64L,SEEK_SET);
	fread(buffer2,64L,1,fc); /*读出d盘块的内容*/
	for(t=0;t<8;t++)
	{
		if(buffer2[t].name[0]==dname[0]&&buffer2[t].name[1]==dname[1]&&buffer2[t].name[2]==dname[2]&&buffer2[t].attribute==8)
		{/*找到名字dname的目录,建立失败*/
			printf("目录已经存在,不能建立\n");
			return(false);
		}
		if(buffer2[t].name[0]=='$'&&b==-1)
				b=t;
	}/*for*/
	if(b==-1)                /*没有空目录项,不能建立*/
	{
		printf("目录无空间\n");
		return(false);
	}
	if((dd=allocate())==false) /*分配给建立目录的磁盘块dd*/
	{
		printf("没有磁盘空间\n");
		return(false);
	}
	/*填写目录项*/
	for(I=0;I<3;I++)
		buffer2[b].name[I]=dname[I];
	buffer2[b].type[0]=buffer2[b].type[1]=' ';
	buffer2[b].attribute=8;
	buffer2[b].address=dd;
	buffer2[b].length=0;
	fseek(fc,d*64L,SEEK_SET);
	fwrite(buffer2,64L,1,fc);
	/*分给新建目录的盘块初始化*/
	for(t=0;t<8;t++)
		buffer2[t].name[0]='$';
	fseek(fc,dd*64L,SEEK_SET);
	fwrite(buffer2,64L,1,fc);
}/*建立目录结束*/

dir(char *name)
/*显示内容*/
{
	int I,bnum,t,tt,dnum,dn,bn;
	if((dnum=search(name,8,&dn,&bn))==false)/*找到目录路径*/
	{
		printf("目录不存在\n");
		return(false);
	}
	printf("名称	扩展名	起始盘块	长度\n");
	/*显示目录内容*/
	fseek(fc,dnum*64L, SEEK_SET);
	fread(buffer2,64L,1,fc);
	for(t=0;t<8;t++)           /*显示该盘块中目录项的内容*/
		if(buffer2[t].name[0]!='$')
			printf("%c%c%c	%c%c	%4d	%7d\n",buffer2[t].name[0],buffer2[t].name[1],buffer2[t].name[2],buffer2[t].type[0],buffer2[t].type[1],buffer2[t].address,
			buffer2[t].length);
}/*显示目录函数结束*/

rd(char *name)			/*删除空目录*/
{
	int dnum,bnum,flag,t,I;
	if((t=search(name,8,&dnum,&bnum))==false) /*查找文件*/
	{
		printf("目录不存在\n");
		return(false);
	}
	if(strcmp(name,"/")==0)                /*根目录不能删除*/
	{
		printf(" 该目录为根目录,不能删除\n");
		return(false);
	}
	fseek(fc,t*64L,SEEK_SET);             /*判断该子目录是否为空目录*/
	fread(buffer2,64,1,fc);
	flag=1;
	for(I=0;I<8;I++)
		if(buffer2[bnum].name[0]!='$')flag=0;
	if(flag==0)                           /*非空目录不能删除*/
	{
		printf("该目录为非空目录,不能删除\n");
		return(false);
	}
	fseek(fc,dnum*64L,SEEK_SET);         /*删除空目录*/
	fread(buffer2,64,1,fc);
	buffer2[bnum].name[0]='$';              /*将该文件的目录置成空目录*/
	fseek(fc,dnum*64L,SEEK_SET);
	fwrite(buffer2,64,1,fc);
	fseek(fc,t/64*64,SEEK_SET);        /*删除该子目录占用的盘块*/
	fread(buffer1,64,1,fc);
	t=buffer1[t%64];
	buffer1[t%64]=0;
	fseek(fc,t/64*64L,SEEK_SET);
	fwrite(buffer1,64,1,fc);
}
typefile(char *name)/*显示文件内容*/
{
	int I,dnum,dn,bn,t;
	if((dnum=search(name,1,&dn,&bn))==false)
	{
		printf("文件不存在\n");
		return(false);
	}
	if(sopen(name)!=-1)
	{
		printf("该文件打开,不能显示\n");
		return(false);
	}
//	while(dnum!='\xff')
//	{
		fseek(fc,dnum*64L,SEEK_SET);
		fread(buffer1,64,1,fc);        /*读一个盘块到缓冲*/
		for(t=0;t<64&&buffer1[t]!='#';t++) /*显示缓冲内容*/
			putchar(buffer1[t]);
		printf("\n");
//	}
	/*获得下一个盘块*/
	fseek(fc,dnum/64*64L,SEEK_SET);
	fread(buffer1,64,1,fc);
	dnum=buffer1[dnum%64];
} /*显示文件函数结束*/

change(char *name,int attribute)
/*改变文件name的属性为attribute*/
{
	int dnum,bnum;
	if(search(name,1,&dnum,&bnum)==false) /*查找文件目录*/
	{
		printf("文件不存在\n");
		return(false);
	}
	if(sopen(name)!=-1)
	{
		printf("该文件打开,不能改变文件属性\n");
		return(false);
	}
	fseek(fc,dnum*64L,SEEK_SET);
	fread(buffer2,64,1,fc);         /*读出该目录所在盘块*/
	buffer2[bnum].attribute=attribute; /*修改属性*/
	fseek(fc,dnum*64L,SEEK_SET);
	fwrite(buffer2,64,1,fc);         /*写回磁盘*/
}
/*改变文件属性函数结束*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -