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