操作系统课程设计-简单多用户文件系统
- 格式:doc
- 大小:199.00 KB
- 文档页数:21
模拟一个简单二级文件管理系统设计目的:通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。
设计内容:模拟一个简单二级文件管理系统一、实验内容描述1 实验目标本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现.2 实验要求为DOS系统设计一个简单的二级文件系统.要求做到以下几点:①可以实现下列命令:login 用户登录dir 列文件目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件②列目录时要列出文件名、物理地址、保护码和文件长度.③源文件可以进行读写保护.二、程序主要内容1设计思路程序中要求每个用户在登陆后才可对其拥有的文件进行操作,用户对于其他用户的文件无操作权.文件操作包括浏览、创建、删除、打开、关闭、阅读、写入、修改模式.其他操作包括新建用户、帮助、用户登入、用户登出、退出系统.在程序文件夹下有个名为“file”的系统根目录,此目录下包括:一个名为“mfd”的文件,记录所有注册过的帐号及密码;用户文件,以用户名作为文件名,内容为其拥有的文件名及属性;一个名为“keiji”的文件夹.“keiji”文件夹中包括:“file.p”指针文件,记录所有已用的物理地址;一些以物理地址为名的文件,内容为文件内容.2 数据结构file结构体系统文件数据结构:fpaddrint,文件的物理地址、flengthint,文件长度、fmodeint,文件模式0.只读;1.可写;2.可读写;3.保护、fname[]char,文件名;filemode结构体文件状态数据结构:isopenint,文件当前状态,0.关闭;1.打开、modeint,文件模式0.只读;1.可写;2.可读写;3.初始化;user结构体用户信息数据结构:uname[]char,用户名、upassword[]char,用户密码;userfile结构体用户文件数据结构:uname[]char,用户名、ufile[]file,用户拥有的文件数组.代码:#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <time.h>#include <string.h>#define MaxUser 100 //定义最大MDF主目录文件#define MaxDisk 512*1024 //模拟最大磁盘空间#define commandAmount 12 //对文件操作的指令数//存储空间管理有关结构体和变量char disk[MaxDisk]; //模拟512K的磁盘存储空间typedef struct distTable //磁盘块结构体{int maxlength;int start;int useFlag;distTable *next;}diskNode;diskNode *diskHead;struct fileTable //文件块结构体{char fileName[10];int strat; //文件在磁盘存储空间的起始地址int length; //文件内容长度int maxlength; //文件的最大长度char fileKind[3]; //文件的属性——读写方式struct tm *timeinfo;bool openFlag; //判断是否有进程打开了该文件//fileTable *next;};//两级目录结构体typedef struct user_file_directory //用户文件目录文件UFD {//char fileName[10];fileTable *file;user_file_directory *next;}UFD;//UFD *headFile;typedef struct master_file_directory //主文件目录MFD{char userName[10];char password[10];UFD *user;}MFD;MFD userTable[MaxUser];int used=0; //定义MFD目录中用已有的用户数//文件管理void fileCreate(char fileName[],int length,char fileKind[]); //创建文件void fileWrite(char fileName[]); //写文件void fileCat(char fileName[]); //读文件void fileRen(char fileName[],char rename[]); //重命名文件void fileFine(char fileName[]); //查询文件void fileDir(char UserName[]); //显示某一用户的所有文件void fileClose(char fileName[]); //关闭已打开的文件void fileDel(char fileName[]); //删除文件void chmod(char fileName[],char kind[]); //修改文件的读写方式int requestDist(int &startPostion,int maxLength); //磁盘分配查询void initDisk(); //初始化磁盘void freeDisk(int startPostion); //磁盘空间释放void diskShow(); //显示磁盘使用情况//用户管理void userCreate();int login();int userID=-1; //用户登录的ID号,值为-1时表示没有用户登录int main(){char order[commandAmount][10];strcpy(order[0],"create");strcpy(order[1],"rm");strcpy(order[2],"cat");strcpy(order[3],"write");strcpy(order[4],"fine");strcpy(order[5],"chmod");strcpy(order[6],"ren");strcpy(order[7],"dir");strcpy(order[8],"close");printf("————————————————————————————————————————\n");printf("please imput 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){printf("您输入的命令有误,请重新输入\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]!=' ';i++,k++)command_str3[k]=command[i];command_str3[k]='\0';k=i;j=1;length=0; //初始化文件长度for(i=strlen(command_str3)-1;i>=0;i--) //把字符串转换为十进制{length+=(command_str3[i]-48)*j;j*=10;}for(i=k+1,k=0;command[i]!=' '&&command[i]!='\0';i++,k++)command_str4[k]=command[i];command_str4[k]='\0';fileCreate(command_str2,length,command_str4);break;case 1:fileDel(command_str2);break;case 2:fileCat(command_str2);break;case 3:fileWrite(command_str2);break;case 4:fileFine(command_str2);break;case 5:for(i=k+1,k=0;command[i]!=' '&&command[i]!='\0';i++,k++)command_str3[k]=command[i];command_str3[k]='\0';chmod(command_str2,command_str3);break;case 6:for(i=k+1,k=0;command[i]!='\0';i++,k++)command_str3[k]=command[i];command_str3[k]='\0';fileRen(command_str2,command_str3);break;case 7:fileDir(command_str2);break;case 8:fileClose(command_str2);break;case 9: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 10:exit(0);break;case 11:diskShow();break;}}}return 0;}void userCreate(){char c;char userName[10];int i;if(used<MaxUser){printf("请输入用户名:");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)){printf("\n");printf("该用户名已存在,创建用户失败\n");system("pause");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");}else{printf("创建用户失败,用户已达到上限\n");system("pause");}fflush(stdin);}int login(){char name[10],psw[10];char c;int i,times;printf("请输入用户名:");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){printf("\n您输入的用户名不存在\n");system("pause");return -1;}for(times=0;times<3;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;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;}fflush(stdin);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&&p->maxlength>maxLength){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 fileCreate(char fileName[],int length,char fileKind[]){//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);strcpy(fileNode->file->fileKind,fileKind);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{p=userTable[userID].user->next;while(p->next) p=p->next;p->next=fileNode;}printf("创建文件成功\n");system("pause");}{printf("磁盘空间已满或所创建文件超出磁盘空闲容量,磁盘空间分配失败\n");system("pause");}}void freeDisk(int startPostion){diskNode *p;for(p=diskHead;p!=NULL;p=p->next){if(p->start==startPostion)break;}p->useFlag=false;}void fileDel(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");}elseprintf("该文件已被进程打开,删除失败\n");system("pause");}}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");system("pause");}}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");printf("%s已被read进程打开,请用close命令将其关闭\n",p->file->fileName);system("pause");}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("文件写入成功,请用close命令将该文件关闭\n");system("pause");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");system("pause");}}void fileFine(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){printf("********************************************\n");printf("文件名:%s\n",p->file->fileName);printf("文件长度:%d\n",p->file->maxlength);printf("文件在存储空间的起始地址:%d\n",p->file->strat);printf("文件类型:%s\n",p->file->fileKind);printf("创建时间:%s\n",asctime(p->file->timeinfo));printf("********************************************\n");system("pause");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");system("pause");}}void chmod(char fileName[],char kind[]){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){strcpy(p->file->fileKind,kind);printf("修改文件类型成功\n");system("pause");}else{printf("没有找到该文件,请检查输入的文件名是否正确\n");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 fileDir(char userName[]){UFD *p;int i,k;for(i=0;i<MaxUser;i++){if(!strcmp(userTable[i].userName,userName)){k=i;break;}}if(i==MaxUser){printf("没有找到该用户,请检查输入用户名是否正确\n");system("pause");return;}else{p=userTable[k].user->next;printf("************************************************************************* *******\n");printf("文件名文件长度文件在磁盘的起始地址文件类型创建时间\n");for(;p!=NULL;p=p->next)printf("%s %d %d %s %s",p->file->fileName, p->file->maxlength,p->file->strat,p->file->fileKind,asctime(p->file->timeinfo));printf("************************************************************************* *******\n");system("pause");}}void diskShow(){diskNode *p;int i=0,unusedDisk=0;printf("************************************************************************* **\n");printf(" 盘块号起始地址容量(bit) 是否已被使用\n");for(p=diskHead;p!=NULL;p=p->next,i++){if(p->useFlag==false) unusedDisk+=p->maxlength;printf(" %d %d %d %d \n",i,p->start,p->maxlength,p->useFlag);}printf("************************************************************************* **\n");printf("磁盘空间总容量:512*1024bit 已使用:%dbit 末使用:%dbit\n\n",MaxDisk-unusedDisk,unusedDisk);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");}}运行结果视图:(略)。
long next; //下个文件块地址};6.设计结果与分析(1)、使用Microsoft Visual C++6.0建立文件系统所需的编码文件,建立完成后进行编译,经多次修改无误后运行进入系统。
首次进入系统,还没有文件系统,则会提示生成虚拟磁盘文件,格式化文件系统,创建分区,并初始化分区。
系统的初始化要完成文件系统的建立,包括以下几部分:请求内存、设置位示图、初始化文件索引、初始化文本块链表、初始化系统的当前状态、创建一个根目录做为系统的根。
生成虚拟磁盘文件如图8所示。
图8 生成虚拟磁盘文件(2)、系统初始化后,没有用户,提示创建用户,在输入用户名及两次登录密码后,验证用户名是否有效,若有效则将用户名及登录密码添加进入存储系统,使用户下次能正常登录系统,新用户创建完成。
用户创建成功后出现对系统操作的菜单,此时菜单中的注册菜单功能即创建新用户的过程。
创建新用户如图9所示。
图9 创建新用户(3)、用户登录,验证登录用户的身份,用户登录成功后会初始化当前用户等一系列的系统当前信息,显示当前用户下的所有文件及其详细信息,同时显示对文件操作的菜单。
如图10所示。
图10 用户登录及文件操作菜单(4)、新注册的用户默认为没有文件,选择创建文件功能项,输入文件名称,文件长度及文件的锁定状态,文件新建成功,并且每次对文件操作后显示当前用户的所有文件和操作菜单。
新建文件功能如图11所示。
图11 新建文件(5)、对文件查看,默认创建的时候用0填充文件内容,如图12所示。
图12 查看文件内容(6)、接收修改文件内容命令后,等待用户输入要修改的文件名,然后输入修改的内容,用户输入完毕,按回车键(Enter),结束修改。
修改文件内容如图13所示。
图13 修改文件内容(7)、当新建的文件为锁定状态,不能被删除。
对文件的锁定进行装换,将锁定状态的文件转换成自由读写状态,用户可随意对文件进行删除操作。
图14 锁定状态转换(8)、当文件处于自由读写状态时可对文件进行删除操作,删除文件并不真正清理文件的物理存储内容,只是将文件的有效状态更改为无效。
课程设计报告课程名称:操作系统课程设计题目:多用户多级目录文件系统的实现姓名:系:专业:年级:学号:指导教师:职称:2011-2012学年第一学期目录1.设计思想说明 (1)2.系统结构说明 (1)3.数据结构说明 (2)3.1开发环境 (2)3.2数据存储 (2)3.3数据结构 (2)3.3.1数据块在内存中的物理结构 (2)3.3.2文件索引结构 (2)3.3.3文件系统中文件元素的结构(含文件夹和文件) (3)3.3.4文件系统结构 (3)3.3.5文件系统的当前运行状态 (4)3.3.6用户结构 (4)4.各主要模块的算法流程图 (4)4.1整体思路概述 (4)4.1.1login (用户登录) (4)4.1.2系统初始化 (5)4.1.3文件的创建: create (5)4.1.4文件的打开:open (6)4.1.5文件的读:read (7)4.1.6文件的写:write (8)4.1.7文件关闭:close (10)4.1.8删除文件:delete (10)4.1.9创建目录(建立子目录):mkdir (11)4.1.10改变当前目录:cd (12)4.1.11列出文件目录:dir (14)4.1.12退出:logout ......................... 错误!未定义书签。
4.2算法流程图................................... 错误!未定义书签。
5.使用说明书 (15)5.1登录 (15)5.2新建目录和列出文件目录 (16)5.3改变当前目录 (16)5.4文件的创建 (16)5.5文件的打开 (17)5.6文件的写 (17)5.7文件的读 (17)5.8文件的关闭 (17)5.9文件的删除 (17)5.10返回根目录 (18)5.11退出 (18)6.总结........................................... 错误!未定义书签。
操作系统课程设计报告专业:计算机信息处理学号: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系统中的文件系统是人们最感兴趣的,也是最成功的一部分。
计算机系课程设计实验报告课程名称操作系统课程设计实验学期 2012 至 2013 学年第 1 学期学生所在系部计算机与信息管理系年级 2010 专业班级计算机001班学生姓名学号任课教师实验成绩计算机系制一个简单的文件系统的详细设计一、实验目的(1)阅读并调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
(2)了解设计一个n个用户的文件系统,每个用户可以保存M个文件。
用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有create、delete、open、close、read、write等命令。
二、实验要求1、阅读所给文件系统源程序,并加注释(注释量达60%),2、修改、完善该系统,画出所设计的文件系统的详细流程图。
三、文件系统功能设计1. 功能设计该文件系统是一个多用户、多任务的文件系统。
对用户和用户的文件数目并没有上限。
也就是说该系统允许任何用户申请空间,而且在其目录下的文件数目并不做任何的限制。
该系统可以支持的操作命令如下:①bye——用户注销命令。
当使用该命令时,用户退出系统,注销该用户功能设计并回到登陆界面。
命令格式:bye②close——删除用户注册信息命令。
执行该命令后,用户在系统中的所有信息,包括该用户目录下的所有文件都被删除。
命令执行完成后返回登陆界面。
命令格式:close③create——在当前目录下创建一个文件,且该文件不能跟当前已有的文件重名。
该文件的管理信息登记在用户文件信息管理模块中。
执行完该命令后回到执行命令行。
命令格式:create>file1其中:“>”符为提示符,file1为要创建的文件名。
④delete——删除当前用户目录下的一个文件,命令执行完毕返回至命令行。
命令格式:delete>file1其中:file1为要删除的文件名。
⑤list——显示当前注册目录下的所有文件信息,包括文件名、文件长度、文件操作权限。
操作系统课程设计:文件系统一、引言文件系统是操作系统中的一个重要组成部分,负责管理计算机存储设备上的文件和目录。
一个高效可靠的文件系统对于操作系统和用户来说都至关重要。
在操作系统课程中,设计一个文件系统是一项重要的任务,可以帮助学生深入了解文件系统的原理和实现细节。
本文档将介绍一个简单的文件系统设计,旨在帮助初学者理解文件系统的基本概念和工作原理。
我们将首先介绍文件系统的基本概念,然后讨论文件系统的设计思路和关键组成部分。
最后,我们将讨论如何实现和测试文件系统。
二、文件系统的基本概念文件系统是操作系统提供的一种存储管理机制,用于将文件组织成有层次的结构并提供对文件的访问和管理。
在一个文件系统中,文件被组织成目录(或文件夹)的层次结构,用户可以使用文件路径来访问文件和目录。
文件系统通常提供以下功能: - 文件和目录的创建、删除和重命名 - 文件和目录的读取和写入 - 文件和目录的权限管理 - 文件的共享和保护 - 文件的存储管理三、设计思路在设计文件系统时,需要考虑以下几个关键方面:1. 文件系统的组织结构文件系统可以采用不同的组织结构,常见的包括层次结构、网络结构和日志结构。
在设计文件系统时,需要根据具体需求选择合适的结构。
2. 文件和目录的管理文件系统需要提供对文件和目录的管理功能,包括创建、删除、重命名和移动等操作。
此外,还需要支持文件和目录的权限管理,确保只有授权用户可以进行相应操作。
3. 文件的存储管理文件系统需要负责将文件存储在磁盘或其他存储设备上,并提供高效的读写操作。
存储管理的关键是如何将文件划分为适当大小的块并将它们存储在存储设备上。
4. 文件的共享和保护文件系统需要支持文件的共享和保护。
共享可以使多个用户同时访问同一文件,保护则确保只有合法用户可以进行读写操作。
四、文件系统的关键组成部分一个典型的文件系统通常由以下几个关键组成部分构成:1. 文件控制块(FCB)文件控制块是文件系统中一个重要的数据结构,用于记录文件的相关信息,包括文件名、大小、权限和存储位置等。
简单的文件系统课程设计一、课程目标知识目标:1. 学生能够理解文件系统的基本概念,掌握文件、文件夹的创建、删除、复制、移动等基本操作。
2. 学生能够了解简单文件系统的结构,掌握文件的存储、读取、写入等过程。
3. 学生能够掌握文件权限和文件属性的概念,了解如何保护文件安全。
技能目标:1. 学生能够熟练使用文件管理器,对文件和文件夹进行有效管理。
2. 学生能够编写简单的程序,实现对文件的基本操作,如读写、复制等。
3. 学生能够运用所学知识,解决实际生活中遇到的文件管理问题。
情感态度价值观目标:1. 培养学生良好的文件管理习惯,提高信息素养,增强信息处理能力。
2. 培养学生的团队协作意识,学会在合作中分享和交流文件资源。
3. 增强学生的网络安全意识,尊重知识产权,遵循法律法规。
本课程针对五年级学生设计,结合学生好奇心强、动手能力强、善于合作等特点,注重理论与实践相结合,让学生在实际操作中掌握文件系统知识。
课程目标具体、可衡量,便于教学设计和评估,有助于提高学生的信息素养和实际操作能力。
二、教学内容1. 文件系统基本概念:文件、文件夹、路径、文件类型等。
2. 文件管理基本操作:创建、删除、复制、移动、重命名文件和文件夹。
3. 文件系统结构:磁盘分区、目录结构、文件存储方式。
4. 文件读写过程:文件的打开、读取、写入、关闭。
5. 文件权限与属性:设置文件权限,了解文件属性的作用。
6. 文件管理器的使用:熟悉文件管理器的界面和功能,提高文件管理效率。
7. 简单文件操作编程:使用编程语言实现文件的创建、读写、删除等操作。
8. 文件共享与安全:文件共享的方法,文件加密、解密,保护文件安全。
教学内容根据以下教材章节组织:第一章:计算机系统概述第二节:文件系统基本概念第三节:文件管理基本操作第二章:文件系统第一节:文件系统结构第二节:文件读写过程第三节:文件权限与属性第三章:文件管理与应用第一节:文件管理器的使用第二节:简单文件操作编程第三节:文件共享与安全教学进度安排:共8课时,每课时40分钟。
简单多用户文件系统设计数学与计算机学院课程设计说明书课程名称: 操作系统课程设计课程代码:题目: 简单多用户文件系统设计年级/专业/班: 学生姓名: 学号: 开始时间: 2011 年 12 月 12 日完成时间: 2011 年 12 月 26 日课程设计成绩:学习态度及平技术水平与实说明书,计算书、图纸、总分创新,5, 时成绩,30, 际能力,20, 分析报告,撰写质量,45, ,100,指导教师签名: 年月日1简单多用户文件系统设计教师评语简单多用户文件系统设计《操作系统原理》课程设计任务书学院名称: 专业: 年级:一、设计题目简单多用户文件文件系统设计—文件数据操作处理二、主要内容本课程设计完成一个简单多用户文件系统,加深理解文件系统的内部功能及内部实现。
三、具体要求在WINDOWS系统环境下设计一个简单的二级文件系统。
要求做到以下几点:(1) 可以实现下列几条命令:adduser 增加用户 cp 拷贝文件login 用户登录 rename 重新命名文件exit 注销登录 rm 删除文件rmuser 删除用户 create 创建文件passwd 改变用户口令 open 打开文件chown 改变文件拥者 close 关闭文件chmod 改变文件权限 read 读文件dir 列文件目录 write 写文件(2) 列目录时要列出文件名、物理地址、保护码和文件长度;(3) 源文件可以进行读写保护。
(4) 要求该同学配合统组其他同学一起完成总体设计,并自己单独完成文件数据操作处理exit、open、close、read、write)的实现。
有关命令(adduser、login、四、主要技术路线提示(1) 要求利用结构化或面向对象的方法完成系统的设计; (2) 要求在设计的过程中,建立清晰的层次关系;(3) 在系统的设计中,尽量采用面向对象的机制。
(4) 开发环境:Windows XP 或Windows 2000 (5) 编程语言建议采用C++,也可以采用其他语言。
操作系统课程设计为LINUX设计一个简单的二级文件系统一.项目概述本课程设计旨在通过设计一个简单的多用户文件系统,加深学生对文件系统内部功能及内部实现的理解,并提高学生的程序设计能力、算法设计质量与程序设计素质。
二.设计题目为LINUX设计一个简单的二级文件系统,要求实现以下命令:Login用户登录、Dir列文件目录、Create创建文件、Delete删除文件、Open打开文件、Close关闭文件、Read读文件、Write写文件。
列目录时需包括文件名、物理地址、保护码和文件长度。
源文件需进行读写保护。
三.开发语言及实现平台或实验环境本课程设计的开发语言为C语言,实现平台为Linux操作系统。
学生需要在规定时间内完成程序的编写和调试,并书写课程设计报告。
四.时间安排1月17日布置课程设计任务,学生需要自行查阅资料并准备程序。
1月18日至1月20日,学生需要在机房上机调试程序,并书写课程设计报告。
1月21日上午,学生需要提交课程设计报告及相关文档。
每位学生应独立完成各自的任务,每天至少在设计室工作半天。
五.具体要求1.课程设计报告应按统一通用格式书写,具体格式要求请在网络上查阅。
2.指导教师和教研室主任(或责任教师)需要在规定时间内签署相应的文件。
设计目的:本设计旨在开发一款能够实现某种功能的程序,为用户提供便利。
设计内容:5.1.该程序将包括两个主要功能:A和B。
A功能将执行某种操作,而B功能将提供用户界面,使其能够轻松地使用A功能。
5.2.此外,该程序还将包括其他辅助功能,例如C和D。
这些功能将提高程序的可用性和实用性。
任务:该程序的主要任务是为用户提供一种方便、高效的解决方案,使其能够更轻松地实现某种目标。
主程序流程图:程序的主要流程将包括以下步骤:用户打开程序,选择所需的功能,程序执行相应的操作,最终将结果返回给用户。
程序设计:6.1.在程序设计方面,我们将采用一种灵活、可扩展的架构,以便能够轻松地添加新的功能和模块。
操作【2 】体系课程设计报告小组编号: 小构成员:一.课程设计概述:1.标题: 简略文件体系的实现2.实现内容(1)在内存中开拓一个虚拟磁盘空间作为文件存储分区,在其上实现一个简略的基于多级目次的单用户单义务体系中的文件体系.在退出该文件体系的应用时,应将该虚拟文件体系以一个Windows 文件的方法保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中.(2)文件存储空间的分派可采用显式链接分派或其他的方法.(3)余暇磁盘空间的治理可选择位示图或其他的方法.假如采用位示图来治理文件存储空间,并采用显式链接分派方法,那么可以将位示图归并到FAT中.(4)文件目次构造采用多级目次构造.为了简略起见,可以不应用索引结点,个中的每个目次项应包含文件名.物理地址.长度等信息,还可以经由过程目次项实现对文件的读和写的破坏.●请求供给以下操作敕令:●my_format: 对文件存储器进行格局化,即按照文件体系的构造对虚拟磁盘空间进行布局,并在其上创建根目次以及用于治理文件存储空间等的数据构造.●my_mkdir: 用于创建子目次.●my_rmdir: 用于删除子目次.●my_ls: 用于显示目次中的内容.●my_cd: 用于更改当前目次.●my_create: 用于创建文件.●my_open: 用于打开文件.●my_close: 用于封闭文件.●my_write: 用于写文件.●my_read: 用于读文件.●my_rm: 用于删除文件.二、my_exitsys: 用于退出文件体系.设计思绪(重要算法描写.程序流程图等):1. 体系主函数main()(1)对应敕令: 无(2)敕令挪用格局: 无(3)函数设计格局: void main()(4)功效: 体系主函数(5)输入: 无(6)输出: 无(7)函数需完成的工作:①对前面界说的全局变量进行初始化;②挪用startsys()进入文件体系;③列出文件体系供给的各项功效及敕令挪用格局;④显示敕令行提醒符,等待用户输入敕令;⑤将用户输入的敕令保存到一个buf中;⑥对buf中的内容进行敕令解析,并挪用响应的函数履行用户键入的敕令;⑦假如敕令不是“my_exitsys”,则敕令履行完毕后转④.2.进入文件体系函数startsys()(1)对应敕令: 无(2)敕令挪用格局: 无(3)函数设计格局: void startsys()(4)功效: 由main()函数挪用,进入并初始化我们所树立的文件体系,以供用户应用.(5)输入: 无(6)输出: 无.(7)函数需完成的工作:①申请虚拟磁盘空间;②应用c说话的库函数fopen()打开myfsys文件: 若文件消失,则转③;若文件不消失,则创建之,转⑤③应用c说话的库函数fread()读入myfsys文件内容到用户空间中的一个缓冲区中,并断定其开端的8个字节内容是否为“10101010”(文件体系魔数),假如是,则转④;不然转⑤;④将上述缓冲区中的内容复制到内存中的虚拟磁盘空间中;转⑦⑤在屏幕上显示“myfsys文件体系不消失,如今开端创建文件体系”信息,并挪用my_format()对①中申请到的虚拟磁盘空间进行格局化操作.转⑥;⑥将虚拟磁盘中的内容保存到myfsys文件中;转⑦⑦应用c说话的库函数fclose()封闭myfsys文件;⑧初始化用户打开文件表,将表项0分派给根目次文件应用,并填写根目次文件的相干信息,因为根目次没有上级目次,所以表项中的dirno和diroff分离置为5(根目次地点肇端块号)和0;并将ptrcurdir指针指向该用户打开文件表项.⑨将当前目次设置为根目次.3. 磁盘格局化函数my_format()(1)对应敕令: my_format(2)敕令挪用格局: my_format(3)函数设计格局: void my_format()(4)功效: 对虚拟磁盘进行格局化,布局虚拟磁盘,树立根目次文件(或根目次区).(5)输入: 无(6)输出: 无.(7)函数需完成的工作:①将虚拟磁盘第一个块作为引诱块,开端的8个字节是文件体系的魔数,记为“10101010”;在之后写入文件体系的描写信息,如FAT表大小及地位.根目次大小及地位.盘块大小.盘块数目.数据区开端地位等信息;②在引诱块后树立两张完全一样的FAT表,用于记载文件所占领的磁盘块及治理虚拟磁盘块的分派,每个FAT占领两个磁盘块;对于每个FAT中,前面5个块设置为已分派,后面995个块设置为余暇;③在第二张FAT后创建根目次文件root,将数据区的第1块(即虚拟磁盘的第6块)分派给根目次文件,在该磁盘上创建两个特别的目次项: “.”和“..”,其内容除了文件名不同之外,其他字段完全雷同.4. 更改当前目次函数my_cd()(1)对应敕令: my_cd(2)敕令挪用格局: my_cd dirname(3)函数设计格局: void my_cd(char *dirname)(4)功效: 转变当前目次到指定的名为dirname的目次.(5)输入:dirname: 新的当前目次的目次名;(6)输出: 无(7)函数需完成的工作:①挪用my_open()打开指定目次名的父目次文件,并挪用do_read()读入该父目次文件内容到内存中;②在父目次文件中检讨新的当前目次名是否消失,假如消失则转③,不然返回,并显示出错信息;③挪用my_close()封闭①中打开的父目次文件;④挪用my_close()封闭原当前目次文件;⑤假如新的当前目次文件没有打开,则打开该目次文件;并将ptrcurdir指向该打开文件表项;⑥设置当前目次为该目次.5. 创建子目次函数my_mkdir()(1)对应敕令: my_mkdir(2)敕令挪用格局: my_ mkdir dirname(3)函数设计格局: void my_mkdir(char *dirname)(4)功效: 在当前目次下创建名为dirname的子目次.(5)输入:dirname:新建目次的目次名.(6)输出: 无.(7)函数需完成的工作:①挪用do_read()读入当前目次文件内容到内存,检讨当前目次下新建目次文件是否重名,若重名则返回,并显示错误信息;②为新建子目次文件分派一个余暇打开文件表项,假如没有余暇表项则返回-1,并显示错误信息;③检讨FAT是否有余暇的盘块,如有则为新建目次文件分派一个盘块,不然释放①平分派的打开文件表项,返回,并显示错误信息;④在当前目次中为新建目次文件查找一个余暇的目次项或为其追加一个新的目次项;需修正当前目次文件的长度信息,并将当前目次文件的用户打开文件表项中的fcbstate置为1;⑤预备好新建目次文件的FCB的内容,文件的属性为目次文件,以笼罩写方法挪用do_write()将其填写到对应的空目次项中;⑥在新建目次文件所分派到的磁盘块中树立两个特别的目次项“.”和“..”目次项,方法是: 起首在用户空间中预备好内容,然后以截断写或者笼罩写方法挪用do_write()将其写到③平分派到的磁盘块中;⑦返回.6. 删除子目次函数rmdir()(1)对应敕令: my_ rmdir(2)敕令挪用格局: my_ rmdir dirname(1)函数设计格局: void my_rmdir(char *dirname)(2)功效: 在当前目次下删除名为dirname的子目次.(3)输入:dirname:欲删除目次的目次名.(4)输出: 无.(5)函数需完成的工作:①挪用do_read()读入当前目次文件内容到内存,检讨当前目次下欲删除目次文件是否消失,若不消失则返回,并显示错误信息;②检讨欲删除目次文件是否为空(除了“.”和“..”外没有其他子目次和文件),可依据其目次项中记载的文件长度来断定,若不为空则返回,并显示错误信息;③检讨该目次文件是否已经打开,若已打开则挪用my_close()封闭掉落;④收受接管该目次文件所占领的磁盘块,修正FAT;⑤从当前目次文件中清空该目次文件的目次项,且free字段置为0: 以笼罩写方法挪用do_write()来实现;⑥修正当前目次文件的用户打开表项中的长度信息,并将表项中的fcbstate置为1;⑦返回.7. 显示目次函数my_ls()(1)对应敕令: my_ls(2)敕令挪用格局: my_ls(3)函数设计格局: void my_ls(void)(4)功效: 显示当前目次的内容(子目次和文件信息).(5)输入: 无(6)输出: 无(7)函数需完成的工作:①挪用do_read()读出当前目次文件内容到内存;②将读出的目次文件的信息按照必定的格局显示到屏幕上;③返回.8. 创建文件函数my_create()(1)对应敕令: my_create(2)敕令挪用格局: my_create filename(3)函数设计格局: int my_create (char *filename)(4)功效: 创建名为filename的新文件.(5)输入:filename:新建文件的文件名,可能包含路径.(6)输出: 若创建成功,返回该文件的文件描写符(文件打开表中的数组下标);不然返回-1.(7)函数需完成的工作:①为新文件分派一个余暇打开文件表项,假如没有余暇表项则返回-1,并显示错误信息;②若新文件的父目次文件还没有打开,则挪用my_open()打开;若打开掉败,则释放①中为新建文件分派的余暇文件打开表项,返回-1,并显示错误信息;③挪用do_read()读出该父目次文件内容到内存,检讨该目次下新文件是否重名,若重名则释放①平分派的打开文件表项,并挪用my_close()封闭②中打开的目次文件;然后返回-1,并显示错误信息;④检讨FAT是否有余暇的盘块,如有则为新文件分派一个盘块,不然释放①平分派的打开文件表项,并挪用my_close()封闭②中打开的目次文件;返回-1,并显示错误信息;⑤在父目次中为新文件查找一个余暇的目次项或为其追加一个新的目次项;需修正该目次文件的长度信息,并将该目次文件的用户打开文件表项中的fcbstate置为1;⑥预备好新文件的FCB的内容,文件的属性为数据文件,长度为0,以笼罩写方法挪用do_write()将其填写到⑤平分派到的空目次项中;⑦为新文件填写①平分派到的余暇打开文件表项,fcbstate字段值为0,读写指针值为0;⑧挪用my_close()封闭②中打开的父目次文件;⑨将新文件的打开文件表项序号作为其文件描写符返回.9. 删除文件函数my_rm()(1)对应敕令: my_rm(2)敕令挪用格局: my_rm filename(3)函数设计格局: void my_rm(char *filename)(4)功效: 删除名为filename的文件.(5)输入:filename:欲删除文件的文件名,可能还包含路径.(6)输出: 无.(7)函数需完成的工作:①若欲删除文件的父目次文件还没有打开,则挪用my_open()打开;若打开掉败,则返回,并显示错误信息;②挪用do_read()读出该父目次文件内容到内存,检讨该目次下欲删除文件是否消失,若不消失则返回,并显示错误信息;③检讨该文件是否已经打开,若已打开则封闭掉落;④收受接管该文件所占领的磁盘块,修正FAT;⑤从文件的父目次文件中清空该文件的目次项,且free字段置为0: 以笼罩写方法挪用do_write()来实现;;⑥修正该父目次文件的用户打开文件表项中的长度信息,并将该表项中的fcbstate置为1;⑦返回.10. 打开文件函数my_open()(1)对应敕令: my_open(2)敕令挪用格局: my_open filename(3)函数设计格局: int my_open(char *filename)(4)功效: 打开当前目次下名为filename的文件.(5)输入:filename: 欲打开文件的文件名(6)输出: 若打开成功,返回该文件的描写符(在用户打开文件表中表项序号);不然返回-1.(7)函数需完成的工作:①检讨该文件是否已经打开,若已打开则返回-1,并显示错误信息;②挪用do_read()读出父目次文件的内容到内存,检讨该目次下欲打开文件是否消失,若不消失则返回-1,并显示错误信息;③检讨用户打开文件表中是否有空表项,如有则为欲打开文件分派一个空表项,若没有则返回-1,并显示错误信息;④为该文件填写空白用户打开文件表表项内容,读写指针置为0;⑤将该文件所分派到的空白用户打开文件表表项序号(数组下标)作为文件描写符fd返回.11. 封闭文件函数my_close()(1)对应敕令: my_close(2)敕令挪用格局: my_close fd(3)函数设计格局: void my_close(int fd)(4)功效: 封闭前面由my_open()打开的文件描写符为fd的文件.(5)输入:fd:文件描写符.(6)输出: 无.(7)函数需完成的工作:①检讨fd的有用性(fd不能超出用户打开文件表地点数组的最大下标),假如无效则返回-1;②检讨用户打开文件表表项中的fcbstate字段的值,假如为1则须要将该文件的FCB的内容保存到虚拟磁盘上该文件的目次项中,方法是: 打开该文件的父目次文件,以笼罩写方法挪用do_write()将欲封闭文件的FCB 写入父目次文件的响应盘块中;③收受接管该文件占领的用户打开文件表表项(进行清空操作),并将topenfile字段置为0;④返回.12. 写文件函数my_write()(1)对应敕令: my_write(2)敕令挪用格局: my_write fd(3)函数设计格局: int my_write(int fd)(4)功效: 将用户经由过程键盘输入的内容写到fd所指定的文件中.磁盘文件的读写操作都必须以完全的数据块为单位进行,在写操作时,先将数据写在缓冲区中,缓冲区的大小与磁盘块的大小雷同,然后再将缓冲区中的数据一次性写到磁盘块中;读出时先将一个磁盘块中的内容读到缓冲区中,然后再传送到用户区.本实例为了轻便起见,没有设置缓冲区治理,只是在读写文件时由用户应用malloc()申请一块空间作为缓冲区,读写操作停止后应用free()释放掉落.写操作常有三种方法: 截断写.笼罩写和追加写.截断写是废弃本来文件的内容,从新写文件;笼罩写是修正文件在当前读写指针所指的地位开端的部分内容;追加写是在原文件的最后添加新的内容.在本实例中,输入写文件敕令后,体系会消失提醒让用户选择个中的一种写方法,并将随后键盘输入的内容按照所选的方法写到文件中,键盘输入内容经由过程CTR+Z键(或其他设定的键)停止.(5)输入:fd: open()函数的返回值,文件的描写符;(6)输出: 现实写入的字节数.(7)函数需完成的工作:①检讨fd的有用性(fd不能超出用户打开文件表地点数组的最大下标),假如无效则返回-1,并显示出错信息;②提醒并等待用户输入写方法: (1: 截断写;2: 笼罩写;3: 追加写)③假如用户请求的写方法是截断写,则释放文件除第一块外的其他磁盘空间内容(查找并修正FAT表),将内存用户打开文件表项中文件长度修正为0,将读写指针置为0并转④;假如用户请求的写方法是追加写,则修正文件的当前读写指针地位到文件的末尾,并转④;假如写方法是笼罩写,则直接转④;④提醒用户: 全部输入内容经由过程CTR+Z键(或其他设定的键)停止;用户可分多次输入写入内容,每次用回车停止;⑤等待用户从键盘输入文件内容,并将用户的本次输入内容保存到一暂时变量text[]中,请求每次输入以回车停止,全体停止用CTR+Z键(或其他设定的键);⑥挪用do_write()函数将经由过程键盘键入的内容写到文件中.⑦假如do_write()函数的返回值为非负值,则将现实写入字节数增长do_write()函数返回值,不然显示出错信息,并转⑨;⑧假如text[]中最后一个字符不是停止字符CTR+Z,则转⑦持续进行写操作;不然转⑨;⑨假如当前读写指针地位大于用户打开文件表项中的文件长度,则修正打开文件表项中的文件长度信息,并将fcbstate置1;⑩返回现实写入的字节数.13. 现实写文件函数do_write()(1)对应敕令: 无(2)敕令挪用格局: 无(3)函数设计格局: int my_write(int fd,char *text,int len,char wstyle)(4)功效: 被写文件函数my_write()挪用,用来将键盘输入的内容写到响应的文件中去.(5)输入:fd: open()函数的返回值,文件的描写符;text: 指向要写入的内容的指针;len: 本次请求写入字节数wstyle: 写方法(6)输出: 现实写入的字节数.(7)函数需完成的工作:①用malloc()申请1024B的内存空间作为读写磁盘的缓冲区buf,申请掉败则返回-1,并显示出错信息;②将读写指针转化为逻辑块块号和块内偏移off,并应用打开文件表表项中的首块号及FAT表的相干内容将逻辑块块号转换成对应的磁盘块块号blkno;假如找不到对应的磁盘块,则须要检索FAT为该逻辑块分派一新的磁盘块,并将对应的磁盘块块号blkno登记到FAT中,若分派掉败,则返回-1,并显示出错信息;③假如是笼罩写,或者假如当前读写指针所对应的块内偏移off不等于0,则将块号为blkno的虚拟磁盘块全体1024B的内容读到缓冲区buf中;不然便用ASCII码0清空buf;④将text中未写入的内容暂存到缓冲区buff的第off字节开端的地位,直到缓冲区满,或者吸收到停止字符CTR+Z为止;将本次写入字节数记载到tmplen中;⑤将buf中1024B的内容写入到块号为blkno的虚拟磁盘块中;⑥将当前读写指针修正为本来的值加上tmplen;并将本次现实写入的字节数增长tmplen;⑦假如tmplen小于len,则转②持续写入;不然转⑧;⑧返回本次现实写入的字节数.14. 读文件函数my_read()(1)对应敕令: my_read(2)敕令挪用格局: my_read fd len(3)函数设计格局: int myread (int fd, int len)(4)功效: 读出指定文件中从读写指针开端的长度为len的内容到用户空间中.(5)输入:fd: open()函数的返回值,文件的描写符;len: 要从文件中读出的字节数.(6)输出: 现实读出的字节数.(7)函数需完成的工作:①界说一个字符型数组text[len],用来吸收用户从文件中读出的文件内容;②检讨fd的有用性(fd不能超出用户打开文件表地点数组的最大下标),假如无效则返回-1,并显示出错信息;③挪用do_read()将指定文件中的len字节内容读出到text[]中;④假如do_read()的返回值为负,则显示出错信息;不然将text[]中的内容显示到屏幕上;⑤返回.15. 现实读文件函数do_read()(1)对应敕令: 无(2)敕令挪用格局: 无(3)函数设计格局: int do_read (int fd, int len,char *text)(4)功效: 被my_read()挪用,读出指定文件中从读写指针开端的长度为len的内容到用户空间的text中. (5)输入:fd: open()函数的返回值,文件的描写符;len: 请求从文件中读出的字节数.text: 指向存放读出数据的用户区地址(6)输出: 现实读出的字节数.(7)函数需完成的工作:①应用malloc()申请1024B空间作为缓冲区buf,申请掉败则返回-1,并显示出错信息;②将读写指针转化为逻辑块块号及块内偏移量off,应用打开文件表表项中的首块号查找FAT表,找到该逻辑块地点的磁盘块块号;将该磁盘块块号转化为虚拟磁盘上的内存地位;③将该内存地位开端的1024B(一个磁盘块)内容读入buf中;④比较buf中从偏移量off开端的残剩字节数是否大于等于应读写的字节数len,假如是,则将从off开端的buf中的len长度的内容读入到text[]中;不然,将从off开端的buf中的残剩内容读入到text[]中;⑤将读写指针增长④中已读字节数,将应读写的字节数len减去④中已读字节数,若len大于0,则转②;不然转⑥;⑥应用free()释放①中申请的buf.⑦返回现实读出的字节数.16.退出文件体系函数my_exitsys()(1)对应敕令: my_exitsys(2)敕令挪用格局: my_ exitsys(1)函数设计格局: void my_exitsys()(2)功效: 退出文件体系.(3)输入: 无(4)输出: 无.(5)函数需完成的工作:①应用C库函数fopen()打开磁盘上的myfsys文件;②将虚拟磁盘空间中的所有内容保存到磁盘上的myfsys文件中;③应用c说话的库函数fclose()封闭myfsys文件;④撤销用户打开文件表,释放其内存空间⑤释放虚拟磁盘空间.流程图#include <string.h>#include <time.h>#define BLOCKSIZE 1024 // 磁盘块大小#define SIZE 1024000 // 虚拟磁盘空间大小#define END 65535 // FAT中的文件停止标志#define FREE 0 // FAT中盘块余暇标志#define ROOTBLOCKNUM 2 // 根目次区所占盘块数#define MAXOPENFILE 10 // 最多同时打开文件个数t#define MAXTEXT 10000/* 文件掌握块 */typedef struct FCB{char filename[8]; // 文件名char exname[3]; // 文件扩大名unsigned char attribute; // 文件属性字段,值为0时表示目次文件,值为1时表示数据文件unsigned short time; // 文件创建时光unsigned short date; // 文件创建日期unsigned short first; // 文件肇端盘块号unsigned long length; // 文件长度char free; // 表示目次项是否为空,若值为0,表示空,值为1,表示已分派}fcb;/* 文件分派表 */typedef struct FAT{unsigned short id; // 磁盘块的状况(余暇的,最后的,下一个)}fat;/* 用户打开文件表 */typedef struct USEROPEN{char filename[8]; // 文件名char exname[3]; // 文件扩大名unsigned char attribute;//文件属性字段,值为0时表示目次文件,值为1时表示数据文件unsigned short time; // 文件创建时光unsigned short date; // 文件创建日期unsigned short first; // 文件肇端盘块号unsigned long length;//文件长度(对数据文件是字节数,对目次文件可所以目次项个数)char free; // 表示目次项是否为空,若值为0,表示空,值为1,表示已分派unsigned short dirno; // 响应打开文件的目次项在父目次文件中的盘块号int diroff; // 响应打开文件的目次项在父目次文件的dirno盘块中的目次项序号char dir[80]; // 响应打开文件地点的路径名,如许便利快速检讨出指定文件是否已经打开int father; // 父目次在打开文件表项的地位int count; // 读写指针在文件中的地位,文件的总字符数char fcbstate; // 是否修正了文件的FCB的内容,假如修正了置为1,不然为0char topenfile; // 表示该用户打开表项是否为空,若值为0,表示为空,不然表示已被某打开文件占领}useropen;/* 引诱块 */typedef struct BLOCK0{char magic[10]; // 文件体系魔数char information[200];//存储一些描写信息,如磁盘块大小.磁盘块数目.最多打开文件数等 unsigned short root; // 根目次文件的肇端盘块号unsigned char *startblock; // 虚拟磁盘上数据区开端地位}block0;unsigned char *myvhard; // 指向虚拟磁盘的肇端地址useropen openfilelist[MAXOPENFILE]; // 用户打开文件表数组int curdir; // 用户打开文件表中的当前目次地点打开文件表项的地位char currentdir[80]; // 记载当前目次的目次名(包括目次的路径)unsigned char* startp; // 记载虚拟磁盘上数据区开端地位char myfilename[] = "myfilesys";//文件体系的文件名void startsys(); // 进入文件体系void my_format(); // 磁盘格局化void my_cd(char *dirname); // 更改当前目次void my_mkdir(char *dirname); // 创建子目次void my_rmdir(char *dirname); // 删除子目次void my_ls(); // 显示目次void my_create (char *filename); // 创建文件void my_rm(char *filename); // 删除文件int my_open(char *filename); // 打开文件int my_close(int fd); // 封闭文件int my_write(int fd); // 写文件int do_write(int fd, char *text, int len, char wstyle); // 现实写文件int my_read (int fd, int len); // 读文件int do_read (int fd, int len,char *text); // 现实读文件void my_exitsys(); // 退出文件体系unsigned short findblock(); // 查找余暇盘块int findopenfile(); // 查找余暇文件表项void startsys(){FILE *fp;unsigned char buf[SIZE];fcb *root;int i;myvhard = (unsigned char *)malloc(SIZE);//申请虚拟磁盘空间memset(myvhard, 0, SIZE);//将myvhard中前SIZE个字节用 0 调换并返回 myvhard if((fp = fopen(myfilename, "r")) != NULL){fread(buf, SIZE, 1, fp);//将二进制文件读取到缓冲区fclose(fp);if(strcmp(((block0 *)buf)->magic, "10101010")){printf("myfilesys is not exist,begin to creat the file...\n");my_format();}else{for(i = 0; i < SIZE; i++)myvhard[i] = buf[i];}}else{printf("myfilesys is not exist,begin to creat the file...\n");my_format();}root = (fcb *)(myvhard + 5 * BLOCKSIZE);strcpy(openfilelist[0].filename, root->filename);strcpy(openfilelist[0].exname, root->exname);openfilelist[0].attribute = root->attribute;openfilelist[0].time = root->time;openfilelist[0].date = root->date;openfilelist[0].first = root->first;openfilelist[0].length = root->length;openfilelist[0].free = root->free;openfilelist[0].dirno = 5;openfilelist[0].diroff = 0;strcpy(openfilelist[0].dir, "\\root\\");openfilelist[0].father = 0;openfilelist[0].count = 0;openfilelist[0].fcbstate = 0;openfilelist[0].topenfile = 1;for(i = 1; i < MAXOPENFILE; i++)openfilelist[i].topenfile = 0;curdir = 0;strcpy(currentdir, "\\root\\");startp = ((block0 *)myvhard)->startblock;}void my_format(){FILE *fp;fat *fat1, *fat2;block0 *blk0;time_t now;struct tm *nowtime;fcb *root;int i;blk0 = (block0 *)myvhard;fat1 = (fat *)(myvhard + BLOCKSIZE);fat2 = (fat *)(myvhard + 3 * BLOCKSIZE);root = (fcb *)(myvhard + 5 * BLOCKSIZE);strcpy(blk0->magic, "10101010");strcpy(blk0->information, "My FileSystem Ver 1.0 \n Blocksize=1KB Whole size=1000KB Blocknum=1000 RootBlocknum=2\n");blk0->root = 5;blk0->startblock = (unsigned char *)root;for(i = 0; i < 5; i++){fat1->id = END;fat2->id = END;fat1++;fat2++;}fat1->id = 6;fat2->id = 6;fat1++;fat2++;fat1->id = END;fat2->id = END;fat1++;fat2++;for(i = 7; i < SIZE / BLOCKSIZE; i++){fat1->id = FREE;fat2->id = FREE;fat1++;fat2++;}now = time(NULL);nowtime = localtime(&now);strcpy(root->filename, ".");strcpy(root->exname, "");root->attribute = 0x28;root->time = nowtime->tm_hour * 2048 + nowtime->tm_min * 32 + nowtime->tm_sec / 2;root->date = (nowtime->tm_year - 80) * 512 + (nowtime->tm_mon + 1) * 32 + nowtime->tm_mday; root->first = 5;root->length = 2 * sizeof(fcb);root->free = 1;root++;now = time(NULL);nowtime = localtime(&now);strcpy(root->filename, "..");strcpy(root->exname, "");root->attribute = 0x28;root->time = nowtime->tm_hour * 2048 + nowtime->tm_min * 32 + nowtime->tm_sec / 2;root->date = (nowtime->tm_year - 80) * 512 + (nowtime->tm_mon + 1) * 32 + nowtime->tm_mday; root->first = 5;root->length = 2 * sizeof(fcb);root->free = 1;fp = fopen(myfilename, "w");fwrite(myvhard, SIZE, 1, fp);fclose(fp);}void my_cd(char *dirname){char *dir;int fd;dir = strtok(dirname, "\\");//分化字符串为一组字符串.dirname为要分化的字符串,"\\"为分隔符字符串 if(strcmp(dir, ".") == 0)return;else if(strcmp(dir, "..") == 0){if(curdir)curdir = my_close(curdir);return;}else if(strcmp(dir, "root") == 0){while(curdir)curdir = my_close(curdir);dir = strtok(NULL, "\\");}while(dir)。
简单文件系统课程设计一、教学目标本课程旨在让学生了解和掌握简单文件系统的基本概念、原理和操作方法。
通过本课程的学习,学生应达到以下目标:1.知识目标:•理解文件系统的概念、作用和基本组成;•掌握文件的基本操作,如创建、删除、修改和复制;•了解文件系统的结构和存取控制;•掌握常用的文件系统及其优缺点。
2.技能目标:•能够使用命令行或图形界面操作文件系统;•能够使用基本的文件系统维护工具,如磁盘碎片整理工具、文件压缩工具等;•能够进行简单的文件系统优化和故障排除。
3.情感态度价值观目标:•培养学生对计算机系统的兴趣和好奇心,提高学生对计算机技术的认识;•培养学生良好的信息安全意识,了解保护文件和隐私的重要性;•培养学生团队协作和自主学习的能力,提高学生解决问题的能力。
二、教学内容本课程的教学内容主要包括以下几个部分:1.文件系统概述:介绍文件系统的概念、作用和基本组成;2.文件的基本操作:讲解文件的创建、删除、修改和复制等基本操作;3.文件系统的结构:介绍文件系统的目录结构、文件存储方式和存取控制;4.常用的文件系统:讲解FAT32、NTFS等常用文件系统的原理和特点;5.文件系统维护:介绍文件系统的优化、故障排除和数据恢复等方法。
三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法,如:1.讲授法:讲解文件系统的基本概念、原理和操作方法;2.案例分析法:通过分析实际案例,让学生了解文件系统的应用和优缺点;3.实验法:引导学生动手操作,掌握文件系统的实际使用和维护方法;4.讨论法:学生进行小组讨论,培养学生的团队协作和问题解决能力。
四、教学资源为了支持教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:选择一本合适的教材,如《计算机操作系统》;2.参考书:提供相关的参考书籍,以便学生深入学习和拓展知识;3.多媒体资料:制作PPT、视频等多媒体资料,帮助学生更好地理解和掌握知识;4.实验设备:准备计算机、硬盘、U盘等实验设备,让学生进行实际操作。
操作系统文件系统课程设计
操作系统文件系统课程设计主要涉及以下几个方面:
1. 实现基于模块的文件系统:
- 修改ext3或ext4的源代码
- 动态加载和卸载新的文件系统
- 修改文件系统的名称,优化文件写操作
2. 新增Linux驱动程序:
- 增加一个驱动程序(使用内存模拟设备)
- 动态加载和卸载新的驱动
- 通过程序或命令行使用该驱动
- 保存和读取数据
3. 统计Linux系统缺页的次数:
- 在内核中实现缺页次数统计
- 编译并安装新内核
- 建立内核模块,通过/proc实现用户态查看缺页次数
4. 模拟磁盘文件系统实现:
- 设计一个简单的文件系统,用文件模拟磁盘,用数组模拟缓冲区
- 支持多级目录结构,支持文件的绝对读路径
- 实现建立目录、列目录、删除空目录、建立文件、删除文件、显示文件内容、打开文件、读文件、写文件、关闭文件、改变文件属性等命令建议根据以上概述,结合实际需求和兴趣,选择相应的题目进行课程设计。
简单多用户文件系统设计数学与计算机学院课程设计说明书课程名称: 操作系统课程设计课程代码:题目: 简单多用户文件系统设计年级/专业/班: 学生姓名: 学号: 开始时间: 2011 年 12 月 12 日完成时间: 2011 年 12 月 26 日课程设计成绩:学习态度及平技术水平与实说明书,计算书、图纸、总分创新,5, 时成绩,30, 际能力,20, 分析报告,撰写质量,45, ,100,指导教师签名: 年月日1简单多用户文件系统设计教师评语简单多用户文件系统设计《操作系统原理》课程设计任务书学院名称: 专业: 年级:一、设计题目简单多用户文件文件系统设计—文件数据操作处理二、主要内容本课程设计完成一个简单多用户文件系统,加深理解文件系统的内部功能及内部实现。
三、具体要求在WINDOWS系统环境下设计一个简单的二级文件系统。
要求做到以下几点:(1) 可以实现下列几条命令:adduser 增加用户 cp 拷贝文件login 用户登录 rename 重新命名文件exit 注销登录 rm 删除文件rmuser 删除用户 create 创建文件passwd 改变用户口令 open 打开文件chown 改变文件拥者 close 关闭文件chmod 改变文件权限 read 读文件dir 列文件目录 write 写文件(2) 列目录时要列出文件名、物理地址、保护码和文件长度;(3) 源文件可以进行读写保护。
(4) 要求该同学配合统组其他同学一起完成总体设计,并自己单独完成文件数据操作处理exit、open、close、read、write)的实现。
有关命令(adduser、login、四、主要技术路线提示(1) 要求利用结构化或面向对象的方法完成系统的设计; (2) 要求在设计的过程中,建立清晰的层次关系;(3) 在系统的设计中,尽量采用面向对象的机制。
(4) 开发环境:Windows XP 或Windows 2000 (5) 编程语言建议采用C++,也可以采用其他语言。
文件系统设计1.目的和要求本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。
实验要求:①在系统中用一个文件来模拟一个磁盘;②此系统至少有:Create、delete、open、close、read、write等和部分文件属性的功能。
③实现这个文件系统。
④能实际演示这个文件系统。
基本上是进入一个界面(此界面就是该文件系统的界面)后,可以实现设计的操作要求。
2.实验内容1)设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。
2)程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。
另外,为打开文件设置了运行文件目录(AFD)。
3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。
4)因系统小,文件目录的检索使用了简单的线性搜索。
5)文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。
6)程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD),打开文件目录(AFD)即运行文件目录。
3.实验环境VC 6.04.实验提示1) format 格式化只写打开模拟文件,初始化超级快,初始化dinode 位图 block 位图,初始化主目录,初始化etc 目录,初始化管理员admin 目录,初始化用户xiao 目录,初始化 用户passwd 文件,写入模拟硬盘文件。
2 )install 安装读写打开模拟文件,读取dinode 位图 block 位图,读取主目录,读取etc 目录,读取管理员admin 目录,读取用户xiao 目录,读取 用户passwd 文件。
3 )login 登陆用户输入用户名和密码,在passwd 文件中查找是否有此用户,核对密码。
正确则登陆成功,当前目录设定到当前用户文件夹下。
Login登录结束是,登录成功输入用户名查找是否有改用户名输入密码是否密码是否正确否4 )ialloc 申请inode 空间先检测inode 位图是否加锁,是则退出。
《操作系统》课程设计题目:设计一个简单二级文件系统专业:计算机科学与技术年级:文计091-1*名:***学号:200990514103指导教师:任满杰时间:2011-2012第二学期2012年9月1日一、设计内容1、可以实现下列几条命令。
Format 格式化Dir 列文件目录Create 创建文件Delete 删除文件Deldir 删除目录Open 打开文件Close 关闭文件Search 查询文件Copy 拷贝文件Cut 剪切文件二、开发环境Windows操作系统Microsoft Visual C++三、分析设计(一)实验原理通过程序模拟Linux文件系统,用一个二进制文件(FileSystem.disk)来模拟磁盘.设计一个多用户的二级文件系经统、实现一般的创建文件、目录,删除文件、目录,切换目录,打开、关闭文件、读写文件等操作。
文件系统,包含格式化,显示文件(目录),创建文件等几个简单命令的实现,而且能完成超级块的读写,节点的读写等过程. 本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户账号下的文件。
另外,为了简单本文件系统未考虑文件共享、文件系统安全以及管道文件与设备文件等特殊内容。
1.程序执行流程图:2.数据块的分配和回收(二)程序结构设计FileSystem类负责管理磁盘空间和磁盘内存I节点,负责对磁盘空间和磁盘数据进行优化管理。
并提代接口言方法供用户或程序调用。
(三)数据结构int physic[100]; //文件地址缓冲区int style=1; //文件的类型char cur_dir[10]="root"; //当前目录int search_i=0;struct command{char com[10];}cmd[20];struct block{int n; //空闲的盘快的个数int free[50]; //存放空闲盘快的地址int a; //模拟盘快是否被占用}memory[20449];struct block_super{int n; //空闲的盘快的个数int free[50]; //存放进入栈中的空闲块int stack[50]; //存放下一组空闲盘快的地址}super_block;struct node //i结点信息{int file_style; //i结点文件类型int file_length; //i结点文件长度int file_address[100]; //i结点文件的物理地址 char file_message[100];} i_node[640];struct dir //目录项信息{char file_name[10]; //文件名int i_num; //文件的结点号char dir_name[10]; //文件所在的目录} root[640];四.运行示例及结果分析菜单删除目录文件查询拷贝剪切五、程序实现详细程序请参见源文件, 在此只列举3点1、剪切文件程序片段:void cut(char *tmp,char *newname) {int i; //,jchar t[20];_strtime(t);for(i=0;i<640;i++)if(strcmp(newname,root[i].file_name)==0){break;}if(i==640){printf("目录不存在,不能剪切!\n");return;}for(i=0;i<640;i++){if(strcmp(tmp,root[i].file_name)==0){strcpy(root[i].dir_name,newname);strcpy(i_node[root[i].i_num].change_t,t);//printf("剪切成功!\n");//return;}}if(i==640)printf("文件不存在,执行失败!\n");}2.无文件查询程序片段:void search(char* filename){int sign=0;for(search_i=0;search_i<640;search_i++){if(strcmp(root[search_i].file_name,filename)==0) //查询文件中所在目录信息和当前目录信息相同的数据{sign=1;int k=root[search_i].i_num;printf("%s\t",root[search_i].file_name); //文件名printf(" %d\t",i_node[k].file_style); //文件的类型printf(" %d\t\t",i_node[k].file_length); //文件的长度printf("%s\n",root[search_i].dir_name); //文件所在的目录}}if (sign==0){printf("%s\n","未找到该文件!");}}六、心得与体会这次设计中遇到最难的问题就是拷贝功能的实现,由于之前没有接触过拷贝的原理,所以通过和同伴的讨论和试验,终于突发奇想的运用改变文件路径的源代码和创建文件相结合,终于实现了拷贝功能,能够将一个文件从一个目录拷贝到另一目录(即先移动过去然后再在原位置创建一个原文件),可是却无法拷贝到root根目录,为了解决这个问题,又在创建文件的程序里添加了一个判断是否为根目录的语句,可是后来又发现了真个系统存在重命名的问题。
简单文件系统的设计及实现一、实验目的:1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解2、要求设计一个 n个用户的文件系统,每次用户可保存 m 个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有 Create 、 delete 、open 、 close 、 read 、 write 等命令。
二、实验内容:1、设计一个 10个用户的文件系统,每次用户可保存 10个文件,一次运行用户可以打开 5个文件。
2、程序采用二级文件目录(即设置主目录 [MFD]和用户文件目录(UED 。
另外,为打开文件设置了运行文件目录(AFD 。
3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作4、算法与框图✓因系统小,文件目录的检索使用了简单的线性搜索。
✓文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为 0, 则表示不允许读写、执行。
✓程序中使用的主要设计结构如下:主文件目录和用户文件目录( MFD、 UFD ; 打开文件目录( AFD(即运行文件目录文件系统算法的流程图如下三、工具 /准备工作:在开始本实验之前,请回顾教科书的相关内容。
并做以下准备: 1 一台运行Windows 2000 Professional或 Windows 2000 Server的操作系统的计算机。
2 计算机中需安装 Visual C++ 6.0专业版或企业版四、实验要求:(1 按照学校关于实验报告格式的要求, 编写实验报告 (含流程图 ;(2实验时按两人一组进行分组,将本组认为效果较好的程序提交检查。
沈阳大学
沈阳大学
沈阳大学
沈阳大学
沈阳大学
沈阳大学
沈阳大学
沈阳大学
char content[256]; //文件内容
long next; //下个文件块地址
};
6.设计结果与分析
(1)、使用Microsoft Visual C++6.0建立文件系统所需的编码文件,建立完成后进行编译,经多次修改无误后运行进入系统。
首次进入系统,还没有文件系统,则会提示生成虚拟磁盘文件,格式化文件系统,创建分区,并初始化分区。
系统的初始化要完成文件系统的建立,包括以下几部分:请求内存、设置位示图、初始化文件索引、初始化文本块链表、初始化系统的当前状态、创建一个根目录做为系统的根。
生成虚拟磁盘文件如图8所示。
图8 生成虚拟磁盘文件
(2)、系统初始化后,没有用户,提示创建用户,在输入用户名及两次登录密码后,验证用户名是否有效,若有效则将用户名及登录密码添加进入存储系统,使用户下次能正常登录系统,新用户创建完成。
用户创建成功后出现对系统操作的菜单,此时菜单中的注册菜单功能即创建新用户的过程。
创建新用户如图9所示。
图9 创建新用户
(3)、用户登录,验证登录用户的身份,用户登录成功后会初始化当前用户等一系列的系统当前信息,显示当前用户下的所有文件及其详细信息,同时显示对文件操作的菜单。
如图10所示。
沈阳大学
图10 用户登录及文件操作菜单
(4)、新注册的用户默认为没有文件,选择创建文件功能项,输入文件名称,文件长度及文件的锁定状态,文件新建成功,并且每次对文件操作后显示当前用户的所有文件和操作菜单。
新建文件功能如图11所示。
图11 新建文件
(5)、对文件查看,默认创建的时候用0填充文件内容,如图12所示。
沈阳大学
图12 查看文件内容
(6)、接收修改文件内容命令后,等待用户输入要修改的文件名,然后输入修改的内容,用户输入完毕,按回车键(Enter),结束修改。
修改文件内容如图13所示。
图13 修改文件内容
(7)、当新建的文件为锁定状态,不能被删除。
对文件的锁定进行装换,将锁定状态的文件转换成自由读写状态,用户可随意对文件进行删除操作。
图14 锁定状态转换
(8)、当文件处于自由读写状态时可对文件进行删除操作,删除文件并不真正清理文件的物理存储内容,只是将文件的有效状态更改为无效。
沈阳大学
图15 删除文件
(9)、当用户完成对文件的管理,可以注销登录并退出系统。
7.设计心得体会
经过一周的努力,我的课程设计基本完成了,这次课程设计培养了我耐心,慎密、全面地考虑问题的能力,从而加快了问题解决的速度、提高了个人的工作效率,以及锻炼围绕问题在短时间内得以解决的顽强意志。
在编写程序的过程中,我的能力得到了提高,同时养成了科学、严谨的作风和习惯。
为此我要感谢信息学院开设了这门操作系统课程设计,为我们提供了进一步学习算法、操作系统和巩固C语言程序计设这个平台并。
同时还要感谢对同一题目进行攻关的同学们给予的帮助,没他们的帮助可能有很多问题我个人不能进行很好的解决。
在此我对他们帮助给予衷心的感谢。
首先,我认为这次课程设计是对学习《操作系统》的一次综合考察,锻炼我综合分析问题、解决问题的能力。
报课程设计的题目时,为程序本身的简单而窃喜过。
但到了实验的时候,才发现并非我想象的那么简单,实验过程中也出现了一些难题需要解决,为此去苦苦探索过。
课程设计期间,几乎每天都完全投入进去了,就像是在做一个相当重要的项目一样的感觉。
曾经跑过图书馆几次,只是为了一种新的想法得到实现,也曾多次登录网站浏览网页,为了弥补一些知识上的纰漏,为此曾洒下了真实的汗水。
当我的想法得到实现,又学会了新的知识的时候,心中满是欣喜,或许这是实践出真知的真实验证,有付出就有回报的真实写照吧。
其次,我感受了真诚的友谊。
在实验中,遇到的问题是多方面的,而且有那么一部分是以前学过的C问题,但是已经忘却或是以前没有真正的理解过。
但是你会发现就在你的身边,会有那么一批人在背后热心的帮助你,让你身处困境却感到无限希望。
这好
沈阳大学
沈阳大学
沈阳大学
沈阳大学
沈阳大学
沈阳大学
沈阳大学
沈阳大学
沈阳大学
课程设计说明书N O.21
沈阳大学。