.....《计算机操作系统》课程实验报告题目文件管理学院:计算机学院专业:计算机科学与技术姓名班级学号2016年12月22日.....实验三文件管理1.实验目的:编写一个简单的二级文件系统实现程序,加深对文件系统的内部功能和内部实现的理解。要求模拟采用二级目录结构的磁盘文件系统的文件操作能实现相应的命令,用输入命令来模拟用户程序中调用的文件操作。2.实验内容:最基本的文件操作(1)创建文件在创建一个新文件时,系统首先要为新文件分配必要的外存空间,并在文件系统的目录中,为之建立一个目录项。目录项中应该记录新文件的文件名及其在外存的地址等属性。(2)删除文件当已不再需要某文件时,可将它从文件系统中删除。在删除时,系统应该先从目录中找到要删除的文件的目录项,使之成为空项,然后回收该文件所占用的存储空间。(3)读文件在读一个文件时,须在相应的系统调用中给出文件名和应该读入的内存目标地址。此时,系统同样要查找目录,找到制定的目录项,从中得到被读文件在外存中的位置。在目录项中,还有一个指针用于对文件的读/写。(4)写文件在写一个文件时,须在相应的系统调用中给出该文件名及该文件在内存中的(源)地址。为此,也同样须先查找目录,找到指定文件的目录项,在利用目录中的写指针进行写操作。(5)截断文件如果一个文件的内容已经陈旧而需要全部更新文件的内容时,一种方法是将此文件删除,再重新创建一个新文件。但如果文件名及其属性均无改变时,则可采取另一种所谓的截断文件的方法,此即将原有文件的长度设置为0,或说放弃原有的文件内容。(6)设置文件的读/写位置.....前述的文件读/写操作,都只提供了对文件顺序存取的手段,即每次都是从文件的始端读或写。设置文件读/写位置的操作,用于设置文件读/写指针的位置,以便每次读/写文件时,不是从其始端而是从所设置的位置开始操作。也正因如此,才能改顺序存取为随机存取。3.设计实现:1)流程图2)详细设计源代码#includestdio.h#includestring.h#includeconio.h#includestdlib.h#includetime.h#defineMaxUser100//定义最多有100个用户.....#defineMaxDisk512*1024//定义磁盘空间大小#definecommandAmount//对文件操作的指令数//存储空间管理有关结构体和变量chardisk[MaxDisk];//模拟512K的磁盘存储空间typedefstructdistTable//磁盘块结构体{intmaxlength;intstart;intuseFlag;distTable*next;}diskNode;diskNode*diskHead;typedefstructfileTable//文件快结构体{charfileName[10];intstart;//文件在磁盘存储空间的起始地址intlength;//文件内容长度intmaxlength;//文件的最大长度charfileKind[3];//文件的属性--读写方式structtm*timeinfo;boolopenFlag;//判断是否有进程打开了文件};intused=0;//定义MFD目录中用已有的用户数//两级目录结构体typedefstructuser_file_directory//用户文件目录文件UFD{fileTable*file;.....user_file_directory*next;}UFD;typedefstructmaster_file_directory//主目录文件{charuserName[10];charpassword[10];UFD*user;}MFD;MFDuserTable[MaxUser];intuserID=-1;//用户登录的ID号,值为-1时表示没有用户登录//文件管理voidfileCreate();//创建文件voidfileDelet();//删除文件voidfileWrite();//写文件voidfileRead();//读文件voidfileRename();//重命名文件voidfileFind();//查询文件voidfileDir();//显示某一用户所有文件voidfileClose();//关闭已打开的文件voidfileChange();//修改文件的读写方式intrequestDist(int&stratPostion,intmaxlength);//磁盘分配查询voidinitDisk();//初始化磁盘voidfreeDisk(intstartPostion);//磁盘空间释放voiddiskShow();//显示磁盘使用情况voidinitFile();.....//用户管理voiduserCreate();intlogin();voiduserDelet();voiduserFind();//用户登陆主界面voidwebUser();//用户内部界面voidwebFile();intmain(){initDisk();initFile();webUser();return0;}voidwebUser(){inti;while(1){printf(************************************************************\n);printf(1.创建用户2.登陆用户\n);printf(3.删除用户4.查看用户\n);.....printf(0.退出系统\n);printf(************************************************************\n);printf(请输入操作号\n);scanf(%d,&i);switch(i){case0:exit(0);break;case1:userCreate();break;case2:userID=login();if(userID!=-1){webFile();}break;case3:userDelet();break;case4:userFind();break;default:printf(您输入的命令有误,请重新选择\n);system(pause);system(cls);break;}}}voiduserCreate(){.....charc;charuserName[10];inti;if(usedMaxUser){printf(请输入用户名:);for(i=0;c=_getch();i++){if(c==13)break;elseuserName[i]=c;printf(%c,c);}userName[i]='\0';for(i=0;iused;i++){if(!strcmp(userTable[i].userName,userName)){printf(\n);printf(该用户名已存在,创建用户失败\n);system(pause);system(cls);return;}}strcpy(userTable[used].userName,userName);printf(\n);printf(请输入密码:);for(i=0;c=_getch();i++){.....if(c==13)break;elseuserTable[used].password[i]=c;printf(*);}userTable[userID].password[i]='\0';printf(\n);printf(创建用户成功\n);used++;system(pause);system(cls);}else{printf(创建用户失败,用户已达到上限\n);system(pause);system(cls);}fflush(stdin);}intlogin(){charname[10],psw[10];charc;inti,times;printf(请输入用户名:);for(i=0;c=_getch();i++){if(c==13)break;else.....name[i]=c;printf(%c,c);}name[i]='\0';for(i=0;iused;i++){if(!strcmp(userTable[i].userName,name))break;}if(i==used){printf(\n您输入的用户名不存在\n);system(pause);system(cls);return-1;}for(times=0;times3;times++){memset(psw,'\0',sizeof(psw));printf(\n请输入密码:);for(i=0;c=_getch();i++){if(c==13)break;elsepsw[i]=c;printf(*);}printf(\n);for(i=0;iused;i++){.....if(!strcmp(psw,userTable[i].password)){printf(用户登录成功\n);system(pause);system(cls);break;}}if(i==used){printf(您输入的密码错误,您还有%d次输入机会\n,2-times);if(times==2)exit(0);}elsebreak;}fflush(stdin);returni;}voiduserDelet(){intstatePos;UFD*q;charname[10],psw[10];charc;inti,times,j;printf(请输入用户名:);for(i=0;c=_getch();i++){if(c==13)break;.....elsename[i]=c;printf(%c,c);}name[i]='\0';for(i=0;iused;i++){if(!strcmp(userTable[i].userName,name))break;}if(i==used){printf(\n您输入的用户名不存在\n);system(pause);system(cls);}else{q=userTable[i].user-next;while(q){if(q-file!=NULL){statePos=q-file-start;}freeDisk(statePos);q=q-next;.....}for(i,j=i+1;i=used;j++,i++){userTable[i]=userTable[j];}printf(\n用户删除成功\n);system(pause);system(cls);used--;}}voiduserFind(){inti;printf(用户列表:\n);for(i=0;iused;i++){printf(%s\n,userTable[i].userName);}system(pause);system(cls);}voidwebFile(){inti;.....charname[10],kind[3];printf(********************************************************\n);printf(1.创建2.删除\n);printf(3.写入文件4.查看文件内容\n);printf(5.重命名6.查看文件属性\n);printf(7.查看用户文件8.关闭文件\n);printf(9.修改文件权限10.查看磁盘使用情况\n);printf(11.返回上级目录12.退出系统\n);printf(*********************************************************\n);printf(请输入操作号:);scanf(%d,&i);while(1){switch(i){case1:fileCreate();break;case