当前位置:文档之家› 二级目录文件

二级目录文件

青岛理工大学操作系统课程设计报告院(系):计算机工程学院专业:计算机科学与技术班级:_计算122学生姓名:马鹏__学号: 201207059欧阳涛__201207060题目:___模拟二级文件管理系统__起迄日期:_ 2015.07.13-2015.07.24___设计地点:现代教育中心B303、B305指导教师:熊晓芸2014—2015年度第 2 学期完成日期: 2015 年 7 月 24 日一、课程设计目的通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。

进行操作系统课程设计主要是在学习操作系统课程的基础上,在完成操作系统各部分实验的基础上,对操作系统的整体进行一个模拟,通过实践加深对各个部分的管理功能的认识,还能进一步分析各个部分之间的联系,最后达到对完整系统的理解。

同时,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力、创新能力及团队组织、协作开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。

二、课程设计内容及小组成员分工1.设计内容:通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统1)能够实现下列命令:●Login 用户登录●Dir列文件目录●Create 创建文件●Delete 删除文件●Open 打开文件●Close 关闭文件●Read 读文件●Write 写文件●Bit 显示外部存储空间的位示图(按16*16的形式显示)2)系统能检查键入命令的正确性,出错时应能显示出错原因3)列目录时要列出文件目录、文件名和文件长度,以及系统总容量,占用容量、空闲容量(容量以字节为单位)4)不允许对打开的文件执行重复打开操作或执行删除操作5)外部存储空间的大小为256个Block,每个Block的大小为512字节,盘块号从1开始编号6)文件系统对外部存储空间采用连续分配的方式控制块的大小为32字节,其中文件名字占8个字节,参照MS-DOS设计文件控制块的数据结构;FAT由文件名、起始盘块号,长度、最后一块字节数四部分组成,占12个字节,磁盘的目录最大能存放256个目录项。

目录固定放在外部存储器的1-6号盘块(12*256/512=6)。

2.员工分工:学号:201207059 做总体设计以及函数接口学号:201207060 做各个功能函数三、系统分析与设计1、系统分析本次设计的“模拟二级文件管理系统”利用的是二级目录管理方式,分别由用户文件目录UFD(User File Directory)、主文件目录MFD(Master FileDirectory)构成。

其中UFD由用户的所有文件块组成,在MFD中每个用户目录文件占用一个目录项,其中目录项中包含用户名、用户密码以及指向用户文件目录文件数组的指针。

用户文件目录项的基本信息包括基本信息、地址信息、访问控制信息、使用信息。

基本信息:文件名、文件属性(只读、只写、只执行)地址信息:文件长度(文件可容纳数据的最大量)、存放位置(在虚拟磁盘中的起始位置)使用信息:文件使用状态(打开、关闭)文件系统中文件管理的基本操作:创建文件:创建一个新文件时,系统首先要为新文件申请必要的外存空间,并在用户文件目录UFD中为文件分配一个目录项。

目录项中应记录新建文件的文件名、文件总容量、当前已经使用的容量、文件属性、文件在磁盘中的起始位置。

删除文件:当已不在需要某文件时,可将它从文件系统中删除。

在删除时,首先在UFD的文件链表中找到与该文件对应的文件结点,然后确认文件是否处于关闭状态,若以上条件都满足,则系统就可以把结点从文件链表中删除,然后回收改结点对应的磁盘空间。

打开文件:只有处于打开状态的文件才能被读取、写入、重复关闭且不能被删除。

关闭文件:只有处于关闭状态的文件才能被删除,且不能被重复关闭。

列文件目录:普通用户只能获取自己建立的文件或其他用户共享的文件的列表;超级用户(管理员)可以查看所用户建立的文件列表。

写文件:用户可以把相关数据写入到用户自定义的文件中(磁盘上);待写文件必须处于打开状态,且不能是其他用户共享的文件。

读文件:用户可以把文件中存储的数据读取出来;待读文件必须处于打开状态;用户可以读取自己建立的文件。

文件系统中用户管理的基本操作:用户登录:用户可以以普通用户身份登录,也可以作为管理员身份登录;若登录时输入的密码有误,最大重试次数为3次,若连续错误三次,管理系统会自动退出。

2、系统设计:3、2.1 模块设计2.2 数据结构说明structBack_Disk{int s;int e;int length;}B_Disk_Sys[M],B_Disk_User[M];//定义回收磁盘空间结构体intBp_s;//存放目录指针intBp_u;//存放文件指针typedefstruct FCB{charFile_Name[8];charFile_Name_Extern[16];char Property[16];char Permission[12];char time[25];intStart_Block;intBlock_Position;intBlock_Num;}FCB;//文件控制快/*typedefstructFAT{charDir_Name[8];intStart_Block;int length;}FAT;*/typedefstruct FILES{FCB File_FCB;//文件所对应的FCBchar *Content;//文件内容charFile_Owner[8];charFolder_Name[N];intOpen_Flag;int Length;}FILES;//文件typedefstruct Folder{charFolder_Name[8];charFolder_Owner[8];charFolder_Parent[N];FCB Folder_FCB;}Folder;//文件夹即目录文件struct USERS{char name[8];charpasswd[6];int flag;}User[3];//用户typedefstruct OFDT{FILES FD_Doc;intStart_Block;intBlock_Position;intBlock_Num;}OFDT;//打开文件表2.3算法流程图(1) 程序整体结构框图框图1:程序整体框架(2) 建立文件流程框图框图2:建立文件流程图(3) 打开文件流程框图框图3:打开文件流程图(4)写文件流程框图上框图4:写文件流程框图四、系统测试与调试分析1.系统测试2、调试分析:调试过程中遇到很多棘手的问题,比如文件创建成功后怎么样让他与磁盘存储联系起来,怎么样分配磁盘使得存储器能够很好的被利用等等问题,就说说以上俩比较典型的问题我是怎么处理的吧,在创建文件后我是采用目录一级文件与普通文件分开存储,高存储区存储目录文件,低存储区寸普通文件,在磁盘分配有回收问题上我采用每次在分配磁盘之前先将空闲区域有大到小排成队列每次分配从第一块区域开始(如果分配的文件大小小于第一块存储区快的大小时)这样分配磁盘完后减少了产生碎片的可能性并且使得剩余空闲区域不至于太小。

四、用户手册使用平台:windows xp以上,linux(内核2.4以上)用法:同linux文件系统(ubuntu界面)1.登录界面:2.cd命令和dir命令Create命令查看内存Help命令Open,read,write,close命令Delete命令等等,其他命令都可以通过帮助查看,在这里就不一一演示了六、程序清单头文件:1.file.h#define CMD_MAX20//定义最大命令数#define FOLD_MAX 128//定义最大目录数#define FILE_MAX512 //定义最大文件数#define N 8*4//定义命令提示符大小#define FD_MAX 1000//定义文件描述符大小#define M 1000//定义回收磁盘空间个数int DISK[256][512];//磁盘数组int map[16][16];//位氏图数组//intDisk_Count_Dir;//intDisk_Count_Doc;//intx_Dir;//intx_Doc;//inty_Dir;//inty_Doc;int Flag;//0:表示为目录,1:表示为文件intDir_Count;//目录指针intDocu_Count;//文件指针intDisk_used;//已经使用的磁盘容量(字节)char CMD[CMD_M AX][10];//定义命令数组char *token[4];//命令格式数组intx_token;//指向数组二维数组*token[]的指针intp_user;//用户指针char position[N];//命令提示符structBack_Disk{int s;int e;int length;}B_Disk_Sys[M],B_ Disk_User[M];//定义回收磁盘空间结构体intBp_s;//存放目录指针intBp_u;//存放文件指针typedefstruct FCB{charFile_Name [8];charFile_Name_ Extern[16];char Property[1 6];char Permission [12];char time[25];intStart_Block;intBlock_Positio n;intBlock_Num;}FCB;//文件控制快/*typedefstructFAT{charDir_Name [8];intStart_Block;int length;}FAT;*/typedefstruct FILES {FCB File_FCB; //文件所对应的FCBchar *Content;//文件内容charFile_Owner [8];charFolder_Na me[N];intOpen_Flag;int Length;}FILES;//文件typedefstruct Folder {charFolder_Na me[8];charFolder_Ow ner[8];charFolder_Pare nt[N];FCB Folder_FC B;}Folder;//文件夹即目录文件struct USERS{char name[8];charpasswd[6];int flag;}User[3];//用户typedefstruct OFDT {FILES FD_Do c;intStart_Block;intBlock_Positio n;intBlock_Num;}OFDT;//打开文件表OFDT FD[FD_MA X];intFD_Count;//打开文件表指针Folder Dir[FOLD_ MAX];FILES Document[FI LE_MAX];2.fun.h#ifndef FUN#define FUNvoid disp();//现实界面void init();//初始化int Login();//登陆void Dir_Disp();//文件显示void Create(char *);//创建文件void Delete(char *);//删除文件void Open(char *);//打开文件void Close(char *);/ /关闭文件void Read(char *);//读文件void Write(char *);//写文件void Bit();//显示磁盘存储void Tips();//提示void Print();//输出提示void Deal_CH(char *); //处理输入的命令字符串intset_disp_mode(int ,int);//控制屏幕回显功能,当第二个int为1时打开回显当第二个int为0时关闭回显intFind_Absolute(cha r *);//绝对路径查找判断intFind_Relative(cha r *);//相对路径查找判断void To_Lower(char *);//大写字母转换为小写字母intfind_name(char *name, int *flag);//匹配文件名,当name匹配为dir是flag置1否则置-1int find(char *p, char *m);//字符串p,和m的匹配void del_ch(char *str);//将str最后一个字符置为‘\0’void Recycling_Disk_User();//回收磁盘(存放目录)void Recycling_Disk_Sys();//回收磁盘(存放文件)intApply_Disk(int *,int *, int *, int);//申请分配磁盘void Free_Disk(int ,int , int);//释放磁盘void Cha_Mod(char*str, char *ch);//修改权限#endif源程序:a)main.cint main(){disp();return 0;}b)fun.c(由于篇幅过长这里只列出部分代码)#include<stdio.h>#include<fun.h>#include<file.h>#include<string.h>#include<time.h>#include<termio s.h>#include<unistd.h>#include<errno.h>#include<stdlib.h>#define ECHOFLA GS (ECHO | ECHO E | ECHOK | ECH ONL)voiddisp(){inti,j;int k;int flag;int a;char *cmd;cmd = (ch ar *)malloc(sizeof(c har));init();while(Logi n()){flag = 0;printf ("\nsuccessful login! \n\n");Tips();getcha r();while (1){if (flag)break;P rint();memset(token,'\ 0',sizeof(token));k = -1;f or(i = 0; cmd[i] = getchar(); i++){if(cmd[i] == '\n '){cmd[i] = '\ 0';break;}}if (!strcmp(cmd,""))continue;D eal_CH(cmd);T o_Lower(token[1]);f or(j = 0; j < CMD _MAX; j++){if(!strcmp(token [1],CMD[j])){k = j; break;}}switch(k){case 0://printf("%s ",token[1]);if(x_token == 1){User[p _user].flag = 0;p_user = -1;flag = 1;}elseprintf ("%s格式输入命令有误!(help 命令可以查看命令格式)\n ",token[1]);break;case 1:if(x_token == 1 || x_token> 2){printf ("%s格式输入命令有误!(help 命令可以查看命令格式)\n ",token[1]);break;}if(!strcmp(t oken[2],"..")){if(!strc mp(position,"/"))b reak;else{f or(i = 0; i<strlen(po sition); i++)if(position[i]=='/ ')a = i;if (a == 0){for(i = a+1; i<strlen(position); i++)position[i] = '\0 ';}el sef or(i = a; i<strlen(po sition); i++)position[i] = '\0 ';}break;}if(Find_Ab solute(token[2])){strcpy (position,token[2]);}else if(Fin d_Relative(token[2])){if(!strc mp(position,"/"))s printf(position,"%s% s",position,token[2]);elsesprintf (position,"%s/%s",po sition,token[2]);}elseprintf ("路径名出错或当前路径无%s文件\n",to ken[2]);//getchar();break;case 2:if(x_token == 1 || x_token == 2)Dir_D isp();elseprintf ("%s格式输入命令有误!(help 命令可以查看命令格式)\n ",token[1]);//getchar();break;case 3:if(x_token == 3 || x_token == 2)Create (token[2]);elseprintf ("%s格式输入命令有误!(help 命令可以查看命令格式)\n ",token[1]);//getchar();break;case 4:if(x_token == 2)Delete (token[2]);elseprintf ("%s格式输入命令有误!(help 命令可以查看命令格式)\n ",token[1]);//getchar();break;case 5:if(x_token == 2)Open (token[2]);elseprintf ("%s格式输入命令有误!(help 命令可以查看命令格式)\n ",token[1]);//getchar();break;case 6:if(x_token == 2)Close (token[2]);elseprintf ("%s格式输入命令有误!(help 命令可以查看命令格式)\n ",token[1]);//getchar();break;case 7:if(x_token == 2)Read(t oken[2]);elseprintf ("%s格式输入命令有误!(help 命令可以查看命令格式)\n ",token[1]);//getchar();break;case 8:if(x_token == 2)Write (token[2]);elseprintf ("%s格式输入命令有误!(help 命令可以查看命令格式)\n ",token[1]);//getchar();break;case 9:Bit();//getchar();break;case 10:system("cle ar");//getchar();break;case 11:Tips();break;case 12:printf("\n 关机中......\n");sleep(2);exit(1);break;case 13:if(x_token == 3)Cha_ Mod(token[3],token [2]);elseprintf ("%s格式输入命令有误!(help 命令可以查看命令格式)\n",token[1]);break;default:printf("命令输入有误或无此命令,请重新输入!(help 命令可以查看命令格式)\n");}}}printf("\nLogin incorrect!\n关机中......\n");sleep(2);exit(1);}分配磁盘算法:voidRecycling_Disk_User(){inti;int j;int k;int p = 128*sizeof(Folder)/512;structBack_Disk t;for(i = 0; i< M; i++){B_Disk_User[i].length = 0;}DISK[255][511]=1;Bp_u = 0;int count = 0;for(i = p; i< 256; i++){for(j = 0; j < 512; j++){if(DISK[i][j]==0){if(count == 0){B_Disk_User[Bp_u]. s = i;B_Disk_User[Bp_u].e = j;}count++;}else{if(count == 0)continue;else{B_Disk_User[Bp_u]. length = count;Bp_u++;for(k = 1; k <Bp_u; k++){if(B_Disk_ User[k].length >B_Disk_User[k-1].length){t = B _Disk_User[k];B_Dis k_User[k] = B_Disk_User[k-1];B_Dis k_User[k-1] = t;}}count = 0;}}}}}voidRecycling_Disk_Sys(){inti;int j;int k;int p = 128*sizeof(Folder)/512 - 1;structBack_Disk t;for(i = 0; i< M; i++){B_Disk_Sys[i].length = 0;}DISK[p][511]=1;Bp_s = 0;int count = 0;for(i = 0; i<= p; i++){for(j = 0; j < 512; j++){if(DISK[i][j]==0){if(count == 0){B_Disk_Sys[Bp_s].s = i;B_Disk_Sys[Bp_s].e = j;}count++;}else{if(count == 0)continue;else{B_Disk_Sys[Bp_s].le ngth = count;Bp_s++;for(k = 1; k <Bp_s; k++){if(B_Disk_ Sys[k].length >B_Disk_Sys[k-1].length){t = B _Disk_Sys[k];B_Dis k_Sys[k] = B_Disk_Sys[k-1];B_Dis k_Sys[k-1] = t;}}count = 0;}}}}}intApply_Disk(int *a, int *b, int *c, int siz e){inti;int j = 0;int k = 0;Recycling_Disk_Sys();Recycling_Disk_User();if(Flag){if(size >B_Disk_Sys[0].length)return 0;else{*a = j = B_Disk_Sys[0].s;*b = k = B_Disk_Sys[0].e;*c = 1;for(i = 0; i< size; i++){//Disk[s][e]=0;DISK[j][k++]=1;if(k == 512){k = 0;j++;}}}}else{if(size >B_Disk_User[0].length)return 0;else{*a = j = B_Disk_User[0].s;*b = k = B_Disk_User[0].e;*c = size/512 + 1;for(i = 0; i< size; i++){//Disk[s][e]=0;DISK[j][k++]=1;if(k == 512){k = 0;j++;}}}}return 1;}voidFree_Disk(int s, int e, int length) {inti;for(i = 0; i< length; i++){//Disk[s][e]=0;DISK[s][e++]=0;if(e == 512){e = 0;s++;}}}七、参考文献汤小丹等编著,《计算机操作系统(第四版)》,西安电子科技大学出版社,2014.5年严蔚敏,吴伟明编著,《数据结构(C语言版)》,清华大学出版社,2007邱建华,李树华编著,《c语言程序设计》,东软电子出版社2011.7八、课程设计评价。

相关主题