二级文件系统
请简述 linux 中的文件系统层次结构

请简述 linux 中的文件系统层次结构
Linux系统的文件系统层次结构是非常复杂的,通常可以分成如下几个层次:
1. 根目录:根目录是 Linux 文件系统中最顶层的根目录,它可以看做是 Linux 系统整个文件系统的根,其它所有的子目录都在它之下,一般用 '/' 表示。
2. 二级目录:包括 '/etc'、'/usr'、'/bin'、'/sbin'、'/lib' 等,这些目录又可以看做是四级目录的父目录,下面可以放置用户自定义的文件和文件夹。
3. 四级目录:这里可以放置用户自定义的应用程序,一般都是以某个子目录名开头,比如 '/usr/local','/usr/bin'、'/usr/sbin'等。
4. 程序文件:可以放置各种程序文件,包括可执行文件、库文件、配置文件等。
5. 日志文件:记录系统的运行日志,以及用户行为日志,用于排查故障。
6. 数据文件:用户可以将各种数据文件存放在用户指定的目录下。
总之,Linux系统的文件系统层次结构比较复杂,它们可以根据用户需求和功能进行多层次的划分,以满足用户的不同需求。
操作系统课程设计二级文件系统

操作系统课程设计报告专业:计算机信息处理学号:08201328姓名:杨馨雨提交日期:2011-7-14【设计目的】1.课程设计目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。
2.结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。
3.通过对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力【设计内容】1、delete删除文件2、open打开文件3、close关闭文件4、write写文件【实验环境】Windows7系统Visualstudio2010【相关知识综述】本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。
另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。
首先应确定文件系统的数据结构:主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
用户创建的文件,可以编号存储于磁盘上。
如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。
【设计思路】1主要数据结构#define MAXNAME25/*thelargestlengthofmfdname,ufdname,filename*/#define MAXCHILD50/*thelargestchild每个用户名下最多有50个文件*/#define MAX(MAXCHILD*MAXCHILD)/*thesizeoffpaddrno*/typedefstruct/*thestructureofOSFILE定义主文件*/{int fpaddr;/*filephysicaladdress*/int flength;/*filelength*/int fmode;/*filemode:0-ReadOnly;1-WriteOnly;2-ReadandWrite;3-Protect;*/char fname[MAXNAME];/*filename*/}OSFILE;typedefstruct/*thestructureofOSUFD定义用户文件目录*/{char ufdname[MAXNAME];/*ufdname*/OSFILEufdfile[MAXCHILD];/*ufdownfile*/}OSUFD;typedefstruct/*thestructureofOSUFD'LOGIN定义登陆*/{char ufdname[MAXNAME];/*ufdname*/char ufdpword[8];/*ufdpassword*/}OSUFD_LOGIN;typedefstruct/*fileopenmode定义操作方式*/{int ifopen;/*ifopen:0-close,1-open*/int openmode;/*0-readonly,1-writeonly,2-readandwrite,3-initial*/}OSUFD_OPENMODE;2主要函数void LoginF();/*LOGINFileSystem*/void DirF();/*DirFileSystem*/void CreateF();/*CreateFile*/void DeleteF();/*DeleteFile*/void ModifyFM();/*ModifyFileMode*/void OpenF();/*OpenFile*/void CloseF();/*CloseFile*/void ReadF();/*ReadFile*/void WriteF();/*WriteFile*/void QuitF();/*QuitFileSystem*/void CdF();/*ChangeDir*/void help();【主要程序段】1Delete函数voidDeleteF()/*DeleteFile*/{charfname[MAXNAME],str[50],str1[50];inti,k,j;intfpaddrno1;if(strcmp(strupr(ltrim(rtrim(dirname))),"")==0)/*无法删除主目录的文件*/{printf("\.\n");wgetchar=1;}if(strcmp(strupr(dirname),strupr(username))!=0)/*无法删除非自己目录的文件*/{printf("\.\n");wgetchar=1;}else{printf("\nPleaseinputFileName:");gets(fname);fopen==1)/*文件打开时无法删除*/{printf("\nError.\'%s\'.\n",fname);wgetchar=1;}else{if(ufd[k]->ufdfile[i].fmode==3)/*被保护的文件无法删除*/{printf("\nError.\'%s\'.\n",fname);wgetchar=1;}else{fpaddrno1=ufd[k]->ufdfile[i].fpaddr;xt");remove(str);n",fname);wgetchar=1;}}}else'%s\'dosenotexist.\n",fname);wgetchar=1;}}}2Open函数voidOpenF()/*OpenFile*/{charfname[MAXNAME];inti,k,j;if(strcmp(strupr(dirname),strupr(username))!=0)/*在自己的目录里才能打开*/{printf("\.\n");wgetchar=1;}else{k=ExistD(username);for(j=0;j<fcount[k];j++){printf("%15s",ufd[k]->ufdfile[j].fname);}printf("\nPleaseinputFileName:");gets(fname);fopen==1)'%s\'isinopenstatus.\n",fname);wgetchar=1;}else{ifopen[k][i].ifopen=1;mode==0)/*根据文件的模式设置打开模式*/{ifopen[k][i].openmode=0;}elseif(ufd[k]->ufdfile[i].fmode==1){ifopen[k][i].openmode=1;}elseif(ufd[k]->ufdfile[i].fmode==2){ifopen[k][i].openmode=2;}elseifopen[k][i].openmode=3;printf("\n\'%s\'isopenedsuccessfully\n",fname);wgetchar=1;}}else'%s\'dosenotexist.\n",fname);wgetchar=1;}}}3Close函数voidCloseF()/*CloseFile*/{charfname[MAXNAME];inti,k,j;if(strcmp(strupr(dirname),strupr(username))!=0)/*不在自己的目录里没法进行*/{printf("\.\n");wgetchar=1;}else{k=ExistD(username);for(j=0;j<fcount[k];j++)/*列出已经打开的文件*/ {if(ifopen[k][j].ifopen==1)name);}printf("\nPleaseinputFileName:");gets(fname);fopen=0;/*关闭文件*/printf("\n\'%s\'closedsuccessfully\n",fname);wgetchar=1;}else'%s\'dosenotexist.\n",fname);wgetchar=1;}}}4Write函数voidWriteF()/*WriteFile*/{inti,k,n=0;intlength;charfname[MAXNAME],values[1000];charstr[255],str1[255],c;if(strcmp(strupr(ltrim(rtrim(dirname))),"")==0)n");wgetchar=1;return;}printf("\nCaution:Openfilefirst\n");printf("OpenedFile(s)List:\n");k=ExistD(dirname);fopen==1)name);n++;}if((n%4==0)&&(n!=0))printf("\n");}printf("\n%dfilesopenned.\n",n);if(n==0)wgetchar=1;fopen==1)penmode==1)||(ifopen[k][i].o penmode==2))paddr,str,10);xt");fp_file=fopen(str,"ab");length=ufd[k]->ufdfile[i].flengt h+length;n",ufd[k]->ufdfile[i].flength);printf("\n\nYouhavewritefilesuccessfully!!");fclose(fp_file);wgetchar=0;}elseif(ifopen[k][i].openmode==0)'%s\'\'twrite.\n",fname) ;wgetchar=1;}else'%s\'\'twrite.\n",fname);wgetchar=1;}}else'%s\'\n",fname);wgetchar=1;}}else'%s\'doesnotexist.\n",fname);wgetchar=1;}}}【程序流程设计】1总的功能结构图:2部分子模块程序流程图(1)打开命令的程序流程图:(2)关闭命令的程序流程图:(3)写命令的程序流程图:(4)删除命令的程序流程图:【测试结果】1删除文件2打开的文件不能删除3打开文件,其中已经打开的文件不能再次打开3关闭文件4写文件,其中只有打开了文件才能写入5写文件6只读文件和保护文件不能写入7其他函数【参考文献】计算机操作系统,西安电子科技大学出版社,方敏主编, 【源程序清单】#include""#include""#include""#include""#define MAXNAME25/*thelargestlengthofmfdname,ufdname,filename*/#define MAXCHILD50/*thelargestchild每个用户名下最多有50个文件*/#define MAX(MAXCHILD*MAXCHILD)/*thesizeoffpaddrno*/typedefstruct/*thestructureofOSFILE定义主文件*/{int fpaddr;/*filephysicaladdress*/int flength;/*filelength*/int fmode;/*filemode:0-ReadOnly;1-WriteOnly;2-ReadandWrite;3-Protect;*/ char fname[MAXNAME];/*filename*/}OSFILE;typedefstruct/*thestructureofOSUFD定义用户文件目录*/{char ufdname[MAXNAME];/*ufdname*/OSFILEufdfile[MAXCHILD];/*ufdownfile*/}OSUFD;typedefstruct/*thestructureofOSUFD'LOGIN定义登陆*/char ufdname[MAXNAME];/*ufdname*/char ufdpword[8];/*ufdpassword*/}OSUFD_LOGIN;typedefstruct/*fileopenmode定义操作方式*/{int ifopen;/*ifopen:0-close,1-open*/int openmode;/*0-readonly,1-writeonly,2-readandwrite,3-protect*/}OSUFD_OPENMODE;void LoginF();/*LOGINFileSystem*/void DirF();/*DirFileSystem*/void CreateF();/*CreateFile*/void DeleteF();/*DeleteFile*/void ModifyFM();/*ModifyFileMode*/void OpenF();/*OpenFile*/void CloseF();/*CloseFile*/void ReadF();/*ReadFile*/void WriteF();/*WriteFile*/void QuitF();/*QuitFileSystem*/void CdF();/*ChangeDir*/void help();char*rtrim(char*str);/*removethetrailingblanks.*/char*ltrim(char*str);/*removetheheadingblanks.*/void InputPW(char*password);/*inputpassword,use'*'replace*/int ExistD(char*dirname);/*WhetherDirNameExist,Exist-i,NotExist-0*/int WriteF1();/*writefile*/int ExistF(char*filename);/*WhetherFileNameExist,Exist-i,NotExist-0*/void SetPANo(int RorW);/*Setphysicaladdressnum*/int FindPANo();/*findoutphysicaladdressnum*/int ucount=0;/*thecountofmfd'sufds用户数*/int fcount[MAXCHILD];/*thecountofufd'sfiles子文件数*/int loginsuc=0;/*whetherloginsuccessfully登陆成功*/char username[MAXNAME];/*recordloginuser'sname22用户名*/char dirname[MAXNAME];/*recordcurrentdirectory使用的用户目录*/int fpaddrno[MAX];/*recordfilephysicaladdressnum物理地址号,存放自己所创建的所有文件的地址*/int wgetchar;/*whethergetchar()*/OSUFD*ufd[MAXCHILD];/*ufdandufdownfiles*/OSUFD_LOGINufd_lp;;QuitF();exit(0);break;case10:clrscr();choiceend=1;break;case11:CdF();choiceend=1;break;;}char*rtrim(char*str)/*removethetrailingblanks.去掉登陆用户名的尾空格*/int n=strlen(str)-1;while(n>=0){if(*(str+n)!=''){*(str+n+1)='\0';break;}else n--;}if(n<0)str[0]='\0';return str;}char*ltrim(char*str)/*removetheheadingblanks.去掉登陆用户名的头空格*/ {strrev(str);name),strupr(filename))==0){exist=1;break;}if(exist)return(i);elsereturn(-1);}int FindPANo()/*findoutphysicaladdressnum*/{int i;for(i=0;i<MAX;i++)if(fpaddrno[i]==0){fpaddrno[i]=1;break;}if(i<MAX)return(i);elsereturn(-1);}int WriteF1()/*writefile*/{int length=0;char c;printf("Pleaseinputtext(\'#\'standsforend):\n");while((c=getchar())!='#'){fprintf(fp_file,"%c",c);if(c!='\n')length++;}fprintf(fp_file,"\n");fclose(fp_file);return(length);}void LoginF()/*LOGINFileSystem登陆函数*/{char loginame[MAXNAME],loginpw[9],logincpw[9],str[50];xt");ufd[j]=(OSUFD*)malloc(sizeof(OSUFD));fopen=0;ifopen[j][i].openmode=4;}fclose(fp_ufd);}fclose(fp_mfd);ucount=j;SetPANo(0);printf("\n\nLoginsuccessful!WelcometothisFileSystem\n\n");loginsuc=1;return;}else xt");if((fp_ufd=fopen(str,"rb"))==NULL){fp_ufd=fopen(str,"wb");fclose(fp_ufd);}fp_mfd=fopen("d:\\osfile\\","rb");for(j=0;fread(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd)!=0;j++){strcpy(str,"d:\\osfile\\");strcat(str,;strcat(str,".txt");ufd[j]=(OSUFD*)malloc(sizeof(OSUFD));strcpy(ufd[j]->ufdname,strupr);fp_ufd=fopen(str,"rb");for(i=0;fread(&ufd[j]->ufdfile[i],sizeof(OSFILE),1,fp_ufd)!=0;i++,fcount[j]++)fopen =0;ifopen[j][i].openmode=4;}fclose(fp_ufd);}fclose(fp_mfd);ucount=j;SetPANo(0);printf("\n\nLoginSuccessful!WelcometothisSystem\n\n");loginsuc=1;return;}else");getch();clrscr();printf("\n%14s%16s%14s%10s%18s\n","FileName","FileAddress","FileLength","Type","Fil eMode");}itoa(ufd[j]->ufdfile[i].fpaddr,str,10);mode==0)strcpy(sfmode,"ReadOnly");elseif(ufd[j]->ufdfile[i].fmode==1)strcpy(sfmode,"WriteOnly");elseif(ufd[j]->ufdfile[i].fmode==2)strcpy(sfmode,"ReadAndWrite");else strcpy(sfmode,"Protect");printf("%14s%16s%14d%10s%18s\n",ufd[j]->ufdfile[i].fname,sfpaddr,ufd[j]->ufdfile[i] .flength,"<FILE>",sfmode);}printf("\n%3dfile(s)\n",fcount[j]);}else.");getch();clrscr();printf("\n%14s%18s%8s\n","DirName","OwnFileCount","Type");}printf("%14s%18d%8s\n",ufd[i]->ufdname,fcount[i],"<UFD>");count=count+fcount[i];}printf("\n%3ddir(s),%5dfile(s)\n",ucount,count);}}void CreateF()/*CreateFile*/{int fpaddrno,flag=1,i;char fname[MAXNAME],str[50],str1[50],a[25];char fmode[25];if(strcmp(strupr(dirname),strupr(username))!=0)n");wgetchar=1;}else{printf("\nPleaseinputFileName:");gets(fname);ltrim(rtrim(fname));if(ExistF(fname)>=0){printf("\\'%s\'hasalreadyexisted.\n",fname);wgetchar=1;}else{printf("PleaseinputFileMode(0-ReadOnly,1-WriteOnly,2-ReadandWrite,3-Protect):");gets(fmode);ltrim(rtrim(fmode));if((strcmp(fmode,"0")==0)||(strcmp(fmode,"1")==0)||(strcmp(fmode,"2")==0)||(strcmp( fmode,"3")==0)){fpaddrno=FindPANo();if(fpaddrno>=0)name,fname);paddr=fpaddrno;ufd[i]->ufdfile[fcount[i]].fmode=atoi(fmode);ifopen[i][fcount[i]].ifopen=0;ifopen[i][fcount[i]].openmode=4;strcpy(str,"d:\\osfile\\file\\file");itoa(fpaddrno,str1,10);strcat(str,str1);strcat(str,".txt");fp_file=fopen(str,"wb");fclose(fp_file);fcount[i]++;while(flag){printf("Inputtextnow(Y/N):");gets(a);ltrim(rtrim(a));ufd[i]->ufdfile[fcount[i]-1].flength=0;if(strcmp(strupr(a),"Y")==0){fp_file=fopen(str,"wb+");length=WriteF1();flag=0;}elseif(strcmp(strupr(a),"N")==0){flag=0;wgetchar=1;}}printf("\n\'%s\'hasbeencreatedsuccessfully!\n",fname);}else{printf("\nFail!.\n");wgetchar=1;}}else{printf("\\'sRangeis0-3\n");wgetchar=1;}}}}void DeleteF()/*DeleteFile*/{char fname[MAXNAME],str[50],str1[50];int i,k,j;int fpaddrno1;if(strcmp(strupr(ltrim(rtrim(dirname))),"")==0)/*无法删除主目录的文件*/{printf("\.\n");wgetchar=1;}if(strcmp(strupr(dirname),strupr(username))!=0)/*无法删除非自己目录的文件*/ {printf("\.\n");wgetchar=1;}else{printf("\nPleaseinputFileName:");gets(fname);fopen==1)/*文件打开时无法删除*/{printf("\nError.\'%s\'.\n",fname);wgetchar=1;}else{if(ufd[k]->ufdfile[i].fmode==3)/*被保护的文件无法删除*/{printf("\nError.\'%s\'.\n",fname);wgetchar=1;}else{fpaddrno1=ufd[k]->ufdfile[i].fpaddr;xt");remove(str);n",fname);wgetchar=1;}}}else'%s\'dosenotexist.\n",fname);wgetchar=1;}}}void ModifyFM()/*ModifyFileMode*/{char fname[MAXNAME],str[50];int i,k;char fmode[25];/*whetherdelete*/if(strcmp(strupr(dirname),strupr(username))!=0){printf("\.\n");wgetchar=1;}else{printf("\nPleaseinputFileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if(i>=0){k=ExistD(username);if(ifopen[k][i].ifopen==1){printf("\nError.\'%s\'.\n",fname);wgetchar=1;}else{if(ufd[k]->ufdfile[i].fmode==0)strcpy(str,"readonly");/*FileMode*/elseif(ufd[k]->ufdfile[i].fmode==1)strcpy(str,"writeonly");elseif(ufd[k]->ufdfile[i].fmode==2)strcpy(str,"readandwrite");else strcpy(str,"Protect");printf("\'%s\'filemodeis%s.\n",fname,strupr(str));printf("Modifyto(0-readonly,1-writeonly,2-readandwrite,3-Protect):");gets(fmode);ltrim(rtrim(fmode));if(strcmp(fmode,"0")==0){ufd[k]->ufdfile[i].fmode=0;printf("\n\'%s\'hasbeenmodifiedtoREADONLYmodesuccessfully.\n",fname);wgetchar=1;}elseif(strcmp(fmode,"1")==0){ufd[k]->ufdfile[i].fmode=1;printf("\n\'%s\'hasbeenmodifiedtoWRITEONLYmodesuccessfully.\n",fname);wgetchar=1;}elseif(strcmp(fmode,"2")==0){ufd[k]->ufdfile[i].fmode=2;printf("\n\'%s\'hasbeenmodifiedtoREADANDWRITEmodesuccessfully.\n",fname);wgetchar=1;}elseif(strcmp(fmode,"3")==0){ufd[k]->ufdfile[i].fmode=3;printf("\n\'%s\'hasbeenmodifiedtoFORBIDmodesuccessfully.\n",fname);wgetchar=1;}else{printf("\nError.\'%s\'isnotmodified.\n",fname);wgetchar=1;}}}else{printf("\nError.\'%s\'dosenotexist.\n",fname);wgetchar=1;}}}void OpenF()/*OpenFile*/{char fname[MAXNAME];int i,k,j;if(strcmp(strupr(dirname),strupr(username))!=0)/*在自己的目录里才能打开*/ {printf("\.\n");wgetchar=1;}else{k=ExistD(username);for(j=0;j<fcount[k];j++){printf("%15s",ufd[k]->ufdfile[j].fname);}printf("\nPleaseinputFileName:");gets(fname);fopen==1)'%s\'isinopenstatus.\n",fname);wgetchar=1;}else{ifopen[k][i].ifopen=1;mode==0)/*根据文件的模式设置打开模式*/{ifopen[k][i].openmode=0;}elseif(ufd[k]->ufdfile[i].fmode==1){ifopen[k][i].openmode=1;}elseif(ufd[k]->ufdfile[i].fmode==2){ifopen[k][i].openmode=2;}else ifopen[k][i].openmode=3;printf("\n\'%s\'isopenedsuccessfully\n",fname);wgetchar=1;}}else'%s\'dosenotexist.\n",fname);wgetchar=1;}}}void CloseF()/*CloseFile*/{char fname[MAXNAME];int i,k,j;if(strcmp(strupr(dirname),strupr(username))!=0)/*不在自己的目录里没法进行*/ {printf("\.\n");wgetchar=1;}else{k=ExistD(username);for(j=0;j<fcount[k];j++)/*列出已经打开的文件*/{if(ifopen[k][j].ifopen==1)name);}printf("\nPleaseinputFileName:");gets(fname);fopen=0;'%s\'dosenotexist.\n",fname);wgetchar=1;}}}void ReadF()/*ReadFile*/{int i,k,n=0;char fname[MAXNAME];char str[255],str1[255],c;if(strcmp(strupr(ltrim(rtrim(dirname))),"")==0)n");wgetchar=1;return;}printf("\nCaution:Openfilefirst\n");printf("OpenedFile(s)List:\n");k=ExistD(dirname);for(i=0;i<fcount[k];i++){if(ifopen[k][i].ifopen==1)name);n++;}if((n%4==0)&&(n!=0))printf("\n");}printf("\n%dfilesopenned.\n",n);if(n==0)wgetchar=1;fopen==1){if((ifopen[k][i].openmode==0)||(ifopen[k][i].openmode==2))paddr,str,10);strcpy(str1,"file");strcat(str1,str);strcpy(str,"d:\\osfile\\file\\");strcat(str,str1);strcat(str,".txt");fp_file=fopen(str,"rb");fseek(fp_file,0,0);printf("\nThetextis:\n\n");printf("");while(fscanf(fp_file,"%c",&c)!=EOF)if(c=='\n')printf("\n");else printf("%c",c);printf("\n\n%dLength.\n",ufd[k]->ufdfile[i].flength);fclose(fp_file);wgetchar=1;}elseif(ifopen[k][i].openmode==1)'%s\'\'tread.\n",fname);wgetchar=1;}else'%s\'\'tread.\n",fname);wgetchar=1;}}else{printf("\nError.\'%s\'\n",fname);wgetchar=1;}}else{printf("\nError.\'%s\'doesnotexist.\n",fname);wgetchar=1;}}}void WriteF()/*WriteFile*/{int i,k,n=0;int length;char fname[MAXNAME],values[1000];char str[255],str1[255],c;if(strcmp(strupr(ltrim(rtrim(dirname))),"")==0)n");wgetchar=1;return;}printf("\nCaution:Openfilefirst\n");printf("OpenedFile(s)List:\n");k=ExistD(dirname);fopen==1)name);n++;}if((n%4==0)&&(n!=0))printf("\n");}printf("\n%dfilesopenned.\n",n);if(n==0)wgetchar=1;fopen==1)penmode==1)||(ifopen[k][i].openmode==2))paddr,str,10);x t");fp_file=fopen(str,"ab");length=ufd[k]->ufdfile[i].flength+length;n",ufd[k]->ufdfile [i].flength);printf("\n\nYouhavewritefilesuccessfully!!");fclose(fp_file);wgetchar=0;}elseif(ifopen[k][i].openmode==0)'%s\'\'twrite.\n",fname);wgetchar=1;}else'%s\'\'twrite.\n",fname);wgetchar=1;}}else'%s\'\n",fname);wgetchar=1;}}else'%s\'doesnotexist.\n",fname);wgetchar=1;}}}void QuitF()/*QuitFileSystem*/{int i,j;char str[50];SetPANo(1);if(fp_mfd!=NULL)fclose(fp_mfd);xt");fp_ufd=fopen(str,"wb");fclose(fp_ufd);fp_ufd=fopen(str,"ab");for(i=0;i<fcount[j];i++)fwrite(&ufd[j]->ufdfile[i],sizeof(OSFILE),1,fp_ufd);fclose(fp_ufd);}}void CdF()/*ExchangeDir更换用户*/{char dname[MAXNAME];printf("\nPleaseinputDirName:");gets(dname);ltrim(rtrim(dname));if(ExistD(dname)>=0)strcpy(dirname,strupr(dname));elseif(strcmp(strupr(dname),"CD..")==0)strcpy(ltrim(rtrim(dirname)),"");else printf("\nError.\'%s\'doesnotexist.\n",dname);}void help(void){printf("\nTheCommandList\n");printf("\nCdAttribCreatewriteReadOpenClsDeleteExitClose\n");}【设计总结】UNIX系统中的文件系统是人们最感兴趣的,也是最成功的一部分。
操作系统课程设计

武汉理工大学华夏学院课程设计课程名称操作系统课程设计题目为LINUX 设计一个简单的二级文件系统专业软件技术班级2081班姓名陶静成绩指导教师赵传斌、司晓梅2011年1月17日至2011年1月21日课程设计任务书设计题目:为LINUX 设计一个简单的二级文件系统设计目的:1、通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。
2、提高学生的程序设计能力、提高算法设计质量与程序设计素质。
设计任务:(在规定的时间内完成下列任务)为LINUX 设计一个简单的二级文件系统。
要求做到以下几点:1、可以实现下列几条命令(至少4条)2、列目录时要列出文件名、物理地址、保护码和文件长度。
3、源文件可以进行读写保护。
时间安排:1月 17日布置课程设计任务;分配题目后,查阅资料、准备程序;1月 18日~1月20 日上机调试程序、书写课程设计报告;1月21 日上午提交课程设计报告及相关文档。
地点:学校机房(具体见现代教育中心大屏幕安排)具体要求:1、课程设计报告按统一通用格式书写,具体格式要求请在网络上查阅2、每位学生应独立完成各自的任务且每天至少在设计室工作半天指导教师签名:11年1月7日教研室主任(或责任教师)签名:11年1月7 日Login 用户登录Dir 列文件目录Create 创建文件Delete 删除文件Open 打开文件Close 关闭文件Read 读文件Write 写文件目录一.项目概述 (4)二.课程设计设计题目 (4)三.开发语言及实现平台或实验环境 (4)四.设计目的 (4)五.设计内容 (4)5.1.任务 (4)5.2.主程序流程图 (5)六.程序设计 (5)6.1.设计思想 (5)6.2.设计要求 (5)七.设计原理 (6)7.1.外存管理 (6)7.2.linux的EXT2文件系统 (6)7.3.用内存来模拟外存 (6)7.4.编码 (7)八.测试界面 (15)九.参考文献 (17)十.设计心得体会 (17)十一.设计过程中的疑问 (18)十二.指导教师评语 (18)一.项目概述Linux是一个性能稳定、功能强大、效率高的操作系统。
计算机二级操作系统知识点解答

计算机二级操作系统知识点解答操作系统(Operating System,简称OS)是一种用于控制和管理计算机硬件资源和软件资源的系统软件。
它是计算机系统中最基本的软件之一,负责启动、加载和运行其他程序,并提供用户与计算机硬件之间的接口。
计算机二级操作系统考试是计算机技术和信息化专业技术资格考试(水平测试),是一个评价计算机操作系统知识掌握程度的证书考试。
下面将介绍计算机二级操作系统知识点,并对其中的一些重要概念做详细解答。
一、操作系统基本概念1.操作系统的定义和作用操作系统是计算机硬件与应用程序之间的桥梁,它负责管理计算机硬件资源,为应用程序提供运行环境,提高计算机的资源利用率。
2.操作系统的基本功能操作系统的基本功能包括:进程管理、内存管理、文件系统管理和设备管理。
其中,进程管理负责管理计算机上运行的进程;内存管理负责管理计算机的内存资源;文件系统管理负责管理硬盘上的文件;设备管理负责管理计算机的各种外设。
二、进程管理进程是计算机中执行的程序的实体,线程是进程中的一个执行单元。
进程是资源分配的基本单位,线程是CPU调度的基本单位。
一个进程可以包含多个线程。
2.进程调度算法常见的进程调度算法有:先来先服务(FCFS)、短作业优先(SJF)、优先级调度、时间片轮转调度等。
三、内存管理1.内存地址空间内存地址空间是指计算机系统中可被程序使用的内存地址的范围。
根据不同的操作系统和硬件架构,内存地址空间可划分为逻辑地址空间和物理地址空间。
2.分段和分页的内存管理方式分段和分页是常见的内存管理方式。
分段将内存划分为多个段,每个段具有不同的大小,属于进程的逻辑地址空间;分页将内存划分为固定大小的页,属于进程的物理地址空间。
四、文件系统管理1.文件系统的组成部分文件系统由文件、文件目录和文件存储器组成。
文件是存储在二级存储器中的数据集合;文件目录是文件的组织结构;文件存储器是存储文件的物理介质。
2.文件系统的文件管理方式文件管理方式包括顺序文件、索引文件和链式文件等。
模拟简单二级文件管理系统

模拟简单二级文件管理系统简单二级文件管理系统是一种用于管理和组织计算机文件的软件系统。
它提供了一种方便的方式来浏览、创建、修改和删除文件,以及对文件进行分类和搜索。
本文将介绍如何设计和实现一个模拟简单二级文件管理系统。
一、系统概述模拟简单二级文件管理系统是一个基于命令行界面的文件管理系统。
用户可以通过输入不同的命令来执行文件管理操作,如创建文件夹、创建文件、查看文件列表、移动文件等。
系统支持两级文件结构,即可以在根目录下创建文件夹,并在文件夹下创建文件。
系统还提供了文件搜索功能,用户可以根据文件名或文件类型进行搜索。
二、系统功能1. 创建文件夹:用户可以通过输入命令,在指定路径下创建一个新的文件夹。
2. 创建文件:用户可以通过输入命令,在指定路径下创建一个新的文件。
3. 查看文件列表:用户可以通过输入命令,查看指定路径下的文件夹和文件列表。
4. 移动文件:用户可以通过输入命令,将指定文件或文件夹移动到目标路径下。
5. 复制文件:用户可以通过输入命令,将指定文件或文件夹复制到目标路径下。
6. 删除文件或文件夹:用户可以通过输入命令,删除指定的文件或文件夹。
7. 文件搜索:用户可以通过输入命令,根据文件名或文件类型进行文件搜索。
三、系统设计1. 数据结构系统使用树状结构来表示文件系统,每个节点表示一个文件夹或文件。
节点包含以下属性:- 名称:节点的名称,可以是文件夹名称或文件名称。
- 类型:节点的类型,可以是文件夹或文件。
- 父节点:指向父节点的指针,用于表示文件夹的层次结构。
- 子节点列表:包含子节点的列表,用于表示文件夹下的文件和文件夹。
2. 系统流程系统的主要流程如下:- 用户输入命令。
- 系统解析命令,判断执行的操作类型。
- 根据操作类型,执行相应的操作。
- 更新文件系统的数据结构。
- 返回执行结果给用户。
四、系统实现系统可以使用编程语言来实现,如Python。
以下是一个简单的实现示例:```pythonclass Node:def __init__(self, name, type): = nameself.type = typeself.parent = Noneself.children = []class FileSystem:def __init__(self):self.root = Node("root", "folder")def create_folder(self, path, name):# 创建文件夹的逻辑def create_file(self, path, name):# 创建文件的逻辑def list_files(self, path):# 查看文件列表的逻辑def move_file(self, source_path, target_path): # 移动文件的逻辑def copy_file(self, source_path, target_path): # 复制文件的逻辑def delete_file(self, path):# 删除文件的逻辑def search_file(self, path, keyword):# 文件搜索的逻辑# 创建文件系统对象file_system = FileSystem()# 用户输入命令command = input("请输入命令:")# 解析命令并执行相应的操作# ...# 更新文件系统的数据结构# ...# 返回执行结果给用户# ...```以上是一个简单的模拟二级文件管理系统的设计和实现。
文件系统概述

⽂件系统概述⼀、概述操作系统对系统的软件资源(不论是应⽤软件和系统软件)的管理都以⽂件⽅式进⾏,承担这部分功能的操作系统称为⽂件系统。
1、⽂件计算机系统对系统中软件资源:⽆论是程序或数据、系统软件或应⽤软件都以⽂件⽅式来管理。
⽂件是存贮在某种介质上的(如磁盘、磁带等)并具有⽂件名的⼀组有序信息的集合。
⽂件名是由字符和数字组成的,例如MS-DOS中⽂件名由三部分组成,格式如下:[<盘符>] <⽂件名> [.扩展名]。
格式 [ ] 中是可以省略,盘符为存放⽂件的磁盘驱动器号,如⽤A:和C:分别表⽰软盘和硬盘驱动器;⽂件名由1∽8个字符组成。
扩展名为由“.”开始的1-3个字符组成,如.EXE表⽰可执⾏的浮动代码⽂件,.TXT表⽰ASCⅡ码⽂本⽂件,.LIB表⽰库⽂件,.BAT表⽰批处理⽂件等。
UNIX ⽂件系统将⽂件分成普通⽂件、⽬录⽂件、设备⽂件(特殊⽂件)和符号连接⽂件(Symbolic link)等⼏类,UNIX把所有I/O设备作为特殊⽂件,对I/O设备操作模仿为对普通⽂件的存取,这样将⽂件与设备的I/O尽可能统⼀起来。
数据项是描述⼀个对象的某些属性的字符集,它是数据的基本单位,⼀个数据项有⼀个值。
记录是⼀组相关数据项的集合,⽤于描述⼀个对象某⽅⾯的属性。
⽂件是具有⽂件名的⼀组相关记录的集合。
数据库是相关数据的集合。
2、⽂件系统⽂件系统是操作系统中以⽂件⽅式管理计算机软件资源的软件和被管理的⽂件和数据结构(如⽬录和索引表等)的集合。
从系统⾓度来看,⽂件系统是对⽂件存储器的存储空间进⾏组织、分配和回收,负责⽂件的存储、检索、共享和保护。
从⽤户⾓度来看,⽂件系统主要是实现“按名存取”,⽂件系统的⽤户只要知道所需⽂件的⽂件名,就可存取⽂件中的信息,⽽⽆需知道这些⽂件究竟存放在什么地⽅。
⽂件系统的类型:(1)FAT⽂件系统(MS-DOS⽂件系统、msdos)它是MS-DOS操作系统使⽤的⽂件系统,它也能由Windows98/NT、linux、SCO UNIX等操作系统访问。
EXT2文件系统

ext2 文件系统格式The Second Extended File System(ext2)文件系统是 Linux 系统中的标准 文件系统,是通过对 Minix 的文件系统进行扩展而得到的,其存取文件的性能 极好。
在 ext2 文件系统中,文件由 inode(包含有文件的所有信息)进行唯一标识。
一个文件可能对应多个文件名,只有在所有文件名都被删除后,该文件才会被 删除。
此外,同一文件在磁盘中存放和被打开时所对应的 inode 是不同的,并 由内核负责同步。
ext2 文件系统采用三级间接块来存储数据块指针,并以块 (block,默认为 1KB)为单位分配空间。
其磁盘分配策略是尽可能将逻辑相 邻的文件分配到磁盘上物理相邻的块中, 并尽可能将碎片分配给尽量少的文件, 以从全局上提高性能。
ext2 文件系统将同一目录下的文件(包括目录)尽可能 的放在同一个块组中,但目录则分布在各个块组中以实现负载均衡。
在扩展文 件时,会尽量一次性扩展 8 个连续块给文件(以预留空间的形式实现)。
2.1. 总体存储布局 请点评我们知道,一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例 如某种 mkfs 命令)格式化成某种格式的文件系统,然后才能存储文件,格式 化的过程会在磁盘上写一些管理存储布局的信息。
下图是一个磁盘分区格式化 成 ext2 文件系统后的存储布局。
图 1. ext2 文件系统的总体存储布局文件系统中存储的最小单位是块(Block),一个块究竟多大是在格式化时确 定的,例如 mke2fs 的-b 选项可以设定块大小为 1024、2048 或 4096 字节。
而上图中启动块(Boot Block)的大小是确定的,就是 1KB,启动块是由 PC 标准规定的,用来存储磁盘分区信息和启动信息,任何文件系统都不能使用启 动块。
启动块之后才是 ext2 文件系统的开始, ext2 文件系统将整个分区划成若干 个同样大小的块组(Block Group),每个块组都由以下部分组成。
文件系统

ReiserFS的第一次公开亮相是在1997年7月23日,Hans Reiser把他的基于平衡树结构 的ReiserFS文件系统在网上公布。ReiserFS 3.6.x(作为 Linux 2.4 一部分的版本) 是由 Hans Reiser 和他的在Namesys 的开发组共同开发设计的。Hans 和他的组员们相 信最好的文件系统是那些能够有助于创建独立的共享环境或者命名空间的文件系统,应 用程序可以在其中更直接、有效和有力地相互作用。为了实现 这一目标,文件系统就 应该满足其使用者对性能和功能方面的需要。那样,使用者就能够继续直接地使用文件 系统,而不必建造运行在文件系统之上(如数据库之 类)的特殊目的层。ReiserFS 使 用了特殊的优化 b* 平衡树(每个文件系统一个)来组织所有的文件系统数据。这为其 自身提供了非常不错的性能改进,也能够减轻文件系统设计上的人为约束。例如,现在 一个目录下 可以容纳 ext00,000 个子目录。另一个使用 b* 树的好处就是 ReiserFS 能够像大多其它的下一代文件系统一样,根据需要动态地分配索引节,而不必在文件系 统创建时建立固定的索引节。这有助于文件系统更灵活地适应其面临的各种存 储需 要,同时提供附加的空间有效率。 Reiserfs被看作是一个更加激进和现代的文件系统。传统的UNIX文件系统是按盘块 来进行空间分配的,对于目录和文件等的查找使用了简单的线性查 找。这些设计在当 时是合适的,但随着磁盘容量的增大和应用需求的增加,传统文件系统在存储效率,速 度和功能上已显落后。在reiserfs的下一版 reiser4中还提供了对事务的支持。在 [url]/v4/v4.html[/url] 中有reiser4的介绍和一个简单的 reiser4的性能测试。 ReiserFS的缺点:ReiserFS一个最受人批评的缺点是每升级一个版本,都将要将磁盘 重新格式化一次。你可以在[url]/[/url] 网站了解关于 ReiserFS 的更多信息。 xfs是一种非常优秀的日志文件系统,它是SGI公司设计的。xfs被称为业界最先进的、 最具可升级性的文件系统技术。它是一个全64位,快速、稳固的日 志文件系统,多年用 于SGI的IRIX操作系统。sgi决定支持Linux社区,将关键的基本架构技术授权于Linux。 它以开放资源形式发布了他们自己 拥有的xfs的源代码,并开始进行移植。此工作进展 得很快,目前已进入beta版阶段。作为一个64位文件系统,xfs可以支持超大数量的文 件(9g× 1gb,甚至更大的18g×1gb),可在大型 2d 和 3d 数据方面提供显着的性能 。xfs有能力预测其它文件系统薄弱环节,同时xfs提供了在不妨碍性能的情况下增强可 靠性和快速的事故恢复。SGI的xfs可为 linux和开放资源社区带来的新特性有:可升级 性:xfs被设计成可升级,以面对大多数的存储容量和i/o存储需求,可处理大型文件和 包含巨大数量文件 的大型目录,满足二十一世纪快速增长的磁盘需求。xfs有能力动态 地为文件分配索引空间,使系统形成高效支持大数量文件的能力。在它的支持下,用户 可使用 1exabyte (1g×1gb) 大的文件,远远大于现在最大的文件系统。优秀的i/o 性能:典型的现代服务器使用大型的条带式磁盘阵列,以提供达数gb/秒的总带宽。xfs 可以很好地满足I/O请求的大小和并发I/O请求的数量。 xfs 可作为root文件系统,并 被lilo支持.在NFS服务器上使用也没问题.支持软件磁盘阵列(RAID)和虚拟集群 (LVM)。SGI最新发布xfs为 1.0.1版.(在: [url]http:///projects/xfs/[/url] 可以下载它)。 Msdos:msdos 是在Dos、Windows和某些OS/2 操作系统上使用的一种文件系统,其名称 采用“8+3”的形式,即8个字符的文件名加上3个字符的扩展名。 umsdos:Linux下的扩展msdos文件系统驱动,支持长文件名、所有者、允许权限、连接 和设备文件。允许一个普通的msdo s文件系统用于Linux,而且无须为它建立单独的分 iso9660:标准CDROM文件系统,通用的Rock Ridge增强系统,允许长文件名。 Nfs:Sun公司推出的网络文件系统,允许多台计算机之间共享同一文件系统,易于从所 有这些计算机上存取文件。 Hpfs: High Performance File System(HPFS) 高性能文件系统(HPFS) HPFS是 Microsoft的LAN Manager中的文件系统,同时也是IBM的LAN Server和OS/2的文件系统 。HPFS能访问较大的硬盘驱动器,提供更多的组织特性并改善了文件系统的安全特性。 Smb:smb是一种支持 Windows for workgroups、Windows NT 和Lan Manager的基于SMB 协议的网络操作系统。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算机操作系统》课程设计题目:二级文件系统专业:计算机科学与技术班级:姓名:学号:指导教师:时间:2011.6.01---2011.6.102011年6 月13日一、实验内容为Linux系统设计一个简单的二级文件系统。
要求做到以下几点:1.可以实现下列几条命令:login用户登录dir 列目录create创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件2.列目录时要列出文件名,物理地址,保护码和文件长度二、实验目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。
三、开发环境Windows操作系统Microsoft Visual C++四、分析设计实验原理通过程序模拟Linux文件系统,用一个二进制文件(FileSystem.disk)来模拟磁盘.设计一个多用户的二级文件系经统、实现一般的创建文件、目录,删除文件、目录,切换目录,打开、关闭文件、读写文件等操作。
文件系统,包含格式化,显示文件(目录),创建文件等几个简单命令的实现,而且能完成超级块的读写,节点的读写等过程. 本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户账号下的文件。
另外,为了简单本文件系统未考虑文件共享、文件系统安全以及管道文件与设备文件等特殊内容。
1.程序执行流程图:2.数据块的分配和回收设计FileSystem类负责管理磁盘空间和磁盘内存I节点,负责对磁盘空间和磁盘数据进行优化管理。
并提代接口言方法供用户或程序调用。
五、打印的源程序及附上的注释#include "xd.h" //文件管理void createFile(char fileName[],int length,char fileKind[]); //创建文件void fileWrite(char fileName[]); //写文件void fileCat(char fileName[]); //读文件void fileRen(char fileName[],char rename[]); //重命名文件void fileClose(char fileName[]); //关闭已打开的文件void delFile(char fileName[]); //删除文件int requestDist(int &startPostion,int maxLength); //磁盘分配查询void initDisk(); //初始化磁盘void freeDisk(int startPostion); //磁盘空间释放//用户管理void userCreate();int login();int userID=-1; //用户登录的ID号,值为-1时表示没有用户登录//用户注册void userCreate(){char c;char userName[10];int i;if(used<MaxUser){cout<<"请输入用户名:";for(i=0;c=getch();i++)if(c==13) break;elseuserName[i]=c;printf("%c",c);}userName[i]='\0';for(i=0;i<used;i++){if(!strcmp(userTable[i].userName,userName)){cout<<"\n";cout<<"该用户名已存在,创建用户失败\n";//system("pause");return;}}strcpy(userTable[used].userName,userName);cout<<"\n";cout<<"请输入密码:";for(i=0;c=getch();i++){if(c==13) break;elseuserTable[used].password[i]=c;printf("*");}userTable[used].password[i]='\0';cout<<"\n";cout<<"创建用户成功\n";used++;//system("pause");}else{cout<<"创建用户失败,用户已达到上限\n";//system("pause");}fflush(stdin);}//登录int login(){char name[10],psw[10];int i,times;cout<<"请输入用户名:";for(i=0;c=getch();i++){if(c==13) break;elsename[i]=c;printf("%c",c);}name[i]='\0';for(i=0;i<used;i++){if(!strcmp(userTable[i].userName,name))break;}if(i==used){cout<<"\n您输入的用户名不存在\n";//system("pause");return -1;}for(times=0;times<3;times++){memset(psw,'\0',sizeof(psw));cout<<"\n请输入密码:";for(i=0;c=getch();i++){if(c==13) break;elsepsw[i]=c;cout<<"*";}printf("\n");for(i=0;i<used;i++){if(!strcmp(psw,userTable[i].password)){printf("用户登录成功\n");//system("pause");break;}if(i==used){printf("您输入的密码错误,您还有%d次输入机会\n",2-times);if(times==2) exit(0);}else break;}return i;}//磁盘初始化void initDisk(){diskHead=(diskNode *)malloc(sizeof(diskNode));diskHead->maxlength=MaxDisk;diskHead->useFlag=0;diskHead->start=0;diskHead->next=NULL;}//分配磁盘int requestDist(int &startPostion,int maxLength){int flag=0; //标记是否分配成功diskNode *p,*q,*temp;p=diskHead;while(p){if(p->useFlag==0) //磁盘块未被使用,且剩余长度大于要创建文件的长度{startPostion=p->start;q=(diskNode *)malloc(sizeof(diskNode));q->start=p->start;q->maxlength=maxLength;q->useFlag=1;q->next=NULL;diskHead->start=p->start+maxLength;//剩余磁盘空间头指针后移diskHead->maxlength=p->maxlength-maxLength; //剩余磁盘空间长度减少flag=1;temp=p;if(diskHead->next==NULL) diskHead->next=q;else{while(temp->next) temp=temp->next;temp->next=q;}break;}p=p->next;}return flag;}//创建文件void createFile(char fileName[],int length){//int i,j;time_t rawtime;int startPos;UFD *fileNode,*p;for(p=userTable[userID].user->next;p!=NULL;p=p->next){if(!strcmp(p->file->fileName,fileName)){printf("文件重名,创建文件失败\n");//system("pause");return;}}if(requestDist(startPos,length)){fileNode=(UFD *)malloc(sizeof(UFD));fileNode->file=(fileTable *)malloc(sizeof(fileTable)); //这一步必不可少,因为fileNode里面的指针也需要申请地址,否则fileNode->file指向会出错strcpy(fileNode->file->fileName,fileName);fileNode->file->maxlength=length;fileNode->file->strat=startPos;fileNode->file->openFlag=false;time(&rawtime);//读取系统当前时间fileNode->file->timeinfo=localtime(&rawtime);fileNode->next=NULL;if(userTable[userID].user->next==NULL)//用户当前还没有创建文件时userTable[userID].user->next=fileNode;else //已创建过文件,找到最后一个的next 指针{p=userTable[userID].user->next;while(p->next) p=p->next;p->next=fileNode;}printf("创建文件成功\n");//system("pause");}else{printf("磁盘空间已满或所创建文件超出磁盘空闲容量,磁盘空间分配失败\n");//system("pause");}}//释放磁盘void freeDisk(int startPostion){diskNode *p;for(p=diskHead;p!=NULL;p=p->next){if(p->start==startPostion) //找到startPostion位置的指针break;}p->useFlag=false;}//查看文件void fileCat(char fileName[]){int startPos,length;int k=0;UFD *p,*q;q=userTable[userID].user;for(p=q->next;p!=NULL;p=p->next){if(!strcmp(p->file->fileName,fileName))break;}if(p){startPos=p->file->strat;length=p->file->length;p->file->openFlag=true; //文件打开标记printf("--------------------------------------------------------------\n");for(int i=startPos;k<length;i++,k++){if(i%50==0) printf("\n"); //一行大于50个字符换行printf("%c",disk[i]);}printf("\n\n----------------------------------------------------------\n");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");//system("pause");}}//覆盖写入void fileWrite(char fileName[]){UFD *p,*q;q=userTable[userID].user;int i,k,startPos;for(p=q->next;p!=NULL;p=p->next){if(!strcmp(p->file->fileName,fileName))break;}if(p){if(!strcmp(p->file->fileKind,"r")) //判断文件类型{printf("该文件是只读文件,写入失败\n");//system("pause");return;}char str[500];printf("please input content:\n");gets(str);startPos=p->file->strat;p->file->openFlag=true; //文件打开标记p->file->length=strlen(str);if(p->file->length>p->file->maxlength)printf("写入字符串长度大于该文件的总长度,写入失败\n");//system("pause");return;}for(i=startPos,k=0;k<(int)strlen(str);i++,k++)disk[i]=str[k];printf("文件写入成功\n");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");// system("pause");}if(p){p->file->openFlag=false;printf("%s文件已关闭\n",p->file->fileName);// system("pause");}}//重命名void fileRen(char fileName[],char name[]){UFD *p,*q;q=userTable[userID].user;for(p=q->next;p!=NULL;p=p->next){if(!strcmp(p->file->fileName,fileName))break;}if(p){while(q->next){if(!strcmp(q->next->file->fileName,name)){printf("您输入的文件名已存在,重命名失败\n");//system("pause");return;}q=q->next;strcpy(p->file->fileName,name);printf("重命名成功\n");//system("pause");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");//system("pause");}}//关闭文件void fileClose(char fileName[]){UFD *p,*q;q=userTable[userID].user;for(p=q->next;p!=NULL;p=p->next){if(!strcmp(p->file->fileName,fileName))break;}if(p){p->file->openFlag=false;printf("%s文件已关闭\n",p->file->fileName);//system("pause");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");//system("pause");}}//查看文件详细信息void fileLength(char fileName[]){int startPos,length;// char kind[3];int k=0;UFD *p,*q;q=userTable[userID].user;for(p=q->next;p!=NULL;p=p->next){if(!strcmp(p->file->fileName,fileName))break;}if(p){startPos=p->file->strat;length=p->file->length;//获取文件长度printf("文件长度为%d\n ",length);//system("pause");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");//system("pause");}}//检查文件是否关闭void ifClose(char fileName[]){bool open;UFD *p,*q;q=userTable[userID].user;for(p=q->next;p!=NULL;p=p->next){if(!strcmp(p->file->fileName,fileName))break;}if(p){open=p->file->openFlag;if(open==true)printf("%s文件未关闭\n",p->file->fileName);else //open=trueprintf("%s文件已关闭\n",p->file->fileName);//system("pause");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");//system("pause");}}void print(){ cout<<" create 创建文件\n";cout<<" length 查看文件长度\n";cout<<" cat 查看文件内容\n";cout<<" write 覆盖写入\n";cout<<" ren 重命名\n";cout<<" del 删除文件\n";cout<<" close 关闭文件\n";cout<<" return 退出用户,返回登录界面\n";cout<<" exit 退出程序\n";cout<<" ifclose 检查文件是否关闭\n";}//删除文件void delFile(char fileName[]){UFD *p,*q,*temp;q=userTable[userID].user;p=q->next;while(p){if(!strcmp(p->file->fileName,fileName)) break;//文件不存在else{p=p->next;q=q->next;}}if(p){if(p->file->openFlag!=true) //先判断是否有进程打开该文件,如果文件没被打开{temp=p;q->next=p->next;freeDisk(temp->file->strat); //磁盘空间回收free(temp);printf("文件删除成功\n");//system("pause");else{printf("该文件已被进程打开,删除失败\n");//文件被打开//system("pause");}}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");//文件不存在//system("pause");}}int main(){char order[commandAmount][10];strcpy(order[0],"create");strcpy(order[1],"cat");strcpy(order[2],"write");strcpy(order[3],"ren");strcpy(order[4],"del");strcpy(order[5],"close");strcpy(order[6],"return");strcpy(order[7],"exit");strcpy(order[8],"awrite");strcpy(order[9],"length");strcpy(order[10],"ifclose");charcommand[50],command_str1[10],command_str2[10],command_str3[5];//,command_str4[3];int i,j,k;int length;initDisk(); //初始化磁盘for(i=0;i<MaxUser;i++) //初始化用户UFD目录文件的头指针{userTable[i].user=(UFD *)malloc(sizeof(UFD));userTable[i].user->next=NULL;}cout<<"----------------------------------------------------------\n";cout<<"请先进入用户管理\n\n";cout<<" Creat user 创建新用户请输入1\n";cout<<" login 用户登录请输入2\n";cout<<"----------------------------------------------------------\n\n";while(1){cout<<"Please choose the function key:>";int choice;scanf("%d",&choice);if(choice==1) userCreate();else if(choice==2){userID=login();print();}else printf("您的输入有误,请重新选择\n");while (userID!=-1){fflush(stdin);cout<<"please input your command:>";gets(command);int select;for(i=0;command[i]!=' '&&command[i]!='\0';i++) //command_str1字符串存储命令的操作类型command_str1[i]=command[i];k=i;command_str1[k]='\0';for(i=0;i<commandAmount;i++){if(!strcmp(command_str1,order[i])){select=i;break;}}if(i==commandAmount){cout<<"您输入的命令有误,请重新输入\n";continue;}for(i=k+1,k=0;command[i]!=' '&&command[i]!='\0';i++,k++) //commmand_str2字符串存储文件名或用户名command_str2[k]=command[i];command_str2[k]='\0';k=i;switch(select){case 0:for(i=k+1,k=0;command[i]!=' '&&command[i]!='\0';i++,k++)command_str3[k]=command[i];command_str3[k]='\0';j=1;length=0; //初始化文件长度for(i=strlen(command_str3)-1;i>=0;i--) //把字符串转换为十进制{length+=(command_str3[i]-48)*j;j*=10;}createFile(command_str2,length);break;case 1:fileCat(command_str2);break;case 2:fileWrite(command_str2);break;case 4:delFile(command_str2);break;case 5:fileClose(command_str2);break;case 6:UFD *p;for(p=userTable[userID].user->next;p!=NULL;p=p->next) //退出用户之前关闭所有打的文件if(p->file->openFlag)p->file->openFlag=false;system("cls");userID=-1;break;case 7:exit(0);break;case 8:fileLength(command_str2);break;}}}return 0;}五打印的程序运行时初值和运行结果1、初值2、运行过程与结果六、心得体会通过这次的操作系统的课程设计,在老师的细心指导和同学的积极讨论下,终于做出了模拟Linux二级文件系统,能够简单得实现目录的创建和删除,文件的建立和删除,文件的读写等这些基本操作,并且着重改编了拷贝、剪切和查询的功能,了解二级目录的有关内容,并且通过编写的模拟Lunix下的操作环境有了更进一步的了解。