当前位置:文档之家› 多级文件目录的文件管理系统文件.doc

多级文件目录的文件管理系统文件.doc

山东理工大学计算机学院课程设计(操作系统)班级姓名学号指导教师二○一一年六月二十四日课程设计任务书及成绩评定课题名称基于多级文件目录的文件管理系统设计Ⅰ、题目的目的和要求:巩固和加深对操作系统(OS)原理的理解,初步掌握操作系统组成模块和应用接口的使用方法,提高进行工程设计和系统分析的能力;通过选做上面的课题,实现OS最基本模块的管理功能,重点放在数据结构设计、文档规范化和程序设计风格。

Ⅱ、设计进度及完成情况日期内容6.13-6.15 选取参考书,查阅有关文献资料,完成课程设计说明书内容 1 部分。

完成课程设计说明书内容2-4 部分6.16~6.20 创建相关数据结构, 录入源程序6.21~6.22 调试程序并记录调试中的问题,完成课程设计说明书第5 部分。

6.23 系统测试,演示设计成果,考核成绩。

整理课程设计说明书,上午11 时,由学习委员交课6.24 程设计说明书(计算机科学系9#213 或直接交给指导教师)Ⅲ、主要参考文献及资料[1] 汤子赢等. 计算机操作系统(第二版). 西安电子科技大学出版社,2006.8[2] 冯耀霖等. 操作系统,西安电子科技大学出版社.1992[3] 张尧学等. 计算机操作系统教程( 第2 版). 清华大学出版社,2001.4[4] 谭耀铭. 操作系统. 中国人民大学出版社,2003.4[5] 刘坤起. 操作系统学习辅导与习题详解[M]. 北京: 电子工业出版社, 2003:58-67[6] 孙钟秀等编著,操作系统教程[M],高等教育出版社,2003:46-78 Ⅳ、成绩评定:设计成绩:(教师填写)指导老师:(签字)二○一一年六月二十四日目 录第一章 概述 ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ 1 第二章 系统分析 ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ 2第三章 系统设计⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ 3第四章 程序设计流程图或 N-S 图⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯6第五章调试过程中的问题及系统测试情况⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯7第六章结束语⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ 9附录⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ 10第一章概述课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。

课程设计是让同学对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。

《计算机操作系统》一门重要的专业课,是开发操作系统和软件系统的理论和应用基础。

本课程设计要求设计一个基于多级文件目录的文件管理系统。

通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。

第二章系统分析1. 在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多级文件目录的文件管理系统。

2. 文件物理结构可采用显式链接或其他方法。

4. 文件目录结构采用多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。

目录组织方式可以不使用索引结点的方式,但使用索引结点,则难度系数为 1.2 。

5. 设计一个较实用的用户界面,方便用户使用。

要求提供以下相关文件操作:第三章系统设计1. 文件的操作(1)文件的创建:(2)文件的打开:(3)文件的读:read(4)文件的写:write(5)文件关闭:close2. 数据结构体1). 文件夹数据结构体:typedef struct MFD // 主文件目录{ char username[100];char password[100];FILE *fp; // 文件目录指针}MFD;2). 用户文件数据结构体:typedef struct UFD // 用户文件目录{ char filename[256];char protect; // 保护码int length; // 文件长度}UFD;3). 功能实现命令数据结构体:typedef struct COMM // 命令串{char string[256]; // 用户命令串struct COMM *next; // 后继指针: 指向命令各参数所在的结点}COMM;MFD mainfd[N]; // 主文件目录数组UFD userfd[M]; // 用户文件目录数组OFD openfd[L]; // 打开文件目录数组COMM *command; // 命令串指针int next;}DISK;3. 主要模块组成1). 头文件:#include <io.h>#include <conio.h> // 里面有clrscr() 清屏函数#include <stdio.h>#include <stdlib.h>#include <malloc.h> // 内存分配函数#include <string.h>#include <ctype.h>#define N 30 // 用户数#define M 20 // 一个用户可保存M个文件#define L 5 // 用户只能一次打开L 个文件2). 功能模块实现函数:void init(); // 初始化主文件目录数组void init_ufd(char *username); // 初始化用户文件目录void mesg(char *str); // 输出函数char *getuser(); // 设置用户函数声明char *getpass(); // 设置口令函数声明COMM *readcommand(); // 读命令串函数声明void login(); // 用户登录void setpass(); // 设置口令void create(); // 创建用户文件void mydelete(); // 删除void myread(); // 读void myopen(); // 打开void myclose(); // 关闭void mywrite(); // 写void help(); // 帮助第四章程序设计流程图或N-S 图开始输入用户NO判断是否存在YES创打读写删关创改列建开文文除闭建变出文文件件文文子子子件件件件目目目录录录NO是否退出YES结束图1 程序流程图第五章调试过程中的问题及系统测试情况1. 运行后主界面显示图2 主界面2. 输入login 命令用户登陆,当用户账号不存在时,即可创建:图3 创建用户3. 创建用户下文件功能实现:图4 创建用户4. 打开文件open 命令功能的实现图5 打开文件5. 读文件read 命令功能实现图6. 读文件6. 写文件write 命令功能实现,及对内容中添加实现图7 写文件8. 退出文件logout 操作图8 退出文件第六章结束语这次操作系统课程设计,在编写过程中,遇到很多难题,特别是在操作系统实验中不曾注意到的问题,也有许多新的问题,在实际反复调试运行中,不断加深了对操作系统的理解,也很大地程度上提高了编程的能力,由于对重要概念的把握程度还不够深入,在实际理解编写时遇到很多不该发生的问题。

不过,都很好的解决并牢牢地掌握住了。

通过做多级目录文件系统,我知道了多级目录文件系统的工作原理,在打开文件时系统是如何进行操作的,并加深了理解。

希望在以后的学习中,继续保持这份昂扬的斗志,继续努力学习计算机方面的知识,永不懈怠。

通过这次课程设计,不仅让我了解了多级目录文件系统,更重要的还让我学会了、或者说是验证了“做事一定要有次序和对事物的总体把握”这句话。

开始我一味的进行调试,急切的想侥幸调试出来,但由于没有进行深入的考虑,我调试了很久都没没有成功,我仔细的分析题目,分析材料,在原由的基础上我进行了改正,我最后还是调试成功了,虽然还是经过了一翻努力,当然汗水还是留的很值,这次操作系统实习,不仅让我对操作系统这门课程有了更深入的研究、对很多重要的概念有了巩固和掌握,还给了我今后做事的启示。

做事要塌实,不能想着一步登天,要有计划,有目的的进行做事。

盲目真的不应该再在我们新一代的大学生身上出现了,我们应该认真找到自己的缺点并且及时改正。

在这里,我如果不说感谢的话,不知道要说些什么好;首先感谢学校和父母,然后更重要的是感谢老师的教导。

“活到老,学到老”,这也是我整个学习过程中的一次经验、一次总结,我相信它肯定会给我今后的学习有所启示和指导作用。

附录:源程序代码:#include <io.h>#include <conio.h> //里面有clrscr()清屏函数#include <stdio.h>#include <stdlib.h>#include <malloc.h> //内存分配函数#include <string.h>#include <ctype.h>#define N 30 //用户数#define M 20 //一个用户可保存M 个文件#define L 5 //用户只能一次打开L 个文件typedef struct MFD //主文件目录{char username[100];char password[100];FILE *fp; //文件目录指针}MFD;typedef struct UFD //用户文件目录{char filename[256];char protect; //保护码int length; //文件长度}UFD;typedef struct OFD //打开文件目录{char filename[256];char opencode; //打开保护码int *fp; //读写指针}OFD;typedef struct COMM //命令串{char string[256]; //用户命令串struct COMM *next; //后继指针:指向命令各参数所在的结点}COMM;MFD mainfd[N]; //主文件目录数组UFD userfd[M]; //用户文件目录数组OFD openfd[L]; //打开文件目录数组COMM *command; //命令串指针char username[100];int usernum,savenum,opennum;int workfile;void init(); //初始化主文件目录数组void init_ufd(char *username); //初始化用户文件目录void mesg(char *str); //输出函数char *getuser(); //设置用户函数声明char *getpass(); //设置口令函数声明COMM *readcommand(); //读命令串函数声明void login(); //用户登录void setpass(); //设置口令void create(); //创建用户文件void mydelete(); //删除void myread(); //读void myopen(); //打开void myclose(); //关闭void mywrite(); //写void help(); //帮助void main(){init();printf("\n\t\t 计科0804 班0812103773 张超");printf("\n\t\t ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ");printf("\n\t\t 多级文件目录的文件管理系统");printf("\n\t\t ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ");printf("\n\t\t 选择命令:");printf("\n\t\t login setpass create ");printf("\n\t\t open read write delete");printf("\n\t\t help exit copy rename");printf("\n\t\t 首次使用请输入help 命令请求帮助");printf("\n\t\t 使用中欢迎以help [<command>]请求帮助");while(1){readcommand();if(strcmp(command->string,"create")==0)create();else if(strcmp(command->string,"delete")==0)mydelete();else if(strcmp(command->string,"open")==0)myopen();else if(strcmp(command->string,"close")==0)myclose();else if(strcmp(command->string,"read")==0)myread();else if(strcmp(command->string,"write")==0)mywrite();else if(strcmp(command->string,"login")==0)login();else if(strcmp(command->string,"setpass")==0)setpass();else if(strcmp(command->string,"help")==0)help();else if(strcmp(command->string,"exit")==0)break;elsemesg("Bad command!");}}void mesg(char *str){printf("\n %s\n",str);}void init() //初始化主文件目录数组{FILE *fp; //文件指针char tempname[20],temppass[20];usernum=0; //全局变量初始化savenum=0;opennum=0;strcpy(username,"");//用户使用时,建立一个mainfile.txt 文件,包括每个用户的用户名和口令//然后,才能运行此程序if((fp=fopen("mainfile.txt","r"))!=NULL)// 以读方式打开文件mainfile.txt{while(!feof(fp))// 若不是文件尾{strcpy(tempname,""); //清空数组操作fgets(tempname,20,fp); //读用户名if(strcmp(tempname,"")!=0){fgets(temppass,20,fp);tempname[strlen(tempname)-1]='\0'; //设置串结束符temppass[strlen(temppass)-1]='\0';strcpy(mainfd[usernum].username,tempname); //生成mainfd 数组strcpy(mainfd[usernum].password,temppass); //生成userfd数组usernum++; //生成usernum 的值}if(usernum>=N)break;}fclose(fp);}}void init_ufd(char *username) //初始化用户文件目录{FILE *fp;char tempfile[100],tempprot;int templength;savenum=0;opennum=0;workfile=-1;if((fp=fopen(username,"r+"))!=NULL){while(!feof(fp)){strcpy(tempfile,"");fgets(tempfile,50,fp);if(strcmp(tempfile,"")!=0){fscanf(fp,"%c",&tempprot);fscanf(fp,"%d",&templength);tempfile[strlen(tempfile)-1]='\0';strcpy(userfd[savenum].filename,tempfile); //文件名userfd[savenum].protect=tempprot; //保护码userfd[savenum].length=templength; //文件长度savenum++;fgets(tempfile,50,fp);}}}}char *getuser() //设置用户函数声明{char username[20];char temp;int i;username[0]='\0';for(i=0;i<20;){while(!kbhit()); //按用户名规则输入用户名temp=getch();if(isalnum(temp)||temp=='_'||temp==(char)13){username[i]=temp;if(username[i]==(char)13){username[i]='\0';break;}putchar(temp);i++;username[i]='\0';}}return username;}char *getpass() //设置口令函数声明{char password[20];char temp;int i;password[0]='\0';for(i=0;i<20;){while(!kbhit()); //等待按键temp=getch();if(isalnum(temp)||temp=='_'||temp==(char)13){password[i]=temp;if(password[i]==(char)13){password[i]='\0';break;}putchar('*');i++;password[i]='\0';}}returnpassword; }COMM *readcommand() //读命令串函数声明{char temp[256];char line[256]; unsignedint i,end;COMM *newp,*p;command=NULL;strcpy(line,"");while(strcmp(line,"")==0){printf("\nc:\\>");gets(line); //输入一个命令串}for(i=0;i<=strlen(line);i++){if(line[i]==' ')i++;end=0;while(line[i]!='\0'&&line[i]!=' '){temp[end]=line[i];end++;i++;}if(end>0) //对命令行中的子串进行处理{temp[end]='\0';newp=(COMM*)malloc(sizeof(COMM*));strcpy(newp->string,temp);newp->next=NULL;if(command==NULL)command=newp; //把各子串链成一个链表else{p=command;while(p->next!=NULL)p=p->next;p->next=newp;}}}p=command;return command;}void login() //用户注册{FILE *fp;int i;char password[20],confirm[20],tempname[20];if(command->next==NULL){printf("\n User Name:");strcpy(tempname,getuser()); //输入用户名并且返回之}else if(command->next->next!=NULL){mesg("Too many parameters!");return;}else strcpy(tempname,command->next->string);for(i=0;i<usernum;i++)if(strcmp(mainfd[i].username,tempname)==0)break; //从mainfd 表中查找要注册的用户if(i>=usernum) //新用户{printf("\n 新用户账号,输入你的密码两次!");printf("\n 密码:");strcpy(password,getpass()); //输入口令并且返回之printf("\n 密码:");strcpy(confirm,getpass()); //第二次输入口令if(strcmp(password,confirm)==0) //两次输入的口令是否相同的处理情况{if(usernum>=N) //用户数不能超过Nmesg("创建新账号错误!用户账号字符超过限制.\n 登陆失败!");else{strcpy(mainfd[usernum].username,tempname); //把新用户和口令填入mainfd 中strcpy(mainfd[usernum].password,password);usernum++;strcpy(username,tempname);mesg("创建新用户!\n 登陆成功恭喜!");init_ufd(username); //初始化用户文件目录fp=fopen("mainfile.txt","w+"); //把新用户填入mainfile.txt 文件中for(i=0;i<usernum;i++){fputs(mainfd[i].username,fp);fputs("\n",fp);fputs(mainfd[i].password,fp);fputs("\n",fp);}fclose(fp);}}else //两次输入的口令是否相同的处理情况{mesg("创建新用户失败!两次输入密码不一致!");mesg("登陆失败!");}}else //注册过的用户登陆{printf("\n 密码:");strcpy(password,getpass());if(strcmp(mainfd[i].password,password)!=0)mesg("登陆失败!输入密码错误!");else{mesg("登陆成功恭喜你!");strcpy(username,tempname);init_ufd(username);}}}void setpass() //重新设置口令{int i;FILE *fp;char oldpass[20],newpass[20],confirm[20];if(strcmp(username,"")==0)mesg("No user login!");else{printf("\n 旧密码:");strcpy(oldpass,getpass());for(i=0;i<usernum;i++)if(strcmp(mainfd[i].username,username)==0)break;if(strcmp(mainfd[i].password,oldpass)!=0)mesg("旧密码错误!");else{printf("\n 新密码:");strcpy(newpass,getpass());printf("\n 确认密码:");strcpy(confirm,getpass());if(strcmp(newpass,confirm)!=0)mesg("密码修改错误! 确认密码错误.请重新输入");else{strcpy(mainfd[i].password,newpass);mesg("Password changed!");fp=fopen("mainfile.txt","w+");for(i=0;i<usernum;i++) //写回到mainfile.txt{fputs(mainfd[i].username,fp);fputs("\n",fp);fputs(mainfd[i].password,fp);fputs("\n",fp);}fclose(fp);}}}}void create(){mesg("File open success!");}void myopen() //打开文件{int i;int type=0;char tempcode;char tempfile[100];if(strcmp(username,"")==0)mesg("No user login!");elseif(command->next==NULL)mesg("Too few parameters!");else //存在2 个或3 个参数的处理{strcpy(tempfile,"");tempcode='r';if(strcmp(command->next->string,"/r")==0){tempcode='r';type=1;}else if(strcmp(command->next->string,"/w")==0){tempcode='w';type=1;}else if(strcmp(command->next->string,"/d")==0){tempcode='d';type=1;}else if(command->next->string[0]=='/')mesg("Error! /r /w /d request!");else if(command->next->next!=NULL)mesg("Too many parameters!");elsestrcpy(tempfile,command->next->string);if(type==1) //三个参数的情况补充if(command->next->next!=NULL)if(command->next->next->next!=NULL)mesg("Too many parameters!");else strcpy(tempfile,command->next->next->string);else mesg("Too few parameters!");if(strcmp(tempfile,"")!=0){for(i=0;i<savenum;i++)if(strcmp(tempfile,userfd[i].filename)==0)break;if(i>=savenum)mesg("File not existed!");else //文件存在的情况{for(i=0;i<opennum;i++)if(strcmp(tempfile,openfd[i].filename)==0)break;if(i<opennum) //文件已经打开{mesg("File already opened!");if(openfd[i].opencode!=tempcode){openfd[i].opencode=tempcode;mesg("File permissionchanged!"); }}else if(opennum>=L) //打开的文件已经占满了 5 个名额mesg("Error! cannot open file! nimber of opened files limited!");else //打开处理{strcpy(openfd[opennum].filename,tempfile);openfd[opennum].opencode=tempcode;workfile=opennum;opennum++; mesg("Fileopen success!");}}}}}void myclose() //关闭文件{int i,j;char tempfile[100];if(strcmp(username,"")==0)mesg("No user login!");else{if(command->next==NULL)mesg("Too few parameters!");else if(command->next->next!=NULL)mesg("Too many parameters!");else{strcpy(tempfile,command->next->string);for(i=0;i<savenum;i++)if(strcmp(userfd[i].filename,tempfile)==0)break;if(i>=savenum) //文件不存在mesg("文件不存在!");else{for(j=0;j<opennum;j++)if(strcmp(openfd[j].filename,tempfile)==0)break;if(j>=opennum) //文件存在了但是没有打开mesg("文件存在了但是没有打开!");else //文件存在并且打开{strcpy(openfd[j].filename,"");openfd[j].opencode=' ';opennum--;mesg("文件关闭成功!");}}}}}void mydelete() //删除文件{int i,j;int tempsave; //用于确定被删除文件在数组userfd[M] 中的位置char tempfile[100];FILE *fp;if(strcmp(username,"")==0)mesg("没有用户登陆!");else{if(command->next==NULL)mesg("Too few parameters!");else if(command->next->next!=NULL)mesg("太多参数导致错误!");else{strcpy(tempfile,command->next->string);for(i=0;i<savenum;i++)if(strcmp(userfd[i].filename,tempfile)==0)break;tempsave=i;if(tempsave>=savenum) //文件不存在mesg("the file donot existed!");else{for(j=0;j<opennum;j++)if(strcmp(openfd[j].filename,tempfile)==0)break;if(j<opennum) //文件存在了但是打开{mesg("文件不能删除!");mesg("首先需要关闭它!");}else //文件存在并且没有打开{strcpy(userfd[tempsave].filename,"");userfd[tempsave].protect=' ';userfd[tempsave].length=0;savenum--;for(i=tempsave;i<=savenum;i++) //从新将数组userfd[M]排序{strcpy(userfd[i].filename,userfd[i+1].filename);userfd[i].protect=userfd[i+1].protect;userfd[i].length=userfd[i+1].protect;}mesg("File delete!");fp=fopen(username,"w+"); //写回到文件usernamefor(i=0;i<savenum;i++){fputs(userfd[i].filename,fp);fputs("\n",fp);fprintf(fp,"%c\n%d\n",userfd[i].protect,userfd[i].length);}fclose(fp);}}}}}void myread() //读操作{int i;int tempsave;char tempfile[100];if(strcmp(username,"")==0)mesg("没有用户登陆!");else if(command->next==NULL)mesg("参数太少导致错误!");else if(command->next->next!=NULL)mesg("参数太多导致错误!");else{strcpy(tempfile,command->next->string);for(i=0;i<savenum;i++)if(strcmp(tempfile,userfd[i].filename)==0)break;if(i>=savenum)mesg("文件不存在!");else{tempsave=i;for(i=0;i<opennum;i++)if(strcmp(tempfile,openfd[i].filename)==0)break;if(i>=opennum)mesg("文件没有打开!");else{if(userfd[tempsave].length<1000)printf("\n The file size is %d B",userfd[tempsave].length);elseif(userfd[tempsave].length=1000)printf("\n The file size is 1000 B");elseprintf("\n The file size is %d,%d KB",userfd[tempsave].length/1000,userfd[tempsave].length%1000);mesg("文件读取成功!");}}}}void mywrite() //写操作{int i;int tempsave;char tempfile[100];if(strcmp(username,"")==0)mesg("没有用户登陆!");else if(command->next==NULL)mesg("参数太少导致错误!");else if(command->next->next!=NULL)mesg("参数太多导致错误");else{strcpy(tempfile,command->next->string);for(i=0;i<savenum;i++)if(strcmp(tempfile,userfd[i].filename)==0)break;if(i>=savenum)mesg("文件不存在!");else{tempsave=i;for(i=0;i<opennum;i++)if(strcmp(tempfile,openfd[i].filename)==0)break;if(i>=opennum)mesg("文件没有打开!");else{if(userfd[tempsave].length<1000)printf("\n The file size is %d KB",userfd[tempsave].length);elseif(userfd[tempsave].length=1000)printf("\n The file size is 1000KB");elseprintf("\n The file size is %d,%d KB",userfd[tempsave].length/1000,userfd[tempsave].length%1000);mesg("文件写成功!");}}}}void help() //帮助说明{ system("CLS"); //清屏static char *cmd[]={"login","setpass","create","open","read","write","delete","help","exit","copy","rename"};static char *cmdhlp[]={" 命令格式:login [<username>]","命令格式:setpass","命令格式:create <filename>","命令格式:open [/r|/w|/d] <filename>","命令格式:read <filename>","命令格式:write <filename>","命令格式t:delete <filename>","命令格式:help [<command>]","命令格式:exit","命令格式:copy <source filename> <destination filename>","命令格式:rename <old filename> <new filename>"};static char *detail[]={" 解说:用户进入多用户多级目录文件系统.","解说:修改用户密码.","解说:用户退出多用户多级目录文件系统.","解说:创建新文件.","解说:/r--只读[deflaut] \n\t /w-- 读和修改\n\t /d--读、修改和删除.","解说:读文件.","解说:修改新文件.","解说:删除新文件.","解说:/u--列出用户账号\n\t /o--列出打开文件\n\t /f --列出用户文件[deflaut]","解说:<command>--列出命令详细格式和解说.\n\t [deflaut] 列出命令.","解说:退出文件系统","解说:复制一个文件到另一个文件","解说:修改文件名."};int helpnum=13;int i;if(command->next==NULL){mesg(cmdhlp[9]);mesg(detail[9]);printf("\t 输入用户名是旧用户就直接登陆,否则就创建新用户");mesg("步骤2:打开(open命令)文件再读(read命令),写(write 命令),删除(delete命令)");printf(" 你可以打开一个或多个文件,一个命令能打开一个文件");mesg("步骤3:读(read命令),写(write 命令)或删除(delete命令)一些文件");printf(" 你可以操作打开文件中的一个,一个命令能操作一个文件");mesg("步骤4:关闭(close命令)打开文件");printf(" 你能关闭(close命令)一个打开的文件,一个命令能打开一个文件");mesg("步骤5:用户退出关闭所有用户打开的文件");printf(" \n 可输入的命令清单:");for(i=0;i<helpnum;i++){if(i%4==0)printf("\n");printf("%-10s",cmd[i]); }}else if(command->next->next!=NULL)mesg("参数太多");else{for(i=0;i<helpnum;i++)if(strcmp(command->next->string,cmd[i])==0)break;if(i>=helpnum)mesg("这命令不存在!");else{mesg(cmdhlp[i]);mesg(detail[i]);}}}。

相关主题