📄 os.cpp
字号:
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 + -