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

📄 os.cpp

📁 设计并实现一个多用户多级目录结构的文件系统
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		{
			if(!strcmp(u->u_ofile[i]->o_fcbp->f_name,route))
				if(block==u->u_ofile[i]->o_fcbp->f_blkno)
				{
					printf("you have opened this file\n\n");
					printcdir(oprtype,NULL);
					return NULL;
				}
		}
		else
		{ 
			p=i;
			break;
		}
    if(i==5)
	{
		printf("you have opened too many files\n\n");
		printcdir(oprtype,NULL);
		return NULL;
	}

    for(i=0;i<FILENO;i++)
	{
		if(file_fcb[i].f_mode==0)
		{
			file_fcb[i].f_mode=IFREG;
			file_fcb[i].f_fsize=dir_struct->d_fsize;
			file_fcb[i].f_count=1;
			file_fcb[i].f_gid=u->u_cdir->f_gid;
			file_fcb[i].f_uid=dir_struct->d_uid;
			file_fcb[i].f_flag=0;
			file_fcb[i].f_blkno=block;
			file_fcb[i].f_number=blk_offset;
			for(j=0;j<8;j++)
				file_fcb[i].f_name[j]=dir_struct->d_name[j];
			for(j=0;j<8;j++)
				file_fcb[i].f_add[j]=dir_struct->d_add[j];
			break;
		}
	}
	
	for(t=0;t<FILENO;t++)
	{
		if(!ofile[t].o_fcbp)
		{
			ofile[t].o_fcbp=file_fcb+i;
			ofile[t].o_flag=0;
			ofile[t].o_count=1;
			ofile[t].o_offset=0;
		}
		else continue;
		break;
	}
	
	if(t==FILENO)
	{
		file_fcb[i].f_mode=0;
		ofile[t].o_fcbp=NULL;
		
		printf("too many files opened in system\n");
		printcdir(oprtype,NULL);
		return NULL;
	}
        
    int exit=0;
	if(!strcmp(opentype,"r"))//默认文件读
		if(file_fcb[i].f_gid==OTHERS)
			exit=1;
		else
			file_fcb[i].f_mode=IREAD;
	if(!strcmp(opentype,"w")||!strcmp(opentype,"rw")||!strcmp(opentype,"wr"))
		if(file_fcb[i].f_gid==HOST)
			file_fcb[i].f_mode=IWRITE;
		else 
			exit=1;
	if(exit==1)
	{
		file_fcb[i].f_mode=0;
		ofile[t].o_fcbp=NULL;
		
		printf("you can't open this file in this mode\n");
		printcdir(oprtype,NULL);
		return NULL;
	} 

    
	u->u_ofile[p]=ofile+t;
	
	if(ofile[t].o_fcbp->f_add[0]==0)
	{
		fseek(vp,0,0);
		cur_file=route;
	}
	else
	{
		fseek(vp,block*BSIZE+blk_offset*DSIZE,0);
		fread(dir_struct,DSIZE,1,vp);
		fseek(vp,dir_struct->d_add[0]*BSIZE,0);
		cur_file=route;
	}

	printcdir(oprtype,NULL);
	return vp;
}


void fileclose(char *route)
{
	int oprtype=DIR,j;
	
	if(route==NULL)
	{
		for(j=0;j<5;j++) 
		{
			if(u->u_ofile[j])
			{
				u->u_ofile[j]->o_flag=0;
				u->u_ofile[j]->o_count=0;
				u->u_ofile[j]->o_fcbp->f_mode=0;
				u->u_ofile[j]->o_fcbp=NULL;
				u->u_ofile[j]=NULL;
			}
        }

		printf("\n\n");
		printcdir(oprtype,NULL);
		return;
	}
    else
	{
		printf("\n");
		printcdir(oprtype,NULL);
	}
}

void filedelete(char *route)
{
	int oprtype=DIR,i,j,bk=0,number;
   
	if(route==NULL)
	{
		printf("missing file name you want to delete.\n\n");
		printcdir(oprtype,NULL);
		return;
	}
		
	//如果文件是打开的,不能删
    for(i=0;i<5;i++)
	{
		if(u->u_ofile[i])
			if(!strcmp(u->u_ofile[i]->o_fcbp->f_name,route))
			{
				printf("the file is open,can't delete it.\n\n");
		        printcdir(oprtype,NULL);
				return;
			}
	}
    //else--->

    for(i=0;i<8;i++)
	{
		number=0;
		for(j=0;j<16;j++)
		{
			fseek(vp,u->u_cdir->f_add[i]*BSIZE+j*DSIZE,0);			
			block=u->u_cdir->f_add[i];			
			blk_offset=j;
			iget();
			
			if(u->u_cdir->f_mode!=IFREG)
			{
				if(u->u_cdir->f_mode==IFDIR)
					number++;
				iput();
				continue;
			}
            else
			{
				number++;
			    if(!strcmp(u->u_cdir->f_name,route))
					bk=1;
				else iput();
			}
		}
		if(bk)break;
	}
	if(i==8)
	{
		printf("impossible file name\n");
	    printcdir(oprtype,NULL);
		return;
	}

    for(i=0;i<8;i++)
		if(u->u_cdir->f_add[i])
		{
			
			brelse(u->u_cdir->f_add[i]);
			u->u_cdir->f_add[i]=0;
		}
	u->u_cdir->f_mode=EMPTY;
	u->u_cdir->f_fsize=0;
	iput();
	number--;
	u->u_cdir->f_fsize--;
	if(number==0||u->u_cdir->f_fsize==0)
	{
		brelse(u->u_cdir->f_add[i]);
		u->u_cdir->f_add[i]=0;
	}
    cdirstruct();
	fseek(vp,u->u_cdir->f_blkno*BSIZE+u->u_cdir->f_number*DSIZE,0);
	fwrite(dir_struct,DSIZE,1,vp);
	printcdir(oprtype,NULL);
}

void filewrite(char *chr,int size,FILE *f)
{
	int oprtype=DIR,i,k=0;
	struct fcb *p;
	
	u->u_base=chr;
	if (u->u_base==NULL)
	{
		printf("the buffer is empty\n\n");
		printcdir(oprtype,NULL);
		return;
	}
	
	
	if(size==0)
	{
		printcdir(oprtype,NULL);
		return;
	}

	for(i=0;i<5;i++)
		if(u->u_ofile[i]!=NULL)
		{			
			if(!strcmp(cur_file,u->u_ofile[i]->o_fcbp->f_name))
			{	
				p=u->u_ofile[i]->o_fcbp;
				break;
			}
		}

	if(i==5)
	{
		printf("no such file or the file is not open\n\n");
		printcdir(oprtype,NULL);
		return;
	}
	
	u->u_count=size;
	block=ofile[i].o_offset/BSIZE;
	blk_offset=ofile[i].o_offset%BSIZE;
	
    
	if(size<=BSIZE-blk_offset)
	{
		if(!p->f_add[block])
			p->f_add[block]=balloc();
		fseek(vp,p->f_add[block]*BSIZE+blk_offset,0);
		fwrite(chr,size,1,vp);
	}
	
	if(size>BSIZE-blk_offset)
	{
        if(!p->f_add[block])
			p->f_add[block]=balloc();
		fseek(vp,p->f_add[block]*BSIZE+blk_offset,0);
		fwrite(chr,BSIZE-blk_offset,1,vp);
        chr+=BSIZE-blk_offset;
		size-=BSIZE-blk_offset;
		while(size>BSIZE)
		{
			block++;
			if(!p->f_add[block])
				p->f_add[block]=balloc();
			fseek(vp,BSIZE*p->f_add[block],0);
			fwrite(chr,BSIZE,1,vp);
			size-=BSIZE;
			chr+=BSIZE;
		}
		
		block++;
		if(!p->f_add[block])
		{
			p->f_add[block]=balloc();
			k=1;
		}
		fseek(vp,BSIZE*p->f_add[block],0);
		fwrite(chr,size,1,vp);
	}

    p->f_flag=FUPD;
	if(k==1)
		p->f_fsize=BSIZE*block+size;
	
	u->u_cdir=p;
	cdirstruct();
	u->u_cdir=fp-1;
    
	dir_struct->d_mode=IFREG;
    fseek(vp,p->f_blkno*BSIZE+p->f_number*DSIZE,0);
	fwrite(dir_struct,DSIZE,1,vp);
	printcdir(oprtype,NULL);
    
}

void write_file(char *route)
{
	int oprtype=DIR,i;
    if(route==NULL)
	{
		printf("need file name.\n\n");
	    printcdir(oprtype,NULL);
		return;
	}
	
	for(i=0;i<5;i++)
		if(u->u_ofile[i]!=NULL)			
			if(!strcmp(route,u->u_ofile[i]->o_fcbp->f_name))
				break;
	if(i==5)
	{
		printf("no such file or the file is not open\n\n");
		printcdir(oprtype,NULL);
		return;
	}
	cur_file=route;
    fseek(vp,u->u_ofile[i]->o_fcbp->f_add[0]*BSIZE,0);
	filewrite(filebuffer,u->u_offset,vp);
}

void fileread(char *chr,int size,FILE *f)
{
    int oprtype=DIR,i,k=0,readsize=size;
	struct fcb *p;
	
	if(size==0)
	{
		printf("       size is 0\n\n");
		printcdir(oprtype,NULL);
		return;
	}

	for(i=0;i<5;i++)
		if(u->u_ofile[i]!=NULL)
		{
			if(!strcmp(cur_file,u->u_ofile[i]->o_fcbp->f_name))
			{	
				p=u->u_ofile[i]->o_fcbp;
				break;
			}
		}

	if(i==5)
	{
		printf("no such file or the file is not open\n\n");
		printcdir(oprtype,NULL);
		return;
	}

   	u->u_base=chr;
	u->u_count=size;
	block=ofile[i].o_offset/BSIZE;
	blk_offset=ofile[i].o_offset%BSIZE;

    if(size<=BSIZE-blk_offset)
	{
		if(!p->f_add[block])
			p->f_add[block]=balloc();
		fseek(vp,p->f_add[block]*BSIZE+blk_offset,0);
		fread(chr,size,1,vp);
	}
	
	if(size>BSIZE-blk_offset)
	{
		fseek(vp,p->f_add[block]*BSIZE+blk_offset,0);
		fread(chr,BSIZE-blk_offset,1,vp);
        chr+=BSIZE-blk_offset;
		size-=BSIZE-blk_offset;
		while(size>BSIZE)
		{
			fseek(vp,BSIZE*p->f_add[block],0);
			fread(chr,BSIZE,1,vp);
			size-=BSIZE;
			chr+=BSIZE;
		}
		
		block++;
		fseek(vp,BSIZE*p->f_add[block],0);
		fread(chr,size,1,vp);
	}

    chr=u->u_base;

	for(i=0;i<readsize;i++)
	{
		printf("%c",*chr);
		chr++;
	}
    chr=u->u_base;
	u->u_offset=readsize;
	printf("\n\n");
	printf("         the size is %d\n\n",p->f_fsize);
	
	printcdir(oprtype,NULL);
}

void read_file(char *route)
{
	int oprtype=DIR,i;
    if(route==NULL)
	{
		printf("need file name.\n\n");
	    printcdir(oprtype,NULL);
		return;
	}

	for(i=0;i<5;i++)
		if(u->u_ofile[i]!=NULL)			
			if(!strcmp(route,u->u_ofile[i]->o_fcbp->f_name))
				break;
	if(i==5)
	{
		printf("no such file or the file is not open\n\n");
		printcdir(oprtype,NULL);
		return;
	}
	cur_file=route;
	fseek(vp,u->u_ofile[i]->o_fcbp->f_add[0]*BSIZE,0);
	fileread(filebuffer,u->u_ofile[i]->o_fcbp->f_fsize,vp);
}
//------------------------------------------------
// 解析命令字符串
//------------------------------------------------
void string(char *&opr,char *&route) 
{
	char *name=new char;
	gets(name);
	for(int i=0;;i++)
	{
		if(*(name+i)!=' ')
			*(opr+i)=*(name+i);
		else 
			*(opr+i)='\0';

		if(*(name+i)==' ')
		{
			if(*(name+i+1)=='\0')
			{
				route=NULL;
				return;
			}
			route=name+i+1;
			return;
		}
		
		if(*(name+i)=='\0')
		{
			*(opr+i)='\0';
			return;
		}

	}
}
//------------------------------------------------
//主函数main()
//------------------------------------------------
int main()
{
	char *opr=new char,*route=NULL;
    int oprtype=1;
	init();	
	
	printf("FILE:>");
	string(opr,route);
	
 
	while(strcmp(opr,"logout")&&strcmp(opr,"exit"))
	{
	
		if(!strcmp(opr,"dir"))
			dir(route);
        else
			if(!strcmp(opr,"md"))
				md(route);
        else
			if(!strcmp(opr,"cd"))
				cd(route);
        else
			if(!strcmp(opr,"rd"))
				rd(route);
        else
			if(!strcmp(opr,"cd.."))
				cd2();
        else
			if(!strcmp(opr,"cd."))
				cd1();
        else
			if(!strcmp(opr,"creat"))
				filecreat(route);
		else
			if(!strcmp(opr,"delete"))
				filedelete(route);
		else
			if(!strcmp(opr,"open"))
				fileopen(route,"rw");
		else
			if(!strcmp(opr,"close"))
				fileclose(route);
		else
			if(!strcmp(opr,"write"))
				write_file(route);
		else
			if(!strcmp(opr,"read"))
				read_file(route);
		else
		{
			printf("wrong order\n");
			printcdir(oprtype,NULL);
		}

        route=NULL;
		string(opr,route);
	}
    
	fseek(vp,0,0);
	fwrite(buffer,2048/8,1,vp);//写入分区索引
	iput();

	fclose(vp);
	return 0;
}


⌨️ 快捷键说明

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