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

📄 os.cpp

📁 设计并实现一个多用户多级目录结构的文件系统
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	int i;
	fseek(vp,BSIZE*u->u_cdir->f_blkno+DSIZE*u->u_cdir->f_number,0);
	
	for(i=0;i<8;i++)
		dir_struct->d_add[i]=(unsigned short)u->u_cdir->f_add[i];
	
	dir_struct->d_fsize=(unsigned short)u->u_cdir->f_fsize;
    dir_struct->d_gid=u->u_cdir->f_gid;
    dir_struct->d_mode=u->u_cdir->f_mode;
    for(i=0;i<8;i++)
		dir_struct->d_name[i]=u->u_cdir->f_name[i];
    dir_struct->d_uid=u->u_cdir->f_uid;
	fwrite(dir_struct,DSIZE,1,vp);
 
	
	fp--;
	if(fp==fcb)
	{
		u->u_cdir=fp;
		fp++;
	}
	else
	{
		fp--;
		u->u_cdir=fp;
		fp++;
	}
	fp->f_mode=0;
	for(i=0;i<8;i++)
		if(fp->f_add[i])
			fp->f_add[i]=0;
}

//---------------------------------------
//第三层
/*(3) 打开文件管理层。功能为涉及 ofile 结构的操作,设下列主要函数:
     openf() ─ 为打开文件建立对应的ofile结构的函数
     closef() ─ 为关闭文件建立对应的ofile结构的函数*/
//---------------------------------------

void openf(char *fname,int type)
{
	int i;
	namei(fname);
	iget();
	u->u_cdir->f_flag=type;
	for(i=0;i<FILES;i++)
		if(u->u_ofile[i]==NULL)
		{
			u->u_ofile[i]->o_fcbp=u->u_cdir;
			u->u_ofile[i]->o_count++;
			return;
		}
	
	if(i==FILES)
		printf("more files are opened, you should close one of them\n");
	iput();
}

void closef(char *fname)
{
	iput();
	for(int i=0;i<FILENO;i++)
		if (strcmp(u->u_ofile[i]->o_fcbp->f_name,fname))
		{
			u->u_ofile[i]->o_count--;
			u->u_ofile[i]=NULL;
			return;
		}
}

//------------------------------------------------------
//第四层
/* (4) 命令解释层。功能为接受来自用户的命令,并解释、执行用户提出的文件
访问操作。按系统的功能要求,可以设置一系列的函数,如 fcreat()、fopen( )、
fread()、fwrite()和 fclose() 等。*/
//------------------------------------------------------

void dir(char *route)
{
	int oprtype=DIR,i,j,num,tag=0;
	if(u->u_cdir->f_mode!=IFDIR)
	{
		printf("you are operating on a file!\n");
		return;
	}
	
	if(route!=NULL)
	{
		namei(route);
	    if(u->u_error==NOTFOUND)
		{ 
	    	printf("impossible route\n");
	    	u->u_error=NOERROR;
	    	printcdir(oprtype,NULL);
	    	return;
		}
		tag=1;
	}
	
	
	printf("[.]\n[..]\n");
	for(i=0;i<8;i++)
	{
		for(j=0;j<16;j++)
		{
			fseek(vp,u->u_cdir->f_add[i]*BSIZE+DSIZE*j,0);
			fread(dir_struct,DSIZE,1,vp);
			
			if(dir_struct->d_mode==0)
            {
				printf("\n");
				printcdir(oprtype,NULL);
				if(tag)
				{
                     fp->f_mode=0;
					 u->u_cdir=fp-1;
				}
				return;//已经列完该目录下的文件
			}
			
			if(dir_struct->d_mode==EMPTY)
				continue;

			if(dir_struct->d_mode==IFDIR)
			{
				printf("[");
			    for(num=0;dir_struct->d_name[num]!='\0';num++)
				    	printf("%c",dir_struct->d_name[num]);
				printf("]");
				printf("\n");
			}
			
			if(dir_struct->d_mode==IFREG)
			{
				for(num=0;dir_struct->d_name[num]!='\0';num++)
				   	printf("%c",dir_struct->d_name[num]);
				printf("\n");
			}
		}
	}

}

void md(char *route)
{
	
	int oprtype=MD,i,j,k;

	if(route==NULL)
	{
		printf("dir name missing\n");
        printcdir(oprtype,NULL);
		return;
	}
	
	for(i=0;i<8;i++)
		for(j=0;j<16;j++)
		{
			fseek(vp,u->u_cdir->f_add[i]*BSIZE+DSIZE*j,0);
			fread(dir_struct,DSIZE,1,vp);
			
			if(dir_struct->d_mode==IFDIR)
				if(!strcmp(dir_struct->d_name,route))
				{
					printf("文件夹重名\n");					 
    				printcdir(oprtype,NULL);
					return;
				}
		}	
	
	for(i=0;i<8;i++)
	{
		
		if(u->u_cdir->f_add[i]==0)	
			u->u_cdir->f_add[i]=balloc();
		
		for(j=0;j<16;j++)
		{			
			block=u->u_cdir->f_add[i];
			blk_offset=j;
			fseek(vp,block*BSIZE+blk_offset*DSIZE,0);
			iget();

			if(u->u_cdir->f_mode==IFREG||u->u_cdir->f_mode==IFDIR)
			{
				iput();
				continue;
			}

			
		    if(u->u_cdir->f_mode==0||u->u_cdir->f_mode==EMPTY)
			{
				for(k=0;k<8;k++)
					u->u_cdir->f_add[k]=0;
				u->u_cdir->f_fsize=0;
		    	u->u_cdir->f_gid=u->u_gid;
			    u->u_cdir->f_uid=u->u_uid;
    			u->u_cdir->f_mode=IFDIR;
				u->u_cdir->f_fsize=0;
				u->u_cdir->f_blkno=(u->u_cdir-1)->f_add[i];
				u->u_cdir->f_number=j;
	    		for(k=0;k<8;k++)
				{
					if(route[k]!='\0')
						u->u_cdir->f_name[k]=route[k];
					else 
						u->u_cdir->f_name[k]='\0';
				}
			    iput();
                
				u->u_cdir->f_fsize++;
                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);
				return;
			}
		}
	}
}


void rdwholedir();
void rd(char *route)
{

	FILE *f=vp;
	int oprtype=RD,j,i,bk=0,number;

	if(route==NULL)
	{		
		rdwholedir();
		
		u->u_cdir->f_fsize=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);
		return;
	}
	
    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!=IFDIR)
			{
				if(u->u_cdir->f_mode==IFREG)
					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 dir name\n\n");
	    printcdir(oprtype,NULL);
		return;
	}
	
	rdwholedir();
	number--;
	u->u_cdir->f_mode=EMPTY;
	iput();	
	
    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 rdwholedir()
{
    int t,i,j;
	for(i=0;i<8;i++)
	   if(u->u_cdir->f_add[i])
		   for(j=0;j<16;j++)
		   {
               block=u->u_cdir->f_add[i];
			   blk_offset=j;
		       fseek(vp,block*BSIZE+blk_offset*DSIZE,0);
			   iget();

               if(u->u_cdir->f_mode==EMPTY||u->u_cdir->f_mode==0)
			   {
				   iput();
				   continue;
			   }

			   if(u->u_cdir->f_mode==IFDIR)
			   {
				   rdwholedir();
				   u->u_cdir->f_mode=EMPTY;
				   iput();
				   continue;
			   }
				   
			   if(u->u_cdir->f_mode==IFREG)
			   {
				   for(t=0;t<8;t++)
					   if(u->u_cdir->f_add[t])
					   {
						   brelse(u->u_cdir->f_add[t]);
						   u->u_cdir->f_add[t]=0;
					   }
					u->u_cdir->f_mode=EMPTY;
					iput();
					continue;
			   }
		   }
	   else break;
	for(t=0;t<8;t++)
		if(u->u_cdir->f_add[t])
		{			
			brelse(u->u_cdir->f_add[t]);
			u->u_cdir->f_add[t]=0;
		}
}



void cd(char *route) //路径
{
	int oprtype=DIR,i;	
    
	if(route==NULL)
	{
		printf("need route\n");
		
		printcdir(oprtype,NULL);
		return;
	}
	
	for(i=0;i<8;i++)
	{
		for(int j=0;j<16;j++)
		{
			fseek(vp,u->u_cdir->f_add[i]*BSIZE+DSIZE*j,0);
			fread(dir_struct,DSIZE,1,vp);

			if(dir_struct->d_mode==IFREG)
				continue;

			if(dir_struct->d_mode==0)
				break;

			if(!strcmp(dir_struct->d_name,route))
			{
     			
				fseek(vp,u->u_cdir->f_add[i]*BSIZE+DSIZE*j,0);
				block=u->u_cdir->f_add[i];
				blk_offset=j;
				iget();
      
				oprtype=CD;
				printf("\n");
				printcdir(oprtype,route);
				return;
			}
		}
	}
	
	printf("error route\n\n");
    
	oprtype=DIR;
	printcdir(oprtype,NULL);
	
  	cdirstruct();
}

void cd2()
{
	int oprtype=CD2;
	for(int k=1;k<16;k++)
		if(fcb[k].f_mode)
		{
			u->u_cdir=fcb+k;
			iput();
		}
	u->u_cdir=fcb;
	fp=fcb+1;
	printcdir(oprtype,NULL);
}

void cd1()
{
	int oprtype=CD1;
	printcdir(oprtype,NULL);

	iput();
}

//----------------------------------------------
//对文件的操作
//----------------------------------------------
int filecreat(char *route)
{
	int oprtype=MD,i,j,k;
	
	if(route==NULL)
	{
		printf("file name missing\n");
        printcdir(oprtype,NULL);
		return 0;
	}
	
	for(i=0;i<8;i++)
		for(j=0;j<16;j++)
		{
			fseek(vp,u->u_cdir->f_add[i]*BSIZE+DSIZE*j,0);
			fread(dir_struct,DSIZE,1,vp);
			
			if(dir_struct->d_mode==IFREG)
				if(!strcmp(dir_struct->d_name,route))
				{
					printf("文件重名\n");					 
    				printcdir(oprtype,NULL);
					return 0;
				}
		}	
	
	for(i=0;i<8;i++)
	{
		
		if(u->u_cdir->f_add[i]==0)	
			u->u_cdir->f_add[i]=balloc();
		
		for(j=0;j<16;j++)
		{			
			block=u->u_cdir->f_add[i];
			blk_offset=j;
			fseek(vp,block*BSIZE+blk_offset*DSIZE,0);
			iget();

			if(u->u_cdir->f_mode==IFREG||u->u_cdir->f_mode==IFDIR)
			{
				iput();
				continue;
			}

			
		    if(u->u_cdir->f_mode==0||u->u_cdir->f_mode==EMPTY)
			{
				for(k=0;k<8;k++)
					u->u_cdir->f_add[k]=0;
				u->u_cdir->f_fsize=0;
		    	u->u_cdir->f_gid=u->u_gid;
			    u->u_cdir->f_uid=u->u_uid;
    			u->u_cdir->f_mode=IFREG;
				u->u_cdir->f_fsize=0;
				u->u_cdir->f_blkno=(u->u_cdir-1)->f_add[i];
				u->u_cdir->f_number=j;
	    		for(k=0;k<8;k++)
				{
					if(route[k]!='\0')
						u->u_cdir->f_name[k]=route[k];
					else 
						u->u_cdir->f_name[k]='\0';
				}
			    iput();
                
				u->u_cdir->f_fsize++;
                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);
				return 1;
			}
		}
	}
    return 0;
}


char *cur_file;
FILE *fileopen(char *route,char *opentype)
{
	int oprtype=RD,i,j,t,p,bk=0;
	    
	if(opentype==NULL)
	{
		printf("need file's open type\nn");
		printcdir(oprtype,NULL);
		return NULL;
	}

	for(i=0;i<8;i++)
	{
		for(j=0;j<16;j++)
		{
			fseek(vp,u->u_cdir->f_add[i]*BSIZE+j*DSIZE,0);			
			fread(dir_struct,DSIZE,1,vp);
						
			if(!strcmp(dir_struct->d_name,route))
			{
				block=u->u_cdir->f_add[i];
				blk_offset=j;
				bk=1;
				break;
			}
			else 
				continue;
		}
		if(bk)break;
	}

	if(i==8)
	{
		printf("impossible file name\n");
	    printcdir(oprtype,NULL);
		return NULL;
	}
   
	for(i=0;i<5;i++)
		if(u->u_ofile[i]!=NULL)

⌨️ 快捷键说明

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