课程设计课程名称________操作系统___ ____题目名称_多用户多级目录文件系统的实现_ 学生学院________计算机学院____________专业班级______ _________学号________ ___________学生姓名_________ _____________指导教师__________林穗______________2011年1月18日广东工业大学课程设计任务书题目名称多用户多级目录文件系统的实现学生学院计算机学院专业班级08软件工程一班姓名学号一、课程设计的内容本课程设计要求设计一个模拟的多用户多级目录的文件系统。
通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。
二、课程设计的要求与数据1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。
2.文件物理结构可采用显式链接或其他方法。
3.磁盘空闲空间的管理可选择位示图或其他方法。
如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。
4.文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
目录组织方式可以不使用索引结点的方式,但使用索引结点,则难度系数为1.2。
5.设计一个较实用的用户界面,方便用户使用。
要求提供以下相关文件操作:(1)具有login (用户登录)(2)系统初始化(建文件卷、提供登录模块)(3)文件的创建:create(4)文件的打开:open(5)文件的读:read(6)文件的写:write(7)文件关闭:close(8)删除文件:delete(9)创建目录(建立子目录):mkdir(10)改变当前目录:cd(11)列出文件目录:dir(12)退出:logout6.系统必须可实际演示,选用程序设计语言:C++、C等。
三、课程设计应完成的工作1.充分理解设计的任务,完成设计的基本要求。
然后根据自己的基础和能力选择不同难度的算法和实现方式,以取得更高的分数。
2. 独立独立完成系统的分析、设计、编码、测试工作。
3.完成设计报告的撰写。
4.以光盘(以班为单位刻录)方式提交已调试通过的完整的相关源程序和能够运行的执行文件;提交“课程设计报告”的书面和电子两种版本。
四、课程设计进程安排五、应收集的资料及主要参考文献[1]计算机操作系统,汤小丹等,西安电子科技大学出版社[2]操作系统实验指导书,傅秀芬,广东工业大学(自编)[3] 计算机操作系统教程( 第二版),张尧学、史美林,清华大学出版社[4] 现代操作系统,A.S.Tanenbaum 著,陈向群等译机械工业出版社发出任务书日期:2010年12月22日指导教师签名:林穗计划完成日期:2011年1月21日基层教学单位责任人签章:滕少华目录i.设计目的…………………………………………………………………ii.开发工具与环境…………………………………………………………iii.设计思想…………………………………………………………………iv.系统结构说明……………………………………………………………v.数据结构说明……………………………………………………………vi.各模块的算法流程图……………………………………………………1、程序总体源流程图……………………………………………………2、主要模块的算法流程图………………………………………………3、函数声明………………………………………………………………vii.程序运行及清单…………………………………………………………1、用户管理操作界面……………………………………………………2、文件管理操作界面……………………………………………………3、主要核心源代码………………………………………………………viii.操作说明书………………………………………………………………1、用户管理使用手册…………………………………………………2、文件操作管理使用手册……………………………………………ix.体会和建议………………………………………………………………………i.设计目的本课程设计要求设计一个模拟的多用户多级目录的文件系统。
通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。
ii.开发工具与环境a)程序设计语言:C语言b)计算机及操作系统:PC机,WindowsXPc)开发平台:Microsoft Visual C++ 6.0简化版d)运行平台:PC机,WindowsXPiii.设计思想课程设计采用Microsoft Visual C++ 6.0简化版作为开发工具,参照了windows资源管理器的结构,模拟文件管理的工作过程,通过创建一棵多叉树,及对这棵多叉树的操作,建立了一个树型文件系统,实现了文件和文件夹的创建,打开,读写,删除,关闭,复制,粘贴,查看,属性设置等十来个功能。
操作界面简单明了,操作方便。
iv.系统结构说明模拟文件管理系统可以自行设置多个用户进行管理操作,当选择已有用户时便可进入其文件管理菜单进行相应的操作(有界面提示功能),当进入系统已建立的某个用户时,可以创建用户自己的文件夹或文件,当flag=0时为创建文件,flag=1时创建文件夹(这里设置了标志位)。
文件除了名称和打开标志外,还可对他们的访问权限、文件类型和文件长度进行设置(长度设置主要在写入文件时会用到);而文件夹则可以设置访问权限等,打开文件列表的结构体包括文件名和文件的父节点地址,打开文件夹的链表中包括文件夹名称及其地址等;对文件的管理包含复制、打开、关闭、写入、读出、粘贴、新建文件(夹)、删除文件(夹)和显示文件(夹)等等,为方便操作还设置了各功能操作(如进入下一级、返回上一级、返回初始菜单、直接退出等等)。
下面的系统结构说明图示:其中P表示parent指针,C表示child指针,N表示next指针v.数据结构说明该模拟文件管理系统的文件目录检索采用简单的线性搜索,系统所采用的数据结构:typedef struct list LIST;struct list{char listname[10];int type;int length;int protect;int flag;char *content;struct list *parent;struct list *child;struct list *next;};typedef struct usd USD;struct usd{char username[10];LIST *list;struct usd *next;};vi.各模块的算法流程图1.程序总体流程图2.主要模块的算法流程图1)创建用户模块:2)删除用户3)创建文件(夹)4)删除文件夹5)复制文件3.函数声明void displayusermenu();///用户管理界面菜单void time();///系统时间void displayfilemenu();///文件管理界面菜单void creatuser();///新建用户void deleteuser();///删除用户void displayuser();///显示用户void userhelp();///用户管理帮助void filehelp();///文件管理帮助void selectuser();///选择用户void displaylist();///显示文件或者文件夹void creatfile(LIST *qq,int flag);///创建文件(夹)void deletefile(LIST *qq,int flag);///删除文件(夹)void openfile();///打开文件void readfile(); ///读取文件void writefile(); ///写入文件void closefile();///关闭文件void next();///下一层文件夹void back();//上一层文件夹void copyfile();//复制文件void pastedfile();///粘贴文件void quit();///直接退出系统vii.程序运行及清单系统界面简洁美观实用,用户无须输入过长指令就可以完成操作。
本系统还附带操作指南,用户如有疑问可查看指南说明。
虽不如可视化易操作,但也不难。
1、用户管理操作1)程序登陆界面2)程序开始界面(即用户管理界面)3)新建用户4)列出用户5)删除用户6)系统日期时间7)帮助文档8)退出系统9)选择用户输入用户名(若系统无此用户会有提示)按回车后即进入文件操作界面。
2、对文件管理操作1)进入用户后对文件操作初始界面2)新建文件3)新建文件夹4)显示当前路径文件(夹)5)删除文件文件存在时6)删除文件夹文件夹存在时7)打开文件文件存在时8)读出文件文件需要先置于打开状态,方可读取由于没有输入内容所以文件内容为空。
9)写入文件10)读出刚才写入的内容11)关闭文件12)复制文件(先将刚才关闭的文件aa1打开再复制)如果输入的文件名不存在该用户中时会有提示信息3、主要核心源代码(见电子版)#include <stdio.h>#include <math.h>#include <malloc.h>#include <string.h>#include <conio.h>#include <time.h>#include "stdlib.h"#define NULL 0#define get(type) (type *)malloc(sizeof(type)) //分配空间typedef struct list LIST;struct list{char listname[10]; // 文件名长度int type;int length; // 文件长度int protect; // 保护模式,0为只读,1为可读写int flag; // 标志,为0时创建文件夹,为1时创建文件char *content;.struct list *parent;struct list *child;struct list *next;};typedef struct usd USD;struct usd{char username[10]; // 用户名长度LIST *list;struct usd *next;};// 函数声明void displayusermenu(); // 用户管理界面菜单void login(); // 系统登陆界面void time(); // 系统时间void displayfilemenu(); // 文件管理界面菜单void creatuser(); // 新建用户void deleteuser(); // 删除用户void displayuser(); // 显示用户void userhelp(); // 用户管理帮助void filehelp(); // 文件管理帮助void selectuser(); // 选择用户void displaylist(); // 显示文件或者文件夹void creatfile(LIST *qq,int flag);// 创建文件(夹)void deletefile(LIST *qq,int flag);// 删除文件(夹)void openfile(); // 打开文件void readfile(); // 读取文件void writefile(); // 写入文件void closefile(); // 关闭文件void next(); // 下一层文件夹void back(); // 上一层文件夹void copyfile(); // 复制文件void pastedfile(); // 粘贴文件void quit(); // 直接退出系统USD *user=NULL,*currentuser=NULL;LIST *list=NULL,*currentlist=NULL,*copylist=NULL;void displayusermenu() // 显示用户菜单{system("cls"); // 清屏int button;printf("\n\n\t\t\t欢迎使用多用户多级目录文件系统\n\n"); printf("\t\t计算机学院\t\t软件工程1班\n\n");printf("\t\t \t\t \n\n\n");printf("\t\t1、新建用户\n");printf("\t\t2、删除用户\n");printf("\t\t3、选择用户\n");printf("\t\t4、列出用户\n");printf("\t\t5、系统时间\n");printf("\t\t6、帮助文档\n");printf("\t\t7、退出系统\n\n");printf("\t\t请按功能选择操作:");scanf("%d",&button);switch(button){case 1:creatuser();break; // 创建新用户case 2:deleteuser();break; // 删除用户case 3:selectuser();displayfilemenu();break; // 选择一个用户case 4:displayuser(); // 显示用户getchar();getchar();displayusermenu();break;case 5:system("cls"); //系统时间显示time();displayusermenu();break;case 6:userhelp(); // 帮助getch();displayusermenu();break;case 7:system("cls"); // 退出printf("\n\n\n\t\t\t\t欢迎再次使用!!\n\n");getch();exit(0);break;default :printf("\n\n\t\t\t你的输入有误!请重新输入!!!\n");getch();displayusermenu();break; // 输入非上述数字重新输入}}void displayfilemenu() // 显示文件管理操作菜单{system("cls"); // 清屏int choice;LIST *p=currentlist;printf("\n\t\t [%s]你好,欢迎进入文件管理系统\n",currentuser->username);//提示信息printf("\n 当前的文件路径:");// 接入目录地址do{printf("<%s",p->listname);p=p->parent;}while(p!=NULL);printf("\t\t[格式:子目录<--根目录]\n\n");printf(" 功能选择\n\n");//菜单printf("\t\t1、新建文件\t\t\t 9、复制文件\n");printf("\t\t2、删除文件\t\t\t10、粘贴文件\n");printf("\t\t3、新建文件夹\t\t\t11、显示当前路径文件(夹)\n");printf("\t\t4、删除文件夹\t\t\t12、进入下一级文件夹\n");printf("\t\t5、打开文件\t\t\t13、返回上一级文件夹\n");printf("\t\t6、读出文件\t\t\t14、返回用户管理菜单\n");printf("\t\t7、写入文件\t\t\t15、帮助与支持\n");printf("\t\t8、关闭文件\t\t\t16、直接退出系统\n\n");printf("\n\n");printf("\t\t\t按功能选择选择相应的操作(输入相关数字): ");scanf("%d",&choice);printf("\n");system("cls");switch(choice)//switch语句{case 1:creatfile(currentlist,0);break; // 创建文件case 2:deletefile(currentlist,0);break; // 删除文件case 3:creatfile(currentlist,1);break; // 创建文件夹case 4:deletefile(currentlist,1);break; // 删除文件夹case 5:openfile();break; // 打开文件case 6:readfile();displayfilemenu();break; // 读出文件case 7:writefile();displayfilemenu();break; // 写入文件case 8:closefile();break; // 关闭文件case 9:copyfile();break; // 复制文件case 10:pastedfile();break; // 粘贴文件case 11:displaylist(); // 显示文件(夹)getch();displayfilemenu();break;case 12:next();break; // 进入下一级文件夹case 13:back();break; // 返回上一级文件夹case 14:displayusermenu();break; // 退出,返回上用户管理菜单case 15:filehelp();displayfilemenu();break;case 16:quit();break;default :printf("\n\n\t\t\t你的输入有误!请重新输入!!!\n");getch();displayfilemenu();break; // 非法输入,返回文件管理菜单重新输入}}void login(){char username[20];char password[20];printf("\n\n\n\n");printf("\t\t\t系统登陆:(用户密码均为admin)\n\n");printf("\t\t\t请输入用户名:");scanf("%s",username);printf("\t\t\t请输入密码:");scanf("%s",password);if(strcmp(username,"admin")||strcmp(password,"admin")){printf("\n\t\t用户名或密码错误,请重新输入!\n");getch();system("cls");login();}}void time() // 显示系统时间日期{time_t now; // 调用系统日期时间time(&now);printf("\n\n \t\t\t系统当前日期时间\n\n");printf("\t\t\t %s",asctime(localtime(&now)));//显示系统详细时间printf("\n\n\n");getch();}void creatuser() // 创建用户{int i;char s;USD *p,*q=user;system("cls");p=get(USD);for(i=1;q!=NULL;i++)q=q->next; // i指示当前用户个数q=user;printf("\n\t\t\t\t[创建一个新用户]\n");printf("\n\t\t\t\t请输入NO.%d个用户名: ",i);scanf("%s",p->username); //输入新用户的名字LIST *l=list;l=get(LIST);strcpy(l->listname,p->username);l->next=NULL;l->type=1;l->parent=NULL;l->child=NULL;p->list=l;p->next=NULL;if(user==NULL){user=p; // 若user为空,则把P复给user}else // 若user不为空,则以有旧用户存在{while(q->next!=NULL){ // 寻找最后一个用户if(strcmp(p->username,q->username)==0){ // 比较,看系统是否已经存在该用户printf("\n\tthe user has exit ! try again !\n\n"); // 提示出错信息getchar();getchar();system("cls");displayusermenu();}q=q->next;}if(strcmp(p->username,q->username)==0){///检查提示重名并提示信息printf("\n\t\t\t该用户已经存在!无法创建该用户!\n\n");getchar();getchar();system("cls");displayusermenu();}q->next=p; //继续寻找下一个字符}printf("\n\t\t\t\t是否要再创建一个用户?(Y/N):"); //输入下一个用户scanf("%s",&s);switch(s){case 'y':creatuser();break;case 'Y':creatuser();break;case 'n':displayusermenu();break;case 'N':displayusermenu();break;default :displayusermenu();break;}}void deleteuser() //删除用户{char n[10];USD *p=user,*pre=NULL;displayuser();if(!p){printf("\n\t\t\t\t系统无用户可删除!\n"); //P为空,报错,必须先创建一个用户getchar();getchar();system("cls");displayusermenu();}printf("\n\n\t\t\t\t请输入要删除的用户名:");scanf("%s",n);while(p!=NULL){if(strcmp(p->username,n)==0) //寻找所要删除的用户{if(p==user){user=user->next; //若是第一个用户,则释放P }else{pre->next=p->next;}free(p);printf("\n\n\n\t\t\t\t 已经成功删除用户[%s]!!! ",n);break;}else{pre=p;p=p->next;}}if(p==NULL) //找不到用户{printf("\n\n\t\t\t找不到该用户!请确认该用户是否存在!\n");}getchar();getchar();system("cls"); displayusermenu();}void selectuser() //选择用户{char n[10];USD *p=user;displayuser();if(!p){printf("\n\t\t\t该用户不存在!请确认用户名是否正确!!!"); //没有用户getchar();getchar();system("cls");displayusermenu();}printf("\n\t\t\t\t[选择一个用户]");printf("\n\n\t\t\t\t请输入用户名:");scanf("%s",n); //输入用户名while(p!=NULL){if(strcmp(p->username,n)==0) //逐个比较寻找用户{currentuser=p; //找到对应用户,则把currentuser指向该用户currentlist=p->list;printf("%s\n",currentlist->listname);return;}else{p=p->next;}}if(p==NULL) //找不到用户{printf("\n\n\t\t\t\t该用户不存在!!!");getchar();system("cls");displayusermenu();}}void creatfile(LIST *qq,int flag) //创建文件(夹){LIST *temp;LIST *p=qq->child;LIST *q;temp=get(LIST);loop:q=qq->child;if(flag==0){printf("\n\t\t\t\t[创建一个新文件]\n");printf("\n\t\t\t\t请输入新建文件名: "); //输入文件名}else{printf("\n\t\t\t\t[创建一个新文件夹]\n");printf("\n\t\t\t\t请输入新建文件夹名: "); //输入文件名}scanf("%s",temp->listname);while(q!=NULL){if(strcmp(temp->listname,q->listname)==0){printf("\n\t\t\t相同路径下有重名文件!请重新输入!");goto loop;}q=q->next;}temp->content=NULL;printf("\n\t\t文件属性: 0、只读Read\t\t1、读和写Read&Write"); //设置保护模式printf("\n\n\t\t\t请根据提示选择保护模式(0/1)?: ");scanf("%d",&temp->protect);if(temp->protect!=0&&temp->protect!=1){ printf("\n\n\t\t\t你的选择有误!请重新输入(0/1)?: ");scanf("%d",&temp->protect);}if(flag==0){printf("\n\t\t\t\t请输入该文件的长度: "); //设置文件长度,供写入文件时会用到scanf("%d",&temp->length);}if(flag==0)temp->type=0; //0为文件else temp->type=1;temp->flag=0; //文件默认为关闭状态,以后需要时再打开temp->child=NULL;temp->next=NULL;temp->parent=currentlist;if(p==NULL){qq->child=temp;}else{while(p->next!=NULL){p=p->next;}p->next=temp;}getchar();displayfilemenu();}void deletefile(LIST *qq,int flag) //删除文件(夹){char n[10];LIST *p=qq->child;LIST *pre=NULL;if(flag==0){printf("\n\t\t\t\t[删除一个文件]\n");printf("\n\t\t\t\t请输入要删除的文件名: ");}else{printf("\n\t\t\t\t[删除文件夹]\n");printf("\n\t\t\t\t请输入要删除的文件夹名: ");}scanf("%s",n);while(p!=NULL){if((strcmp(p->listname,n)==0)&&(p->type==0)){if(pre==NULL) //第一个节点{qq->child=p->next;free(p);printf("\n\n\t\t\t\t文件%s已删除成功!!!\n",n);}else{pre->next=p->next; //把前一个指针的NEXT指向N当前指针的NEXT,则删除该文件printf("\n\n\t\t\t\t文件%s已删除成功!!!\n",n);free(p);}break;}else if((strcmp(p->listname,n)==0)&&(p->type==1)){if(pre==NULL) //第一个节点{qq->child=p->next;free(p);printf("\n\n\t\t\t\t文件夹%s已经成功删除!!!\n",n);}else{pre->next=p->next; //把前一个指针的NEXT指向N当前指针的NEXT,则删除该文件printf("\n\n\t\t\t\t文件夹%s已经成功删除!!!\n",n);free(p);}break;}else{pre=p;p=p->next;}}if(p==NULL&&flag==0) //该文件不存在printf("\n\n\t\t\t\t找不到该文件!");else if(p==NULL&&flag==1) printf("\n\n\t\t\t\t找不到该文件夹!\n");getchar(); //用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中)getchar();displayfilemenu();}void openfile() ////打开文件{char n[10];LIST *p=currentlist->child;printf("\n\t\t\t\t[打开一个文件]\n");printf("\n\t\t\t\t请输入要打开的文件名: ");//输入文件名scanf("%s",n);while(p!=NULL){if((strcmp(p->listname,n)==0)&&(p->type==0)&&(p->flag==0))//比较文件以寻找要打开的文件{p->flag=1;printf("\n\t\t\t\t文件%s成功打开!!!\n",n);break;}else if((strcmp(p->listname,n)==0)&&(p->type==0)&&(p->flag==1)){printf("\n\t\t\t\t文件%s打开已经!!!\n",n);break;}p=p->next;}if(p==NULL){printf("\n\n\t\t\t\t找不到该文件!\n");}getchar();getchar();displayfilemenu();}void readfile() //读出文件{char n[10];LIST *p=currentlist->child;printf("\n\t\t\t\t[读取一个文件]\n");printf("\n\n\t\t\t\t请输入要读的文件名: ");scanf("%s",n);while(p!=NULL){if((strcmp(p->listname,n)==0)&&(p->type==0)&&(p->flag==1))//比较{printf("\n\t\t\t文件%s内容是:%s",p->listname,p->content);getchar();getchar();system("cls");return;}p=p->next;}printf("\n\n\t\t读文件失败,请确认该文件是否已经打开或文件是否存在!\n");getchar();getchar();}void writefile() //写入文件{char n[10],*temp;LIST *p=currentlist->child;printf("\n\t\t\t\t[写入文件]\n");printf("\n\t\t\t\t请输入要写的文件名: ");scanf("%s",n);while(p!=NULL){if((strcmp(p->listname,n)==0)&&(p->type==0)){if(p->flag==0){printf("\n\t\t\t文件未打开,无法写入!请将文件置打开状态!!!\n");getchar();getchar();system("cls");}else if(p->protect==0){printf("\n\n\t\t\t操作受限!该文件不能写!!!\n"); //该文件限制读写getchar();system("cls");return;}else{temp=(char *)malloc(sizeof(char)*p->length);printf("\n\n\t\t\t\t请输入文件内容(length<=%d):\n\n\t",p->length);scanf("%s",temp);p->content=temp;getchar();system("cls");}return;}p=p->next;}printf("\n\n\t\t\t该文件不存在!获取失败!!!\n");//提示getchar();getchar();}void closefile() //关闭文件{char n[10];LIST *p=currentlist->child;printf("\n\t\t\t\t[关闭一个文件]\n");printf("\n\t\t\t\t请输入要关闭的文件名: ");scanf("%s",n);while(p!=NULL){if((strcmp(p->listname,n)==0)&&(p->type==0)&&(p->flag==1))//寻找需要文件{p->flag=0;printf("\n\t\t\t\t文件%s关闭成功.\n",n);break;}else if((strcmp(p->listname,n)==0)&&(p->type==0)&&(p->flag==0)){。