操作系统课程设计报告-Linux二级文件系统设计_第1页
操作系统课程设计报告-Linux二级文件系统设计_第2页
操作系统课程设计报告-Linux二级文件系统设计_第3页
操作系统课程设计报告-Linux二级文件系统设计_第4页
操作系统课程设计报告-Linux二级文件系统设计_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

操作系统课程设计报告PAGEPAGE36操作系统课程设计报告操作系统课程设计报告专业:计算机科学与技术学号:姓名:提交日期:【设计目的】(1)本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。(2)结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。(3)通过分对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力【设计内容】二级文件系统设计【实验环境】C++/VC++【相关知识综述】1.背景知识(1)外存管理文件系统是一个含有大量的文件及其属性,对文件进行操作、管理的软件,以及向用户提供使用文件的接口的一个集合。在逻辑上它的层次结构是这样的:文件系统接口对对象的操作和管理的软件集合逻辑文件系统基本I/O管理程序(文件组织模块)基本文件系统(物理I/O层)I/O控制层(设备驱动程序)对象及其属性说明作为产品的操作系统有各自的文件系统。比如MS的WINDOWS系列使用的是FAT16、FAT32或NTFS的文件系统、LINUX使用的是EXT2、EXT3文件系统等等。(2)linux的EXT2文件系统linux使用一个叫虚拟文件系统的技术从而可以支持多达几十种的不同文件系统,而EXT2是linux自己的文件系统。它有几个重要的数据结构,一个是超级块,用来描述目录和文件在磁盘上的物理位置、文件大小和结构等信息。inode也是一个重要的数据结构。文件系统中的每个目录和文件均由一个inode描述。它包含:文件模式(类型和存取权限)、数据块位置等信息。 一个文件系统除了重要的数据结构之外,还必须为用户提供有效的接口操作。比如EXT2提供的OPEN/CLOSE接口操作。(3)用内存来模拟外存真正的文件系统对外存进行管理,涉及到许多硬件、设备管理方面的底层技术,一方面这些技术不属于操作系统核心内容,一方面过多的内容不免造成实验者顾此失彼,所以这里推荐一种使用内存来模拟外存的方式,可以跳过这些硬件技术而直接把精力放在数据结构设计和操作算法设计上面。假定pInode是一个指向inode结构的指针,而且它已经放入的需要放入的数值了,现在需要将其写入到特定位置。可用如下代码:……fd=fopen(“filesystem”,”w+b”);//fd是FILE指针类型,w便是写方式,b表示二进制fseek(fd,specific_area,SEEK_SET);//fd是文件指针;specific_area为整形,//为需要入pInode的位置fwrite(pInode,sizeof(inode),1,fd);//写入pInode信息2、原理算法本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。【设计思路】1、数据结构#defineMAXNAME25/*mfdname,ufdname,filename的最大长度*/#defineMAXCHILD50/*最大的子文件个数*/#defineMAX(MAXCHILD*MAXCHILD)/*物理地址计数fpaddrno的最大长度*/typedefstruct/*结构体OSFILE(文件)*/{ intfpaddr;/*文件的物理地址号0,1,2...*/ intflength;/*文件的长度*/ intfmode;/*文件模式:0-ReadOnly;1-WriteOnly;2-ReadandWrite;3-protrcted;*/ charfname[MAXNAME];/*文件名*/}OSFILE;typedefstruct/*结构体OSUFD(用户目录)*/{ charufdname[MAXNAME];/*ufd的名字*/ OSFILEufdfile[MAXCHILD];/*ufd自己的文件*/}OSUFD;typedefstruct/*结构体OSUFD'LOGIN(用户注册)*/{ charufdname[MAXNAME];/*ufd的名字*/ charufdpword[8];/*ufd的密码*/}OSUFD_LOGIN;typedefstruct/*文件打开模式*/{ intifopen;/*打开情况:0-close,1-open*/ intopenmode;/*读写模式0-readonly,1-writeonly,2-readandwrite*/}OSUFD_OPENMODE;OSUFD*ufd[MAXCHILD];/*ufd及ufd自己的文件(指针型)*/OSUFD_LOGINufd_lp;/*建立了一个OSUFD_LOGIN型的ufd_lp*/intucount=0;/*mfd的ufd的个数*/intfcount[MAXCHILD];/*ufd自己的文件个数*/intloginsuc=0;/*是否成功登陆,1成功*/charusername[MAXNAME];/*记录注册的用户名*/chardirname[MAXNAME];/*记录文件当前的目录*/intfpaddrno[MAX];/*记录文件的物理地址num*/OSUFD_OPENMODEifopen[MAXCHILD][MAXCHILD];/*创建一个OSUFD_OPENMODE型的数组用于记录每个文件的打开情况和读写模式*/FILE*fp_mfd,*fp_ufd,*fp_file_p,*fp_file;/*定义FILE*型的文件指针,用于读文件*/2、主要的函数说明 voidLoginF()/*用户注册登录*/ voidDirF()/*显示文件系统的所有文件*/ voidCdF()/*改变路径*/ voidCreateF()/*创建文件*/ voidDeleteF()/*删除文件*/ voidModifyFM()/*改变文件模式*/ voidOpenF()/*打开文件*/ voidCloseF()/*关闭文件*/ voidReadF()/*读文件*/ voidWriteF()/*写文件*/ voidQuitF()/*退出文件系统*/voidclrscr()/*清屏*/voidhelp(void)/*帮助*/其他重要辅助函数: char*rtrim(char*str)/*移除最右边的空格*/ char*ltrim(char*str)/*移除最左边的空格*/voidSetPANo(intRorW)/*设置物理地址号(表示该地址号是否被用了0-未用,1-已用),RorW是0-read,1-write*/voidInputPW(char*password)/*输入密码并使用'*'代替*/intExistD(char*dirname)/*目录是否存在,存在返回第i个,不存在返回0*/intExistF(char*filename)/*文件是否存在,返回返回第i个,不存在返回0*/ intFindPANo()/*找出要分配的物理地址号*/intWriteF1()/*创建文件中的写文件*/3、程序流程设计:对于自己实现的4个功能:(1)open():进入open()进入open()当前用户名和当前目录相同?NY请转到当前用户名目录下当前文件存在?(文件号>0)输入要打开的文件名,并查找对应的文件号Y该文件不存在N确定当前用户的用户号该文件已经打开?N该文件已经打开,不用再打开Y该文件可以被打开?(不是protect型的)Y该文件是protect的,不能打开打开文件N返回主函数(2)close():进入close()进入close()当前用户名和当前目录相同?NY请转到当前用户名目录下当前文件存在?(文件号>0)输入要关闭的文件名,并查找对应的文件号Y该文件不存在N确定当前用户的用户号该文件是关闭的?N该文件未打开,不用关闭YY关闭文件返回主函数(3)write():进入write()进入write()当前用户名和当前目录相同?NY请转到当前用户名目录下有打开的文件?输入要写入的文件名,并查找对应的文件号无已经打开的文件提示必须先打开,并显示出已经打开的文件列表NY当前文件存在?(文件号>0)该文件不存在NY该文件已经打开?该文件未打开,不能写NY该文件可以被写入?(是可写或读写模式)该文件是制度模式或保护模式N确定文件路径确定文件路径写入内容到文件中记录文件长度返回主函数(4)delete进入delete()进入delete()当前用户名和当前目录相同?NY请转到当前用户名目录下当前文件存在?(文件号>0)输入要删除的文件名,并查找对应的文件号Y该文件不存在N确定当前用户的用户号该文件可以被删除?(不是protect型的)该文件是protect的,不能打开NY该文件已经打开?该文件已经打开,不能删除YN删除文件确定文件路径删除的后面的文件向前移删除的后面的文件向前移该用户的文件总数-1返回主函数把删除后的地址号置为未用【源程序清单】#include"stdio.h"#include"string.h"#include"conio.h"#include"stdlib.h"#defineMAXNAME25/*mfdname,ufdname,filename的最大长度*/#defineMAXCHILD50/*最大的子文件个数*/#defineMAX(MAXCHILD*MAXCHILD)/*物理地址计数fpaddrno的最大长度*/typedefstruct/*结构体OSFILE(文件)*/{ intfpaddr;/*文件的物理地址号0,1,2...*/ intflength;/*文件的长度*/ intfmode;/*文件模式:0-ReadOnly;1-WriteOnly;2-ReadandWrite;3-protrcted;*/ charfname[MAXNAME];/*文件名*/}OSFILE;typedefstruct/*结构体OSUFD(用户目录)*/{ charufdname[MAXNAME];/*ufd的名字*/ OSFILEufdfile[MAXCHILD];/*ufd自己的文件*/}OSUFD;typedefstruct/*结构体OSUFD'LOGIN(用户注册)*/{ charufdname[MAXNAME];/*ufd的名字*/ charufdpword[8];/*ufd的密码*/}OSUFD_LOGIN;typedefstruct/*文件打开模式*/{ intifopen;/*ifopen:0-close,1-open*/ intopenmode;/*0-readonly,1-writeonly,2-readandwrite,3-protected*/}OSUFD_OPENMODE;OSUFD*ufd[MAXCHILD];/*ufd及ufd自己的文件(指针型)*/OSUFD_LOGINufd_lp;/*建立了一个OSUFD_LOGIN型的ufd_lp*/intucount=0;/*mfd的ufd的个数*/intfcount[MAXCHILD];/*ufd自己的文件个数*/intloginsuc=0;/*是否成功登陆*/charusername[MAXNAME];/*记录注册的用户名*/chardirname[MAXNAME];/*记录文件当前的目录*/intfpaddrno[MAX];/*记录文件的物理地址num*/OSUFD_OPENMODEifopen[MAXCHILD][MAXCHILD];/*创建一个OSUFD_OPENMODE型的数组用于记录每个文件的状态(打开/关闭)*/FILE*fp_mfd,*fp_ufd,*fp_file_p,*fp_file;/*定义FILE*型的文件指针,用于读文件*/voidclrscr()/*清屏*/{ system("cls");}voidmain(){ inti,choice1;/*choice录选择的命令的号*/ charchoice[50];/*选择表达式:dir,create,delete,open,delete,modify,read,write*/ intchoiceend=1;/*是否选择结束*/ char*rtrim(char*str);/*移除最右边的空格*/ char*ltrim(char*str);/*移除最左边的空格*/ voidLoginF();/*用户注册登录*/ voidDirF();/*显示文件系统的所有文件*/ voidCdF();/*改变路径*/ voidCreateF();/*创建文件*/ voidDeleteF();/*删除文件*/ voidModifyFM();/*改变文件模式*/ voidOpenF();/*打开文件*/ voidCloseF();/*关闭文件*/ voidReadF();/*读文件*/ voidWriteF();/*写文件*/ voidQuitF();/*退出文件系统*/ voidhelp(); if((fp_mfd=fopen("c:\\osfile\\mfd","rb"))==NULL)/*rb表示二进制读的方式打开,看他是否为空*/ { fp_mfd=fopen("c:\\osfile\\mfd","wb");/*rb表示二进制写的方式打开,没有相当于新创建一个mfd*/ fclose(fp_mfd); } for(i=0;i<MAX;i++) fpaddrno[i]=0;/*初始的时候将物理地址num设为0*/ clrscr();/*清屏*/ LoginF();/*用户注册登录*/ clrscr(); if(loginsuc==1)/*登陆成功*/ { while(1) { if(choiceend==1)/*正确命令*/ { printf("\n\nC:\\%s>",strupr(dirname)); } elseprintf("Badcommandorfilename.\nC:\\%s>",strupr(username));/*错误命令*/ gets(choice); strcpy(choice,ltrim(rtrim(strlwr(choice))));/*strlwr把输入的choice变为小写去掉空格后拷贝到choice*/ if(strcmp(choice,"dir")==0)/*根据用户不同的命令输入获得不同的choice1值*/ choice1=1; elseif(strcmp(choice,"create")==0)choice1=2; elseif(strcmp(choice,"delete")==0)choice1=3; elseif(strcmp(choice,"attrib")==0) choice1=4; elseif(strcmp(choice,"open")==0)choice1=5; elseif(strcmp(choice,"close")==0)choice1=6; elseif(strcmp(choice,"read")==0)choice1=7; elseif(strcmp(choice,"write")==0)choice1=8; elseif(strcmp(choice,"exit")==0)choice1=9; elseif(strcmp(choice,"cls")==0)choice1=10; elseif(strcmp(choice,"cd")==0)choice1=11; elseif(strcmp(choice,"help")==0)choice1=20; elsechoice1=12; switch(choice1)/*根据不同的输入的命令对应相应的命令*/ { case1: DirF();choiceend=1;break; case2:CreateF();choiceend=1;break; case3:DeleteF();choiceend=1;break; case4:ModifyFM();choiceend=1;break; case5:choiceend=1;OpenF();break; case6:choiceend=1;CloseF();break; case7:choiceend=1;ReadF(); break; case8:choiceend=1;WriteF();break; case9:printf("\nYouhaveexitedthissystem.\n");QuitF();exit(0);break;/*退出系统*/ case10:choiceend=1;clrscr();break; case11:CdF();choiceend=1;break; case20:help();choiceend=1;break; default:choiceend=0;/*其他错误命令则选择结束*/ } } } elseprintf("\nAccessdenied.\n");/*登陆不成功*/}voidhelp(void)/*帮助*/{ printf("\nTheCommandList\n"); printf("\nCdDirAttribCreatewriteReadOpenClsDeleteExitClose\n");}char*rtrim(char*str)/*移除右边的空格*/{ intn=strlen(str)-1;/*n为串长-1*/ while(n>=0) { if(*(str+n)!='')/*不是空格了,则下一个置为/0结束符*/ { *(str+n+1)='\0'; break; } else/*是空格,继续往回退*/ n--; } if(n<0)/*空串*/ str[0]='\0'; returnstr;}char*ltrim(char*str)/*移除左边的空格*/{ char*rtrim(char*str); strrev(str);/*将str字符串反转*/ rtrim(str);/*移除右边的空格*/ strrev(str);/*将str字符串再反转回来*/ returnstr;}voidLoginF()/*用户注册登录*/{ charloginame[MAXNAME],loginpw[9],logincpw[9],str[50]; inti,j,flag=1; chara[25]; intfindout;/*注册用户是否存在1为存在*/ char*rtrim(char*str);/*移除右边的空格*/ char*ltrim(char*str);/*移除左边的空格*/ voidInputPW(char*password);/*输入密码并使用'*'代替*/ voidSetPANo(intRorW);/*设置物理地址num*/ while(1) { findout=0; printf("\n\nLoginName:"); gets(loginame); ltrim(rtrim(loginame));/*移除空格*/ fp_mfd=fopen("c:\\osfile\\mfd","rb");/*rb表示以二进制读的方式打开mfd*/ for(i=0;fread(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd)!=0;i++)/*fread是从mfd中读,是否有用户可以读出,有4个参数分别是读出的存储缓冲区、读的大小、读出的最大数量、文件指针*/ { if(strcmp(strupr(ufd_lp.ufdname),strupr(loginame))==0)/*检测转为大写的用户名是否存在*/ { findout=1;/*用户已存在*/ strcpy(logincpw,ufd_lp.ufdpword);/*把已存在的密码ufd_lp.ufdpword拷贝到logincpw*/ } } fclose(fp_mfd);/*关闭文件*/ if(findout==1)/*用户已存在的情况*/ { printf("LoginPassword:"); InputPW(loginpw);/*输入密码并使用'*'代替*/ if(strcmp(loginpw,logincpw)==0)/*如果用户输入的密码和已存在的相同*/ { strcpy(username,strupr(loginame));/*把输入的用户名转成大写拷贝到username*/ strcpy(dirname,username);/*把用户名拷贝到dirname*/ fp_mfd=fopen("c:\\osfile\\mfd","rb");/*以二进制读的方式打开文件*/ for(j=0;fread(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd)!=0;j++)/*fread是从mfd中读,是否有用户可以读出,有4个参数分别是读出的存储缓冲区、读的大小、读出的最大数量、文件指针*/ { strcpy(str,"c:\\osfile\\"); strcat(str,ufd_lp.ufdname);/*str为用户目录的路径*/ ufd[j]=(OSUFD*)malloc(sizeof(OSUFD));/*分配建立一个新的ufd*/ strcpy(ufd[j]->ufdname,strupr(ufd_lp.ufdname));/*ufdname写入ufd结构体的ufdname*/ fp_ufd=fopen(str,"rb");/*打开这个用户目录文件*/ fcount[j]=0;/*新创建的ufd中的文件的个数为0*/ for(i=0;fread(&ufd[j]->ufdfile[i],sizeof(OSFILE),1,fp_ufd)!=0;i++,fcount[j]++)/*fread是从mfd中读,是否有用户可以读出,有4个参数分别是读出的存储缓冲区、读的大小、读出的最大数量、文件指针*/ {/*j用户的文件个数也要+1*/ ifopen[j][i].ifopen=0; ifopen[j][i].openmode=4;/*初始化所有的文件打开模式(不是文件自身的模式)*/ } fclose(fp_ufd);/*关闭这个ufd*/ } fclose(fp_mfd);/*关闭mfd*/ ucount=j;/*mfd中的ufd个数*/ SetPANo(0);/*设置物理地址号(表示该地址号是否被用了0-未用,1-已用)*/ printf("\n\nLoginsuccessful!WelcometothisFileSystem\n\n"); loginsuc=1;/*登陆成功*/ return; } else/*输入密码不正确*/ { printf("\n\n"); flag=1;/*标记*/ while(flag) { printf("LoginFailed!PasswordError.TryAgain(Y/N):"); gets(a); ltrim(rtrim(a)); if(strcmp(strupr(a),"Y")==0)/*判断是否重新输入*/ { loginsuc=0;flag=0; } elseif(strcmp(strupr(a),"N")==0) { loginsuc=0;flag=0;return; } } } } else/*用户不存在的情况*/ { printf("NewPassword(<=8):"); InputPW(loginpw);/*输入新密码并用'*'代替*/ printf("\nConfirmPassword(<=8):"); InputPW(logincpw);/*再次输入密码并用'*'代替*/ if(strcmp(loginpw,logincpw)==0)/*两次输入的密码相同*/ { strcpy(ufd_lp.ufdname,strupr(loginame)); strcpy(ufd_lp.ufdpword,loginpw);/*把输入的用户名、密码记录到ufd_lp*/ fp_mfd=fopen("c:\\osfile\\mfd","ab");/*以二进制接着写的方式打开mfd*/ fwrite(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd);/*把ufd_lp指向的内容接着写入到mfd中*/ fclose(fp_mfd); strcpy(username,strupr(loginame)); strcpy(dirname,loginame); strcpy(str,"c:\\osfile\\"); strcat(str,username);/*形成路径c:\\osfile\\用户名*/ if((fp_ufd=fopen(str,"rb"))==NULL)/*以二进制读的方式打开,如果为空*/ { fp_ufd=fopen(str,"wb");/*以二进制写的方式打开,即新创建用户名文件*/ fclose(fp_ufd); } fp_mfd=fopen("c:\\osfile\\mfd","rb");/*以读的方式打开mfd*/ for(j=0;fread(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd)!=0;j++)/*fread是从mfd中读,是否有用户可以读出,有4个参数分别是读出的存储缓冲区、读的大小、读出的最大数量、文件指针*/ { strcpy(str,"c:\\osfile\\"); strcat(str,ufd_lp.ufdname);/*str为用户目录的路径*/ ufd[j]=(OSUFD*)malloc(sizeof(OSUFD));/*分配建立一个新的ufd*/ strcpy(ufd[j]->ufdname,strupr(ufd_lp.ufdname));/*ufdname写入ufd结构体的ufdname*/ fp_ufd=fopen(str,"rb"); for(i=0;fread(&ufd[j]->ufdfile[i],sizeof(OSFILE),1,fp_ufd)!=0;i++,fcount[j]++)/*fread是从mfd中读,是否有用户可以读出,有4个参数分别是读出的存储缓冲区、读的大小、读出的最大数量、文件指针*/ { /*j用户的文件个数也要+1*/ ifopen[j][i].ifopen=0;/*初始化所有的文件打开模式(不是文件自身的模式)*/ ifopen[j][i].openmode=4; } fclose(fp_ufd); } fclose(fp_mfd);/*关闭mfd*/ ucount=j;/*mfd中的ufd个数*/ SetPANo(0);/*设置物理地址号(表示该地址号是否被用了0-未用,1-已用)*/ printf("\n\nLoginsuccessful!WelcometothisFileSystem\n\n"); loginsuc=1;/*登陆成功*/ return; } else/*两次输入的密码不同*/ { printf("\n\n"); flag=1; while(flag) { printf("LoginFailed!PasswordError.TryAgain(Y/N):"); gets(a); ltrim(rtrim(a)); if(strcmp(strupr(a),"Y")==0) { loginsuc=0; flag=0; } elseif(strcmp(strupr(a),"N")==0) { loginsuc=0; flag=0; } } } } }}voidSetPANo(intRorW)/*设置物理地址号(表示该地址号是否被用了0-未用,1-已用),RorW是0-read,1-write*/{ inti,j; if(RorW==0)/*以读的方式,已存在的用户*/ { if((fp_file_p=fopen("c:\\osfile\\file\\file_p","rb"))==NULL)/*如果以二进制读的方式打开file_p文件找不到*/ { fp_file_p=fopen("c:\\osfile\\file\\file_p","wb");/*以二进制写的方式打开,即创建一个file_p*/ fclose(fp_file_p); } fp_file_p=fopen("c:\\osfile\\file\\file_p","rb");/*以二进制读的方式打开file_p*/ for(i=0;fread(&j,sizeof(int),1,fp_file_p)!=0;i++)/*fread是从fp_file中读,是否有文件号可以读出,有4个参数分别是读出的存储缓冲区、读的大小、读出的最大数量、文件指针*/ fpaddrno[j]=1;/*将第j个文件物理地址号置为1,已经用了*/ } else/*以写的方式*/ { fp_file_p=fopen("c:\\osfile\\file\\file_p","wb");/*以二进制写的方式打开*/ for(i=0;i<MAX;i++) if(fpaddrno[i]==1)/*第i个文件已存在*/ fwrite(&i,sizeof(int),1,fp_file_p);/*记录物理地址号到fp_file*/ } fclose(fp_file_p);}voidInputPW(char*password)/*输入密码并使用'*'代替*/{ intj; for(j=0;j<=7;j++)/*8位密码*/ { password[j]=getch();/*依次读入*/ if((int)(password[j])!=13)/*!=回车*/ { if((int)(password[j])!=8)/*!=退格*/ putchar('*'); else/*=退格*/ { if(j>0) { j--; j--; putchar('\b'); putchar(''); putchar('\b'); } elsej--; } } else/*=回车,密码输入结束*/ { password[j]='\0'; break; } } password[j]='\0';}voidDirF()/*显示文件系统的所有文件*/{ inti,j,count=0; charsfmode[25],sfpaddr[25],str[25]; intExistD(char*dirname);/*目录是否存在,存在-i个,不存在-0*/ clrscr();/*清屏*/ if(strcmp(strupr(ltrim(rtrim(dirname))),"")!=0)/*dirname不为空,显示的是当前用户的所有文件*/ { printf("\n\nC:\\%s>dir\n",dirname); printf("\n%10s%15s%14s%8s%18s\n","FileName","FileAddress","FileLength","Type","FileMode"); j=ExistD(dirname);/*该目录是第几个目录*/ for(i=0;i<fcount[j];i++) { if((i%16==0)&&(i!=0))/*满16个清屏*/ { printf("\nPressanykeytocontinue.."); getch(); clrscr(); printf("\n%10s%15s%14s%8s%18s\n","FileName","FileAddress","FileLength","Type","FileMode"); } itoa(ufd[j]->ufdfile[i].fpaddr,str,10);/*将整形转换为字符串型*/ strcpy(sfpaddr,"file"); strcat(sfpaddr,str);/*连接成为物理地址filex*/ if(ufd[j]->ufdfile[i].fmode==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("%10s%15s%14d%8s%18s\n",ufd[j]->ufdfile[i].fname,sfpaddr,ufd[j]->ufdfile[i].flength,"<FILE>",sfmode); } printf("\n%3dfile(s)\n",fcount[j]); } else/*dirname为空,显示的是上一层目录(主目录)的所有文件(各个用户文件夹)*/ { printf("\n\nC:\\>dir\n"); printf("\n%14s%18s%8s\n","DirName","OwnFileCount","Type");/*包括3个项*/ for(i=0;i<ucount;i++) { if((i%16==0)&&(i!=0))/*满16个清屏*/ { printf("\nPressanykeytocontinue..."); 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); }}intExistD(char*dirname)/*目录是否存在,存在返回第i个,不存在返回-1*/{ inti; intexist=0; for(i=0;i<ucount;i++) if(strcmp(strupr(ufd[i]->ufdname),strupr(dirname))==0) { exist=1; break; } if(exist)return(i);/*返回用户目录个数*/ elsereturn(-1);}voidCdF()/*改变路径*/{ chardname[MAXNAME]; char*rtrim(char*str);/*移除左边的空格*/ char*ltrim(char*str);/*移除右边的空格*/ intExistD(char*filename);/*目录是否存在,存在-i个,不存在-0*/ printf("\nPleaseinputDirName(..-Previousdir;DirNAME-cd[DirNAME]):"); gets(dname); ltrim(rtrim(dname));/*移除空格*/ if(ExistD(dname)>=0)/*如果存在用户目录,是>第0个目录*/ strcpy(dirname,strupr(dname));/*用户目录名拷贝到当前目录*/ elseif(strcmp(strupr(dname),"..")==0)/*如果输入的dname是..*/ strcpy(ltrim(rtrim(dirname)),"");/*将当前目录变为空*/ elseprintf("\nError.\'%s\'doesnotexist.\n",dname);/*否则不存在*/}voidCreateF()/*创建文件*/{ intfpaddrno,flag=1,i; charfname[MAXNAME],str[50],str1[50],a[25]; charfmode[25]; char*rtrim(char*str);/*移除左边的空格*/ char*ltrim(char*str);/*移除右边的空格*/ intFindPANo();/*找出物理地址号*/ intWriteF1();/*写文件*/ intExistF(char*filename);/*是否存在文件返回文件号(第几个),存在-i,不存在-0*/ intExistD(char*dirname); if(strcmp(strupr(dirname),strupr(username))!=0)/*如果username和当前目录不同则不能创建*/ { printf("\nError.Youmustcreatefileinyourowndir.\n"); } else/*可以创建*/ { printf("\nPleaseinputFileName:"); gets(fname);/*文件名*/ ltrim(rtrim(fname));/*去空格*/ if(ExistF(fname)>=0)/*文件号已存在*/ { printf("\nError.Name\'%s\'hasalreadyexisted.\n",fname); return; } 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) { i=ExistD(username);/*判断该用户是否存在,返回是第几个*/ strcpy(ufd[i]->ufdfile[fcount[i]].fname,fname);/*将这个新的文件名写入ufd[i]->ufdfile[最后一个记录的下一个].fname*/ ufd[i]->ufdfile[fcount[i]].fpaddr=fpaddrno;/*将新分配的物理地址号写入ufd[i]->ufdfile[最后一个记录的下一个].fpaddrno*/ ufd[i]->ufdfile[fcount[i]].fmode=atoi(fmode);/*将新文件的模式写入ufd[i]->ufdfile[最后一个记录的下一个].fmode*/ ifopen[i][fcount[i]].ifopen=0;/*初始化ifopen模式*/ ifopen[i][fcount[i]].openmode=4; strcpy(str,"c:\\osfile\\file\\file"); itoa(fpaddrno,str1,10);/*转为字符串*/ strcat(str,str1);/*连接形成完整的路径*/ fp_file=fopen(str,"wb");/*以二进制写的形式打开以str为目录的文件,没有就创建,有就清空内容*/ fclose(fp_file); fcount[i]++;/*第i个用户的文件数+1*/ 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+"); ufd[i]->ufdfile[fcount[i]-1].flength=WriteF1();/*调用WriteF1()写文件,返回值是文件长度*/ flag=0; } elseif(strcmp(strupr(a),"N")==0)/*不输入文本,结束*/ { flag=0; } } printf("\n\'%s\'hasbeencreatedsuccessfully!\n",fname); } else/*无分配的地址号了(返回的-1)*/ { printf("\nFail!NoDiskSpace.Pleaseformatyourdisk.\n"); return; } } else/*选择0-3外*/ { printf("\nError.FileMode\'sRangeis0-3n"); return; } } }}intExistF(char*filename)/*文件是否存在,返回返回第i个,不存在返回-1*/{ inti,j; intexist=0; intExistD(char*dirname); j=ExistD(dirname);/*第j个用户*/ for(i=0;i<fcount[j];i++) if(strcmp(strupr(ufd[j]->ufdfile[i].fname),strupr(filename))==0) { exist=1; break; } if(exist) return(i); else return(-1);}intFindPANo()/*找出要分配的物理地址号*/{ inti; for(i=0;i<MAX;i++) if(fpaddrno[i]==0) { fpaddrno[i]=1;/*第i个未用,将第i个的物理地址num设为1*/ break; } if(i<MAX) return(i);/*返回标号*/ else return(-1);}intWriteF1()/*创建文件中的写文件*/{ intlength=0; charc; printf("Pleaseinputtext(\'#\'standsforend):\n"); while((c=getchar())!='#') { fprintf(fp_file,"%c",c); if(c!='\n') length++; } getchar(); fprintf(fp_file,"\n"); fclose(fp_file); return(length);/*文件长度*/}voidModifyFM()/*改变文件模式*/{ charfname[MAXNAME],str[50]; inti,k; charfmode[25]; char*rtrim(char*str); char*ltrim(char*str);/*删除空格*/ voidInputPW(char*password);/*输入密码并用*代替*/ voidSetPANo(intRorW);/*设置物理地址num*/ intExistF(char*filename);/*文件名是否存在,Exist-i,NotExist-0*/ intExistD(char*dirname); if(strcmp(strupr(dirname),strupr(username))!=0)/*用户名和当前目录不同*/ { printf("\nError.Youcanonlymodifyfilemodeinyourselfdir.\n"); } 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\'isinopenstatus.Closeitbeforemodify.\n",fname); } else/*是关闭的*/ { if(ufd[k]->ufdfile[i].fmode==0)/*现存的文件模式*/ strcpy(str,"readonly"); elseif(ufd[k]->ufdfile[i].fmode==1) strcpy(str,"writeonly"); elseif(ufd[k]->ufdfile[i].fmode==2) strcpy(str,"readandwrite"); elsestrcpy(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)/*改为readonly*/ { ufd[k]->ufdfile[i].fmode=0; printf("\n\'%s\'hasbeenmodifiedtoREADONLYmodesuccessfully.\n",fname); } elseif(strcmp(fmode,"1")==0)/*改为writeonly*/ { ufd[k]->ufdfile[i].fmode=1; printf("\n\'%s\'hasbeenmodifiedtoWRITEONLYmodesuccessfully.\n",fname); } elseif(strcmp(fmode,"2")==0)/*改为readandwrite*/ { ufd[k]->ufdfile[i].fmode=2; printf("\n\'%s\'hasbeenmodifiedtoREADANDWRITEmodesuccessfully.\n",fname); } elseif(strcmp(fmode,"3")==0)/*改为Protect*/ { ufd[k]->ufdfile[i].fmode=3; printf("\n\'%s\'hasbeenmodifiedtoPROTECTmodesuccessfully.\n",fname); } else { printf("\nError.\'%s\'isnotmodified.\n",fname); } } } else/*该文件不存在*/ { printf("\nError.\'%s\'dosenotexist.\n",fname); } }}voidReadF()/*读文件*/{ inti,k,n=0; charfname[MAXNAME]; charstr[255],str1[255],c; char*rtrim(char*str); char*ltrim(char*str);/*移除空格*/ intExistF(char*filename);/*文件名是否存在,Exist-i,NotExist-0*/ intExistD(char*dirname); if(strcmp(strupr(ltrim(rtrim(dirname))),"")==0)/*如果当前目录为空(主目录)*/ { printf("\nError.Pleaseconverttoufddirbeforeread.\n");/*必须转到用户目录下*/ return; } printf("\nCaution:Openfilefirst\n\n"); printf("OpenedFile(s)List:\n"); k=ExistD(dirname);/*第几个用户*/ for(i=0;i<fcount[k];i++)/*第k个用户有多少个文件*/ { if(ifopen[k][i].ifopen==1)/*如果文件已打开*/ if((ifopen[k][i].openmode==0)||(ifopen[k][i].openmode==2))/*可以读*/ { printf("%15s",ufd[k]->ufdfile[i].fname);/*输出这个已打开的可读的文件名*/ n++; } if((n%4==0)&&(n!=0)) printf("\n");/*4个换行*/ } printf("\n%dfilesopenned.\n",n); if(n==0)/*无打开的文件,返回*/ return; if(n!=0)/*有打开的文件*/ { printf("\nPleaseinputFileName:"); gets(fname); ltrim(rtrim(fname)); i=ExistF(fname);/*第几个文件号*/ if(i>=0)/*文件存在*/ { if(ifopen[k][i].ifopen==1)/*已打开*/ { if((ifopen[k][i].openmode==0)||(ifopen[k][i].openmode==2))/*可读*/ { itoa(ufd[k]->ufdfile[i].fpaddr,str,10);/*文件号整形转为字符串*/ strcpy(str1,"file"); strcat(str1,str); strcpy(str,"c:\\osfile\\file\\"); strcat(str,str1);/*str形成路径c:\\osfile\\file\\filex*/ fp_file=fopen(str,"rb");/*以二进制读的方式打开filex文件*/ fseek(fp_file,0,0);/*指针移到0*/ printf("\nThetextis:\n\n"); printf(""); while(fscanf(fp_file,"%c",&c)!=EOF)/*从file中一个一个字符读出来*/ if(c=='\n')/*读出的是回车*/ printf("\n");/*输出回车*/ else/*读出的是其他*/ printf("%c",c);/*输出其他字符*/ printf("\n\n%dLength.\n",ufd[k]->ufdfile[i].flength);/*显示出该文件长度*/ fclose(fp_file); } else/*不可读*/ { printf("\nError.\'%s\'hasbeenopenedwithWRITEONLYmode.Itisn\'tread.\n",fname); } } else/*未打开*/ { printf("\nError.\'%s\'isinclosingstatus.Pleaseopenitbeforeread\n",fname); } } else/*文件不存在*/ { printf("\nError.\'%s\'doesnotexist.\n",fname); } }}voidQuitF()/*退出文件系统*/{ inti,j; charstr[50]; voidSetPANo(intRorW); SetPANo(1);/*设置物理地址号(表示该地址号是否被用了0-未用,1-已用),RorW是0-read,1-write*/ if(fp_mfd!=NULL) fclose(fp_mfd); if(fp_ufd!=NULL) fclose(fp_ufd); if(fp_file!=NULL) fclose(fp_file);/*关闭文件*/ for(j=0;j<ucount;j++) { strcpy(str,"c:\\osfile\\"); strcat(str,ufd[j]->ufdname); ltrim(rtrim(str));/*去除空格*/ fp_ufd=fopen(str,"wb");/*二进制写的方式打开ufd文件,相当于清空内容*/ fclose(fp_ufd);/*关闭*/ fp_ufd=fopen(str,"ab");/*二进制接着写的方式打开ufd文件*/ for(i=0;i<fcount[j];i++) fwrite(&ufd[j]->ufdfile[i],sizeof(OSFILE),1,fp_ufd);/*将文件信息写入ufd*/ fclose(fp_ufd); }}voidOpenF()/*打开文件*/{ charfname[MAXNAME]; inti,k; if(strcmp(strupr(dirname),strupr(username))!=0)/*用户名和当前目录不同*/ { printf("\nError!Youcanonlyopenfileinyourselfdir.\n"); } 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.file\'%s\'hadbeenopened,itcannotbeopenedagain.\n",fname); } else/*该文件还未打开*/ { if((ufd[k]->ufdfile[i].fmode==0)||(ufd[k]->ufdfile[i].fmode==1)||(ufd[k]->ufdfile[i].fmode==2))/*该文件的属性是可以被打开的*/ { ifopen[k][i].ifopen=1;/*打开,将ifopen设为1*/ ifopen[k][i].openmode=(ufd[k]->ufdfile[i].fmode);/*将ifopen.openmode设为该文件的模式*/ printf("\'%s\'hasbeenopenedsuccessfully!",fname); } else/*保护模式的文件不能被打开*/ printf("\n\'%s\'isaprotectedfile,itcannotbeopened.",fname); } } else/*文件不存在*/ { printf("\nError.\'%s\'dosenotexist.\n",fname); } }}voidCloseF()/*关闭文件*/{ charfname[MAXNAME]; inti,k; if(strcmp(strupr(dirname),strupr(username))!=0)/*用户名和当前目录不同*/ { printf("\nError.Youcanonlymodifyfilemodeinyourselfdir.\n"); } else/*用户名和当前目录相同了*/ { printf("\nPleaseinputFileName:"); gets(fname); ltrim(rtrim(fname));/*去除空格*/ i=ExistF(fname);/*文件是否存在并返回第几个文件号*/ if(i>=0)/*文件存在*/ { k=ExistD(username);/*根据用户名确定用户号*/ if(ifopen[k][i].ifopen==0)/*该文件未打开*/ { printf("\nError.\'%s\'hasbeenclosed.youcannotcloseitagain.\n",fname); } else/*该文件已打开*/ { ifopen[k][i].ifopen=0;/*关闭,置为0*/ ifopen[k][i].openmode=4;/*修改打开模式为初始的打开模式*/ printf("\'%s\'hasbeenclosedsuccessfully!",fname); } } else/*文件不存在*/ { printf("\nError.\'%s\'dosenotexist.\n",fname); } }}voidDeleteF()/*删除文件*/{ charfname[MAXNAME]; inti,k,x; charstr[255],str1[255]; if(strcmp(strupr(dirname),strupr(username))!=0)/*用户名和当前目录不同*/ { printf("\nError.Youcanonlydeletefileinyourselfdir.\n"); } else/*用户名和当前目录相同了*/ { printf("\nPleaseinputFileName:"); gets(fname); ltrim(rtrim(fname));/*去除空格*/ i=ExistF(fname);/*文件是否存在并返回第几个文件号*/ if(i>=0)/*文件存在*/ { k=ExistD(username);/*根据用户名确定用户号*/ if(ufd[k]->ufdfile[i].fmode==3)/*该文件的属性是protect的*/ { printf("\n\'%s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论