多用户多级目录多文件
- 格式:doc
- 大小:162.50 KB
- 文档页数:29
河南城建学院《操作系统》课程设计报告课程名称:《计算机操作系统》课程设计设计题目:模拟文件管理系统指导教师:李蓓耿永军班级:0844121学号:学生姓名:同组人员:计算机科学与工程学院2014年6月19日前言在现在计算机更新如此迅速的时代要学好计算机软件技术,特别是操作系统的学习,不仅要努力学好课本上的基础知识,还要经常在图书馆看些有关这方面的书籍,而更重要的是要有足够的实践经验,也要注重和同学的交流,经常尝试性的做些小的操作系统,对自己技术的提升会有很大的帮助。
同时,学习计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。
如何学习和掌握操作系统技术的原理与实际技巧呢?除了听课和读书之外,最好的方法恐怕就是在实践中练习。
例如,自己设计一个小型操作系统,多使用操作系统,多阅读和分析操作源代码等。
但由于我们的条件和学时有限,在理论学习过程中没有给同学们提供更多的实验机会。
本操作系统课程设计,是给同学提供一个集中实验的机会。
希望同学们通过该设计加深对所学习课程的理解。
本设计是一个文件系统模拟程序设计,模拟文件管理的工作过程。
我做的课程设计是:模拟文件管理系统。
本课程设计要求设计一个模拟的多用户多级目录的文件系统。
通过具体的文件存储空间的管理,文件物理结构,目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。
通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识,加深对教材中的重要算法的理解。
同时通过编程实现这些算法更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。
目录一.系统环境 (2)1.1硬件环境 (2)1.2软件环境 (2)二.设计目的及要求 (2)三.总体设计 (4)四.详细设计 (5)五.调试与测试 (9)六.设计中遇到的问题及解决方法 (10)七.多用户多级目录文件系统分析源程序清单 (11)7.1 头文件 (11)7.2 示例程序........................................................ 错误!未定义书签。
八.运行结果及分析 (26)九.心得体会 (26)十.参考文献 (27)一.系统环境1.1硬件环境内存1GB,处理器1,硬盘(SCSI)50GB,网络适配器NAT。
1.2软件环境1)Microsoft Windows XP Professional 版2002 Service Pack 3 2)Vmware Workstation 10.0.1 build-13797763)Red Hat Linux 9二.设计目的及要求2.1设计目的学习计算机软件技术,特别是计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。
如何学习和掌握操作系统技术的原理与实际技巧呢?除了听课和读书之外,最好的方法恐怕就是在实践中练习。
例如,自己设计一个小型操作系统,多使用操作系统,多阅读和分析操作源代码等。
但由于条件和学时有限,在理论学习过程中没有给提供更多的实验机会。
本操作系统课程设计,是提供了一个集中实验的机会。
应该通过该设计加深对所学习课程的理解。
2.2设计要求1)在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。
2)文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
目录组织方式可以不使用索引结点的方式,但使用索引结点,则难度系数为1.2。
3)设计一个较实用的用户界面,方便用户使用。
要求提供以下相关文件操作:(1)具有login (用户登录)(2)系统初始化(建文件卷、提供登录模块)(3)文件的创建:create(4)文件的打开:open(5)文件的读:read(6)文件的写:write(7)文件关闭:close(8)删除文件:delete(9)创建目录(建立子目录):mkdir(10)改变当前目录:cd(11)列出文件目录:dir(12)退出:logout4)系统必须可实际演示,选用程序设计语言C语言。
2.3设计内容模拟文件管理系统:本课程设计要求设计一个模拟的多用户多级目录的文件系统。
通过具体的文件存储空间的管理,文件物理结构,目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。
通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识,加深对教材中的重要算法的理解。
同时通过编程实现这些算法更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。
三.总体设计系统模块图:程序流程图:四.详细设计1、实现原理本程序是一个文件系统模拟程序,模拟文件管理的工作过程。
本程序设计一个最多有10个用户的文件系统,实现文件系统的模拟管理程,可以进行创建用户、删除用户、创建文件、删除文件、创建文件夹、删除文件夹、读文件、写文件、执行文件、打开文件、关闭文件、显示目录等操作。
程序设置了主目录MFD 、用户文件目录UFD 和用户文件夹目录UDD ,为打开文件设置了运行目录AFD 。
文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0则表示不允许读写、执行。
MFD UFDUDD AFD2、实现原理图UFD UFD3、实现用到的数据结构结构体UFD:typedef struct ufd{char filename[10];/*文件名*/char filecon[100];/*文件内容*/char procode[8];/*属性*/int length;/*文件长度*/struct ufd *nextfile;/*指向下一个文件*/}UFD;结构体UDDtypedef struct udd{char foldername[10];/*文件夹名*/struct ufd *clink;/*指向该文件夹的第一个文件*/struct udd *cnext;/*指向该文件夹的第一个文件夹*/ struct udd *link;/*指向同级文件夹*/}UDD;结构体MFDtypedef struct mfd{char username[10];/*用户名*/struct ufd *link;/*指向该用户的第一个文件*/struct udd *clink;/*指向该用户的第一个文件夹*/ }MFD;结构体PROtypedef struct protected_flag{char code[4];}PRO;结构体AFDtypedef struct afd{/*运行文件目录*/char filename[10];/*打开文件名*/char filecon[100];char procode[4];int rwpointer;/*读写指针*/}AFD;AFD *afd=NULL;PRO flag[3]={"100",/*只读*/"110",/*读写*/"001"/*可执行*/};五.调试与测试六.设计中遇到的问题及解决方法首先我们组是第十题,然后没看懂,直接在网上找的代码,全部都是linux 下的代码,根本看不懂,也没问老师怎么办,星期一就在虚拟机与代码之间度过了,到头来还是不懂,星期二中午知道有人换题目了,我们的题比他们的还难,所以就请求老师换了题目,下面就是这个题目带来的诸多问题,这个题目本来打算自己敲代码,可是还是懵懵懂懂,不知道怎么用代码实现,题目很抽象,然后就找个一个代码,找到的代码不能运行,开始改代码,十七页的代码看了一遍搞懂了,接着找出里面的错误,开始修改里面错误非常多,改完以后发现和题目要求的功能不对,并且还不能在Linux虚拟机下运行。
七.多用户多级目录文件系统分析源程序清单#include<stdio.h>#include<string.h>#include<malloc.h>#include<stdlib.h>#include<conio.h>int choice; /*操作类型*/int ex,num;typedef struct ufd{char filename[10];/*文件名*/char filecon[100];/*文件内容*/char procode[8];/*属性*/struct ufd *nextfile;/*指向下一个文件*/}UFD;UFD *rw_pointer;typedef struct udd{char foldername[10];/*文件夹名*/struct ufd *clink;/*指向该文件夹的第一个文件*/struct udd *cnext;/*指向该文件夹的第一个文件夹*/ struct udd *link;/*指向同级文件夹*/}UDD;typedef struct mfd{char username[10];/*用户名*/struct ufd *link;/*指向该用户的第一个文件*/struct udd *clink;/*指向该用户的第一个文件夹*/}MFD;MFD filesystem[10];typedef struct protected_flag{char code[4];}PRO;typedef struct afd{/*运行文件目录*/char filename[10];/*打开文件名*/char filecon[100];char procode[4];}AFD;AFD *afd=NULL;PRO flag[3]={"100",/*只读*/"110",/*读写*/"001"/*可执行*/};/*-------------------显示目录-------------------------*/void displayallfile(){int i;UFD *p;UDD *q;system("cls");/*清屏*/printf("\t* * * * * * * * * * * * * * * *\n");printf("\t\t显示目录\n");printf("\t* * * * * * * * * * * * * * * *\n");for(i=0;i<num;i++){printf("用户 :%s 目录如下!\n",filesystem[i].username);p=filesystem[i].link;q=filesystem[i].clink;while(p){printf("\t文件名: %s\t||",p->filename);printf("文件属性: %s\t||",p->procode);p=p->nextfile;}while(q){printf("\t文件夹名: %s\n",q->foldername);q=q->link;}}}/*-------------------建立用户-------------------------*/void createuser(){int i;char username[10];system("cls");/*清屏*/printf("\t* * * * * * * * * * * * * * * *\n");printf("\t\t建立用户\n");printf("\t* * * * * * * * * * * * * * * *\n");if(num>=10)/*用户文件目录已满,创建文件失败*/{printf("用户已满\n创建文件失败!\n");return;}printf("输入用户名:\n");scanf("%s",username);for(i=0;i<num;i++){if (!strcmp(filesystem[i].username,username)){printf("用户名已存在,请输入新用户名!\n");scanf("%s",username);}}strcpy(filesystem[num].username,username);num++;printf("用户已创建!\n");}/*-------------------查找用户-------------------------*/int findusername(char * username)//返回用户名下标,当I=NUM时,用户不存在*/{int i;i=0;while(i<num){if(!strcmp(filesystem[i].username ,username))break;i++;}return i;}/*-------------------删除用户-------------------------*/void deleteuser(){int i;char cs,username[10];UFD *p1,*p2;system("cls");/*清屏*/printf("\t* * * * * * * * * * * * * * * *\n");printf("\t\t删除用户\n");printf("\t* * * * * * * * * * * * * * * *\n");printf("\n输入用户名:\n");scanf("%s",username);i=findusername(username);/*返回用户名下标*/if(i>=num){printf("用户不存在!\n删除失败!\n");return ;}else{printf("是否删除用户%s及用户%s下所有东西?(y/n)",filesystem[i].username,filesystem[i].username);cscanf("%c",&cs);if(cs=='y'){p1=p2=filesystem[i].link;while(p2){p2=p2->nextfile;free(p1);p1=p2;}for(i;i<num-1;i++)filesystem[i]=filesystem[i+1];num--;printf("\n用户已删除!\n");}elsereturn;}}/*-------------------查找文件-------------------------*/UFD * findfilename(char *filename,UFD *filepointer)//返回指向特定文件名的指针,返回值或为*/{UFD *k;k=filepointer;while(k&&strcmp(filename,k->filename))k=k->nextfile;return k;}/*-------------------查找文件夹-------------------------*/UDD * findfoldername(char *foldername,UDD *folderpointer)//返回指向特定文件名的指针,返回值或为*/{UDD *k;k=folderpointer;while(k&&strcmp(foldername,k->foldername))k=k->link;return k;}/*-------------------建立文件-------------------------*/void createfile(){char cx;char username[10];char filename[10];int i,j;UFD *p1,*p2,*newfile;system("cls");/*清屏*/printf("\t* * * * * * * * * * * * * * * *\n");printf("\t\t创建文件\n");printf("\t* * * * * * * * * * * * * * * *\n");printf("输入用户名:\n");scanf("%s",username);i=findusername(username);/*返回用户名下标*/if(i==num)/*如果该用户不存在,且用户个数不小于10,先创建用户再建立用户文件*/{printf("用户不存在,是否建立用户?(y/n)");cscanf("%c",&cx);printf("\n");if(cx=='y'){scanf("%s",username);strcpy(filesystem[num].username ,username);/*创建用户目录*/num++;{/*为刚创建的用户建立文件*/newfile =(UFD *)malloc(sizeof(UFD));newfile->nextfile=NULL;filesystem[num-1].link=newfile;printf("文件名:");scanf("%s",filesystem[num-1].link->filename);printf("属性(100只读,110读写,001可执行):");scanf("%s",filesystem[num-1].link->procode);printf("文件已创建!\n");}}else{return;}}else/*为已存在的用户建立文件*/{p1=p2=filesystem[i].link ;printf("输入文件名:");scanf("%s",filename);if(!p1){newfile=(UFD *)malloc(sizeof(UFD));newfile->nextfile=NULL;strcpy(newfile->filename,filename);printf("属性(100只读,110读写,001可执行):");scanf("%s",newfile->procode);filesystem[i].link=newfile;}else{while(p2){if (!strcmp(p2->filename,filename)){printf("文件名已存在,请输入新文件名!\n");scanf("%s",filename);}p1=p2;p2=p2->nextfile;}newfile=(UFD *)malloc(sizeof(UFD));newfile->nextfile=NULL;strcpy(newfile->filename,filename);printf("属性(100只读,110读写,001可执行):");scanf("%s",newfile->procode);p1->nextfile=newfile;}printf("文件已创建!\n");}printf("是否输入文件内容?(y/n)");cscanf("%c",&cx);printf("\n");if(cx=='y'){printf("请输入文件内容,用#键结束\n");cscanf("%c",&newfile->filecon[0]);}for(j=0;newfile->filecon[j]!='#';j++){cscanf("%c",&newfile->filecon[j+1]);}printf("\n");}//displayallfile();/*-------------------创建文件夹-------------------------*/void createfolder(){char cx;char username[10];char foldername[10];int i;UDD *p1,*p2,*newfolder;system("cls");/*清屏*/printf("\t* * * * * * * * * * * * * * * *\n");printf("\t\t创建文件夹\n");printf("\t* * * * * * * * * * * * * * * *\n");printf("输入用户名:\n");scanf("%s",username);i=findusername(username);/*返回用户名下标*/if(i==num)/*如果该用户不存在,且用户个数不小于10,先创建用户再建立用户文件夹*/{printf("用户不存在,是否建立用户?(y/n)");cscanf("%c",&cx);printf("\n");if(cx=='y'){strcpy(filesystem[num].username ,username);/*创建用户目录*/num++;{/*为刚创建的用户建立文件夹*/newfolder =(UDD *)malloc(sizeof(UDD));newfolder->cnext=NULL;newfolder->clink=NULL;newfolder->link=NULL;filesystem[num-1].clink=newfolder;printf("文件夹名:");scanf("%s",filesystem[num-1].clink->foldername);printf("文件夹已创建!\n");}}else{return;}}else/*为已存在的用户建立文件夹*/{p1=p2=filesystem[i].clink ;printf("输入文件夹名:");scanf("%s",foldername);if(!p1){newfolder=(UDD *)malloc(sizeof(UDD));newfolder->cnext=NULL;newfolder->clink=NULL;newfolder->link=NULL;strcpy(newfolder->foldername,foldername);filesystem[i].clink=newfolder;}else{while(p2){if (!strcmp(p2->foldername,foldername)){printf("文件夹名已存在,请输入新文件夹名!\n");scanf("%s",foldername);}p1=p2;p2=p2->link;}newfolder=(UDD *)malloc(sizeof(UDD));newfolder->cnext=NULL;newfolder->clink=NULL;newfolder->link=NULL;strcpy(newfolder->foldername,foldername);p1->link=newfolder;}printf("文件夹已创建!\n");}}/*-------------------删除文件-------------------------*/void deletefile(){int i;char cy;char username[10];char filename[10];UFD *p1,*p2;system("cls");/*清屏*/printf("\t* * * * * * * * * * * * * * * *\n");printf("\t\t删除文件\n");printf("\t* * * * * * * * * * * * * * * *\n");printf("\n输入用户名:\n");scanf("%s",username);i=findusername(username);/*返回用户名下标*/if(i>=num){printf("用户不存在!\n删除失败!");return ;}else{printf("\n输入文件名:");scanf("%s",filename);p1=p2=filesystem[i].link;while(p2&&strcmp(p2->filename,filename)){p1=p2;p2=p2->nextfile;}if(!p2)printf("\n文件不存在!\n删除失败!\n");else{printf("是否删除文件%s?(y/n)",p2->filename);cscanf("%c",&cy);if(cy=='y'){if(p1==p2) //用户只存在这一个文件filesystem[i].link=p1->nextfile;elsep1->nextfile=p2->nextfile;free(p2);printf("\n文件已删除!\n");}elsereturn;}}}/*-------------------删除文件夹-------------------------*/void deletefolder(){int i;char cy;char username[10];char foldername[10];UDD *p1,*p2;system("cls");/*清屏*/printf("\t* * * * * * * * * * * * * * * *\n");printf("\t\t删除文件夹\n");printf("\t* * * * * * * * * * * * * * * *\n");printf("\n输入用户名:\n");scanf("%s",username);i=findusername(username);/*返回用户名下标*/if(i>=num){printf("用户不存在!\n删除失败!");return ;}else{printf("\n输入文件夹名:");scanf("%s",foldername);p1=p2=filesystem[i].clink;while(p2&&strcmp(p2->foldername,foldername)){p1=p2;p2=p2->link;}if(!p2)printf("\n文件夹不存在!\n删除失败!\n");else{printf("是否删除文件夹%s及文件夹%s下所有东西?(y/n)",p2->foldername,p2->foldername);cscanf("%c",&cy);if(cy=='y'){if(p1==p2)filesystem[i].clink=p1->link;elsep1->link=p2->link;free(p2);printf("\n文件夹已删除!\n");}elsereturn;}}}/*-------------------打开文件-------------------------*/ AFD * openfile(){char username[10];char filename[10];int i;UFD *p=NULL;/*AFD *k=NULL;//为打开的文件设置了运行文件目录*/ system("cls");/*清屏*/printf("输入用户名:");scanf("%s",username);i=findusername(username);/*返回用户名下标*/if(i>=num){printf("\n用户不存在!\n不能打开文件!\n");return NULL;}else/*用户存在*/{printf("输入文件名:");scanf("%s",filename);p=findfilename(filename,filesystem[i].link);if(!p)/*用户文件不存在*/{printf("\n文件不存在!\n");return NULL;}else{/*找到用户文件*/afd=(AFD *)malloc(sizeof(AFD));strcpy(afd->filename,p->filename);strcpy(afd->procode,p->procode);strcpy(afd->filecon,p->filecon);printf("\n文件已打开!\n");rw_pointer=p;/*为了读文件保留指针*//*打开运行文件目录AFD*/printf("\t文件目录:\n");printf("\t文件名 : %s\n",afd->filename);printf("\t属性 : %s\n",afd->procode);}}return afd;}/*-------------------关闭文件------------------------*/void closefile(){if(!afd){printf("\n没有文件打开!\n");return;}free(afd);afd=NULL;printf("\n文件已关闭!\n");}/*-------------------读文件-------------------------*/void readfile(){int j;AFD *p;p=openfile();if(!p)return;if(strcmp(p->procode,"100")&&strcmp(p->procode,"110"))/*文件属性为非读或非读写类型即不能作读*/printf("\nfile:%s 文件不可读!\n",p->filename);/*操作*/ else{printf("已读取文件!\n");printf("\t文件名:%s\n",p->filename);printf("\t属性:%s\n",p->procode);printf("文件内容为:\n");for(j=0;j<100,p->filecon[j]!='#';j++){printf("%c",p->filecon[j]);}}closefile();/*关闭文件*/}/*-------------------写文件-------------------------*/void writefile(){int j;AFD *p;/*运行文件目录*/UFD *k;p=openfile();k=rw_pointer;if(!p)return;if(strcmp(p->procode,"110")){printf("\nfile:%s 该文件不能写!\n",p->filename);return;}else{printf("请修改文件内容:\n");for(j=0;j<100,k->filecon[j]!='#';j++){printf("%c",k->filecon[j]);}cscanf("%c",&k->filecon[j]);for(;k->filecon[j]!='#';j++){cscanf("%c",&k->filecon[j+1]);}}printf("\n已完成写操作!\n");printf("\t文件名 : %s\n",k->filename);printf("\t属性 : %s\n",k->procode);closefile();}/*-------------------执行文件-------------------------*/void executefile(){AFD *p;p=openfile();if(!p){printf("\n文件不存在!\n");return;}if(strcmp(p->procode,"001")){printf("\n该文件不能执行!\n");printf("\n文件属性为不可执行文件!\n");return;}else{closefile();printf("\n文件执行完毕!");}}/*-------------------初始化界面-------------------------*/void menu(){system("cls");/*清屏*/printf("\t\t\t* * * * * * * * * * * * * * * *\n");printf("\t\t\t\t文件管理系统\n");printf("\t\t\t* * * * * * * * * * * * * * * *\n\n");printf("\t\t\t1----------创建用户\n");printf("\t\t\t2----------删除用户\n");printf("\t\t\t3----------创建文件\n");printf("\t\t\t4----------删除文件\n");printf("\t\t\t5----------创建文件夹\n");printf("\t\t\t6----------删除文件夹\n");printf("\t\t\t7----------读文件\n");printf("\t\t\t8----------写文件\n");printf("\t\t\t9----------执行文件\n");printf("\t\t\t10---------打开文件\n");printf("\t\t\t11---------关闭文件\n");printf("\t\t\t12---------显示目录\n");printf("\t\t\t13---------退出\n");printf("\t\t\t请输入你的选择 : ");scanf("%d",&choice); //choice 全局变量 /*选择相应的序号,执行相应的操作*/switch(choice){case 1:createuser();break;case 2:deleteuser();break;case 3:createfile();break;case 4:deletefile();break;case 5:createfolder();break;case 6:deletefolder();break;case 7:readfile();break;case 8:writefile();break;case 9:executefile();break;case 10:openfile();break;case 11:closefile();break;case 12:displayallfile();break;case 13:default:ex=0;break;}}/*-------------------主函数-------------------------*/ void main(){int i;char ch;ex=1; //全局变量num=0; //全局变量for(i=0;i<10;i++){filesystem[i].link=NULL;filesystem[i].clink=NULL;}while(ex){menu();printf("按任意键继续......\n");cscanf("%c",&ch); //cscanf从控制台执行格式化输入}}八.运行结果及分析九.心得体会为期一周的课程设计即将告一段落,这次课程设计中,我收获了很多。