当前位置:文档之家› 操作系统课程设计1

操作系统课程设计1

操作系统原理课程设计报告题目:采用二级目录实现文件管理所在学院:班级:学号:姓名:指导教师:2013年1月15日目录一、课程设计目的 (1)二、课题内容 (1)三、总体路线 (1)四、概要设计 (2)1.数据结构 (2)2.所使用函数及其功能 (3)五、详细设计 (4)1.主函数流程图 (4)2.创建文件函数流程图 (5)3.删除文件函数流程图 (7)4.分解命令函数流程图 (10)六、测试、修改及运行结果 (10)七、结束语 (13)八、参考文献 (14)一、课程设计目的文件系统是现代OS用来存储和管理信息机构,具有按名存取的功能,不仅能方便用户对信息的使用,也有效提高了信息的安全性。

本课题模拟文件系统的目录结构,并在此基础上实现文件的各种操作方法。

通过本课题,深入理解文件文件目录的作用和功能,掌握文件打开结构,熟悉与文件有关的系统调用,从而更好地掌握文件系统概念。

二、课题内容1.文件目录采用二级目录结构,第一级为主文件目录master_file_directory;第二级为用户文件目录user_file_directory。

图1 master_file_directory 结构图2 user_file_directory 结构2.为加速文件存取,为每个用户建立一张用户打开表fileTable,用以记录该3.为该系统提供6条操作命令:创建、打开、读、写、关闭、删除等。

4.在该模拟系统中,应先建立主文件目录、用户目录和用户打开文件表,然后接受合法用户,给出一个菜单,按用户选择执行相关操作。

三、总体路线1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个简单的单用户文件系统。

在退出这个简单的文件系统时,应将该虚拟文件系统保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。

2.文件存储空间的分配采用显式链接分配。

为了实现创建和删除文件必须要有一棵初始的文件树存在,以便在文件树的根节点下实现创建和删除文件。

3.文件目录结构采用二级目录结构。

为了简单起见,可以使用文件结构体,结构体内容包括:文件名,文件目录识别标示,文件链接数,以及他的左孩子右孩子左兄弟右兄弟指4.要有分解函数对输入的命令进行分解。

以识别那部分是哪部分是命令,哪部分是路径和文件名。

5.最后要有执行函数。

来执行输入的创建文件命令。

四、概要设计1.数据结构(1)函数中的主要结构体//两级目录结构体typedef struct master_file_directory //主文件目录MFD{char userName[10];char password[10];UFD *user;}MFD;MFD userTable[MaxUser];int used=0; //定义MFD目录中用已有的用户数typedef struct user_file_directory //用户文件目录文件UFD{//char fileName[10];fileTable *file;user_file_directory *next;}UFD;//UFD *headFile;typedef struct fileTable //文件块结构体{char fileName[10];int strat; //文件在磁盘存储空间的起始地址int length; //文件内容长度int maxlength; //文件的最大长度char fileKind[3]; //文件的属性——读写方式struct tm *timeinfo;bool openFlag; //判断是否有进程打开了该文件//fileTable *next;};(2)结构体相互之间的调用关系图:图4 结构体关系图2.模块结构(1)所用函数及其功能:void Init();//初始化文件树int ParseCommand();//接受输入的命令并把其分解成操作名和路径文件名void ExecuteCommand();//执行命令,分别执行edit,del,dir,exit命令int editComd();//处理edit命令,即创建文件,只要创建表示文件的节点即可,内容及大小不考虑int delComd();//处理del命令,即删除指定文件,不存在是给出错误信息int dirComd();//处理dir命令。

问了能显示的看出创建文件和删除文件是否成功,把根目录的文件都显示出来int FindFilename(char Para2[]);//查找文件名struct FileNode* CreateFileNode(char filename[],int isdir,int i_nlink);//创建结点int GetInput(char* buffer,unsigned int buffer_len);//获取输入(2)所使用变量struct FileNode *cp, *tp, *root;// *cp, *tp, *root是根目录节点char path[INPUT_LEN-COMMAND_LEN];//记录当前走过的路径char Para1[COMMAND_LEN],Para2[INPUT_LEN-COMMAND_LEN];//para1数组存储输入的命令,para2数组存储输入的文件名char filename[FILENAME_LEN],tmp;unsigned int i,j;五、详细设计1.主函数流程图图5 主函数流程图2.创建文件函数流程图图6 创建文件函数流程图具体函数实现过程如下:int editComd(){//char tmp;struct FileNode * temp=CreateFileNode("",0,0);int sign;struct FileNode *tp;//路径不能为空if(strlen(Para2)==0){printf("\n命令格式有错误.\n");return 0;}//长度检查if(strlen(Para2)>50){printf("\n文件名过长\n");return 0;}//格式检查if (!(isalpha(Para2[0])||Para2[0]=='_'||Para2[0]=='\0'||Para2[0]=='/')){printf("文件名格式有错!\n");/* 文件首字母可以为'字母'或'数字'或'_'或'/'或'回车'*/return 0;}//获取文件名sign=FindFilename(Para2);if(sign==0)return 0;if(cp->isdir!=1)//如当前指针指向的是文件,则报错{printf("you cannot edit a file in under a file!\n");return 0;}//创建文件结点,并插入到指定目录下tp=CreateFileNode("",1,0);strcpy(tp->filename,filename);tp->isdir=0;tp->i_nlink=0;if(cp->child==NULL){ tp->parent=cp;tp->child=NULL;cp->child=tp;tp->sibling_prev=NULL;tp->sibling_next=NULL;}else{ temp=cp;//用temp找到新结点插入处temp=temp->child;while(temp->sibling_next )//find the last sibing node{temp=temp->sibling_next;if(strcmp(temp->filename,filename)==0&&temp->isdir==0){printf("此文件名已存在\n");//重名报错return 0;}}//找到了最后一个结点temp->sibling_next=tp;tp->parent=NULL;tp->child=NULL;tp->sibling_prev=temp;tp->sibling_next=NULL;}return 1;}3.删除文件函数流程图图7 删除函数流程图具体函数实现过程如下:int delComd(){// char tmp;int sign;struct FileNode *temp;//参数不能为空if(strlen(Para2)==0){printf("\n命令格式有错误.\n");return 0;}//获取文件名sign=FindFilename(Para2);if(sign==0) return 0;//用temp指向要删除的结点if(cp->child){temp=cp->child;while(temp->sibling_next && (strcmp(temp->filename,filename)!=0 || temp->isdir!=0))temp=temp->sibling_next;if(strcmp(temp->filename,filename)!=0){printf("不存在该文件!\n");return 0;}}else{printf("不存在该文件!\n");return 0;}//要删除的不能是目录if(temp->isdir!=0){printf("ERROR!该命令只能删除文件,不可删除目录!\n");return 0;}//如仍有用户使用该文件,则不能删除if(temp->i_nlink!=0){printf("还有用户共享了该文件,不能删除!\n");return 0;}//删除工作if(temp->parent==NULL)//不是第一个孩子{temp->sibling_prev->sibling_next=temp->sibling_next;if(temp->sibling_next)//处理是最后一个兄弟的情况temp->sibling_next->sibling_prev=temp->sibling_prev;temp->sibling_prev=temp->sibling_next=NULL;}//ifelse//第一个孩子{if(temp->sibling_next)//处理是最后一个兄弟的情况temp->sibling_next->parent=temp->parent;temp->parent->child= temp->sibling_next;}//elsefree(temp);return 1;}4.分解命令函数流程图图8 分解命令函数流程图六、测试修改及运行结果1.实际运行结果:初始界面2.键入用户名和密码创建账号3.登陆4.文件操作(1)创建文件(3)读文件(4)显示文件(6)删除文件七、结束语虽然我们做过很多次课程设计了,但是感觉自己还有好多需要学习的地方,接到题目要求时,设计大体的框架,考虑好所使用的数据结构,然后用高级编程语言分模块的把架子的思路编写出来,调试,运行,再看看是不是符合题目的要求,上网找些资料,看看想想是不是要提高要求,才可以满足实际的需要,最后把收集的劳动成果组合起来,一个小程序终于成型了,虽然每次的过程差不多都一样,但是每次都会有不同的体会。

相关主题