- #include"stdio.h"
- #include<stdlib.h>
- #include<string.h>
- #include"unistd.h"
- intphysic[100];
- intstyle=1;
- charcur_dir[10]="root";
- structcommand
- {
- charcom[10];
- }cmd[12];
- structblock
- {
- intn;
- intfree[50];
- inta;
- }memory[20449];
- structblock_super
- {
- intn;
- intfree[50];
- intstack[50];
- }super_block;
- structnode
- {
- intfile_style;
- intfile_length;
- intfile_address[100];
- }i_node[640];
- structdir
- {
- charfile_name[10];
- inti_num;
- chardir_name[10];
- }root[640];
- voidformat()
- {
- inti,j,k;
- super_block.n=50;
- for(i=0;i<50;i++)
- {
- super_block.free[i]=i;
- super_block.stack[i]=50+i;
- }
- for(i=0;i<640;i++)
- {
- for(j=0;j<100;j++)
- {
- i_node[i].file_address[j]=-1;
- }
- i_node[i].file_length=-1;
- i_node[i].file_style=-1;
- }
- for(i=0;i<640;i++)
- {
- strcpy(root[i].file_name,"");
- root[i].i_num=-1;
- strcpy(root[i].dir_name,"");
- }
- for(i=0;i<20449;i++)
- {
- memory[i].n=0;
- memory[i].a=0;
- for(j=0;j<50;j++)
- {
- memory[i].free[j]=-1;
- }
- }
- for(i=0;i<20449;i++)
- {
- if((i+1)%50==0)
- {
- k=i+1;
- for(j=0;j<50;j++)
- {
- if(k<20450)
- {
- memory[i].free[j]=k;
- memory[i].n++;
- k++;
- }
- else
- {
- memory[i].free[j]=-1;
- }
- }
- memory[i].a=0;
- continue;
- }
- for(j=0;j<50;j++)
- {
- memory[i].free[j]=-1;
- }
- memory[i].n=0;
- }
- printf("已经初始化完毕\n");
- printf("进入linux文件系统模拟............\n");
- }
- voidwrite_file(FILE*fp)
- {
- inti;
- fp=fopen("system","wb");
- for(i=0;i<20449;i++)
- {
- fwrite(&memory[i],sizeof(structblock),1,fp);
- }
- fwrite(&super_block,sizeof(structblock_super),1,fp);
- for(i=0;i<640;i++)
- {
- fwrite(&i_node[i],sizeof(structnode),1,fp);
- }
- for(i=0;i<640;i++)
- {
- fwrite(&root[i],sizeof(structdir),1,fp);
- }
- fclose(fp);
- }
- voidread_file(FILE*fp)
- {
- inti;
- fp=fopen("system","rb");
- for(i=0;i<20449;i++)
- {
- fread(&memory[i],sizeof(structblock),1,fp);
- }
- fread(&super_block,sizeof(structblock_super),1,fp);
- for(i=0;i<640;i++)
- {
- fread(&i_node[i],sizeof(structnode),1,fp);
- }
- for(i=0;i<640;i++)
- {
- fread(&root[i],sizeof(structdir),1,fp);
- }
- fclose(fp);
- }
- voidcallback(intlength)
- {
- inti,j,k,m,q=0;
- for(i=length-1;i>=0;i--)
- {
- k=physic[i];
- m=49-super_block.n;
- if(super_block.n==50)
- {
- for(j=0;j<50;j++)
- {
- memory[k].free[j]=super_block.free[j];
- }
- super_block.n=0;
- memory[k].n=50;
- }
- memory[k].a=0;
- if(m==-1)
- {
- m=49;
- }
- super_block.free[m]=physic[i];
- super_block.n++;
- }
- }
- voidallot(intlength)
- {
- inti,j,k,m,p;
- for(i=0;i<length;i++)
- {
- k=50-super_block.n;
- m=super_block.free[k];
- p=super_block.free[49];
- if(m==-1||memory[p].a==1)
- {
- printf("内存不足,不能够分配空间\n");
- callback(length);
- break;
- }
- if(super_block.n==1)
- {
- memory[m].a=1;
- physic[i]=m;
- super_block.n=0;
- for(j=0;j<memory[m].n;j++)
- {
- super_block.free[j]=memory[m].free[j];
- super_block.n++;
- }
- continue;
- }
- physic[i]=m;
- memory[m].a=1;
- super_block.n--;
- }
- }
- voidcreate_file(charfilename[],intlength)
- {
- inti,j;
- for(i=0;i<640;i++)
- {
- if(strcmp(filename,root[i].file_name)==0)
- {
- printf("文件已经存在,不允许建立重名的文件\n");
- return;
- }
- }
- for(i=0;i<640;i++)
- {
- if(root[i].i_num==-1)
- {
- root[i].i_num=i;
- strcpy(root[i].file_name,filename);
- strcpy(root[i].dir_name,cur_dir);
- i_node[i].file_style=style;
- i_node[i].file_length=length;
- allot(length);
- for(j=0;j<length;j++)
- {
- i_node[i].file_address[j]=physic[j];
- }
- break;
- }
- }
- }
- voidcreate_dir(charfilename[])
- {
- style=0;
- create_file(filename,4);
- style=1;
- }
- voiddel_file(charfilename[])
- {
- inti,j,k;
- for(i=0;i<640;i++)
- {
- if(strcmp(filename,root[i].file_name)==0)
- {
- k=root[i].i_num;
- for(j=0;j<i_node[k].file_length;j++)
- {
- physic[j]=i_node[k].file_address[j];
- }
- callback(i_node[k].file_length);
- for(j=0;j<100;j++)
- {
- i_node[k].file_address[j]=-1;
- }
- strcpy(root[i].file_name,"");
- root[i].i_num=-1;
- strcpy(root[i].dir_name,"");
- i_node[k].file_length=-1;
- i_node[k].file_style=-1;
- break;
- }
- }
- if(i==640)
- {
- printf("不存在这个文件\n");
- }
- }
- voiddel_dir(charfilename[])
- {
- inti,j,k;
- for(i=0;i<640;i++)
- {
- k=root[i].i_num;
- if(strcmp(root[i].file_name,filename)==0&&strcmp(cur_dir,filename)!=0&&(i_node[k].file_style)==0)
- {
- for(j=0;j<640;j++)
- {
- if(strcmp(filename,root[j].dir_name)==0)
- {
- printf("目录不为空不能直接删除\n");
- break;
- }
- }
- if(j==640)
- {
- del_file(filename);
- break;
- }
- break;
- }
- }
- if(i==640)
- {
- printf("这个不是目录文件或者不存在这个目录,或者你要删除的是当前目录\n");
- }
- }
- voiddisplay_curdir()
- {
- inti,k;
- printf("\t\t文件名字文件类型文件长度所属目录\n");
- for(i=0;i<640;i++)
- {
- if(strcmp(cur_dir,root[i].dir_name)==0)
- {
- k=root[i].i_num;
- printf("\t\t%s\t",root[i].file_name);
- printf("\t%d\t",i_node[k].file_style);
- printf("%d\t",i_node[k].file_length);
- printf("%s\n",root[i].dir_name);
- }
- }
- }
- voiddisplay_dir(charfilename[])
- {
- inti,k;
- for(i=0;i<640;i++)
- {
- k=root[i].i_num;
- if((strcmp(filename,root[i].file_name)==0)&&(i_node[k].file_style==0))
- {
- strcpy(cur_dir,filename);
- break;
- }
- }
- if(i==640)
- {
- printf("没有这个目录\n");
- }
- }
- voidopen_file(charfilename[])
- {
- inti,j,k;
- printf("\t\t文件名字文件类型文件长度所属目录\n");
- for(i=0;i<640;i++)
- {
- k=root[i].i_num;
- if(strcmp(filename,root[i].file_name)==0&&(i_node[k].file_style==1))
- {
- printf("\t\t%s\t",root[i].file_name);
- printf("\t%d\t",i_node[k].file_style);
- printf("%d\t",i_node[k].file_length);
- printf("%s\n",root[i].dir_name);
- printf("\t\t文件占用的物理地址\n");
- for(j=0;j<i_node[k].file_length;j++)
- {
- printf("%d",i_node[k].file_address[j]);
- }
- printf("\n");
- break;
- }
- }
- if(i==640)
- {
- printf("没有这个文件或者这个文件不是正规文件\n");
- }
- }
- voidback_dir()
- {
- inti,k;
- for(i=0;i<640;i++)
- {
- k=root[i].i_num;
- if(strcmp(cur_dir,root[i].file_name)==0&&(i_node[k].file_style==0))
- {
- strcpy(cur_dir,root[i].dir_name);
- }
- }
- }
- voiddisplay_sys()
- {
- inti,m,k=0;
- for(i=0;i<20449;i++)
- {
- if(memory[i].a==0)
- k++;
- }
- m=20449-k;
- printf("空闲的盘块数是:\t");
- printf("%d\n",k);
- printf("使用的盘块数是:\t");
- printf("%d\n",m);
- }
- voidhelp()
- {
- printf("注意:创建的文件长度<100\n\n");
- printf("0.初始化-------------------------format\n");
- printf("1.查看当前目录文件列表-----------dir\n");
- printf("2.创建文件---------------------create-----(create+空格+文件名+文件长度)\n");
- printf("3.打开文件-----------------------cat-----(cat+空格+文件名)\n");
- printf("4.删除文件-----------------------del-----(del+空格+文件名)\n");
- printf("5.创建目录-----------------------md------(md+空格+目录名)\n");
- printf("6.删除目录-----------------------deldir--(del+空格+目录名)\n");
- printf("7.进入当前目录下的指定目录-------cd--------(cd+空格+目录名)\n");
- printf("8.返回上一级目录-----------------cd..\n");
- printf("9.查看系统信息-------------------ls\n");
- printf("10.显示帮助命令-----------------help\n");
- printf("11.退出文件模拟------------------exit\n");
- }
- voidmain()
- {
- chartmp[10],com[10],tmp1[10],k;
- structcommandtmp2[10];
- inti,j=0,p,len=0;
- FILE*fp;
- help();
- strcpy(cmd[0].com,"format");
- strcpy(cmd[1].com,"dir");
- strcpy(cmd[2].com,"cat");
- strcpy(cmd[3].com,"ls");
- strcpy(cmd[4].com,"md");
- strcpy(cmd[5].com,"create");
- strcpy(cmd[6].com,"del");
- strcpy(cmd[7].com,"deldir");
- strcpy(cmd[8].com,"cd");
- strcpy(cmd[9].com,"cd..");
- strcpy(cmd[10].com,"help");
- strcpy(cmd[11].com,"exit");
- if((fp=fopen("system","rb"))==NULL)
- {
- printf("cannotopenfile\n");
- printf("formatthediskY/N\n");
- scanf("%c",&k);
- if(k=='y')
- format();
- }
- else
- {
- read_file(fp);
- }
- while(1)
- {
- j=0;
- strcpy(tmp,cur_dir);
- while(strcmp(tmp,"root")!=0)
- {
- for(i=0;i<640;i++)
- {
- p=root[i].i_num;
- if(strcmp(tmp,root[i].file_name)==0&&(i_node[p].file_style==0))
- {
- strcpy(tmp2[j].com,tmp);
- j++;
- strcpy(tmp,root[i].dir_name);
- }
- }
- }
- strcpy(tmp2[j].com,tmp);
- for(i=j;i>=0;i--)
- {
- printf("%s/",tmp2[i].com);
- }
- scanf("%s",com);
- for(i=0;i<12;i++)
- {
- if(strcmp(com,cmd[i].com)==0)
- {
- p=i;
- break;
- }
- }
- if(i==12)
- {
- p=13;
- }
- switch(p)
- {
- case0:format();
- break;
- case1:display_curdir();
- break;
- case2:scanf("%s",tmp);
- open_file(tmp);
- break;
- case3:display_sys();
- break;
- case4:scanf("%s",tmp);
- create_dir(tmp);
- break;
- case5:scanf("%s",tmp);
- scanf("%d",&len);
- create_file(tmp,len);
- break;
- case6:scanf("%s",tmp);
- for(i=0;i<640;i++)
- {
- j=root[i].i_num;
- if(strcmp(tmp,root[i].file_name)==0&&(i_node[j].file_style)==1)
- {
- del_file(tmp);
- break;
- }
- }
- if(i==640)
- {
- printf("这个不是正规文件文件\n");
- }
- break;
- case7:
- scanf("%s",tmp);
- del_dir(tmp);
- break;
- case8:scanf("%s",tmp1);
- display_dir(tmp1);
- break;
- case9:back_dir();
- break;
- case10:help();
- break;
- case11:write_file(fp);
- return;
- default:printf("没有这个命令\n");
- break;
- }
- }
- }