当前位置:文档之家› 操作系统原理课程设计文件管理系统方案

操作系统原理课程设计文件管理系统方案

操作系统原理课程设计文件管理系统院系:计算机学院三系班级:计软05–1班姓名:韩宇学号:35号指导教师:益民2007年7 月4 日操作系统原理课程设计任务书一、题目:文件系统管理二、设计要求(1)由鲁建成,韩宇,肖鹏完成设计与实现。

(2)查阅相关资料,自学具体课题中涉及到的新知识。

(3)采用结构化、模块化程序设计方法,功能要完善,具有一定的创新。

(4)所设计的程序应有输入、输出。

一. (5)按要求写出课程设计报告,并于设计结束后1周提交。

其主要容包括:封皮、课程设计任务书,指导教师评语与成绩、目录、概述、需求分析、概要设计、详细设计、软件的调试、总结、启谢、附录:带中文注释的程序清单、参考文献。

报告一律用 A4 纸打印,中文字体为宋体,西文字体用Time New Roma,一律用小四号字,行距采用“固定值” 18 磅,首行缩进 2 字符。

总体设计应配合软件总体模块结构图来说明软件应具有的功能。

详细设计应用传统或 N-S 流程图和屏幕抓图说明,调试的叙述应配合出错场景的抓图来说明出现了哪些错误,如何解决的。

三、课程设计工作量由于是设计小组团结协作完成设计任务,一般每人的程序量在200 行有效程序行左右,不得抄袭。

四、课程设计工作计划2007 年 6 月 18 日,指导教师讲课,学生根据题目准备资料;2007 年 6 月 19 日,进行总体方案设计;2007 年 6 月 20 日~ 2007 年 6 月 25 日,完成程序模块并通过独立编译;2007 年 6 月 26 日~ 2007 年 6 月 27 日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行;2007 年 6 月 27 日~ 2007 年 6 月 29 日,验收、撰写报告;2007 年 6 月 29 日下午,验收或总结。

指导教师签章:教研室主任签章操作系统原理课程设计指导教师评语与成绩指导教师评语:课程设计表现成绩:课程设计验收成绩:课程设计报告成绩:课程设计总成绩:指导教师签章2007年7月10日目录一概述------------------------------------------------------------5二需求分析------------------------------------------------------71)问题获取2)分析三概要设计------------------------------------------------------8四详细设计------------------------------------------------------91)具体功能概述2)程序流程图3)程序代码五程序的调试与运行结果说明------------------------------32六用户使用说明------------------------------------------------351)引言2)功能介绍七启谢-------------------------------------------------------------36八参考资料-------------------------------------------------------36一概述1.课程设计的目的1.理解重要数据结构的意义2.掌握文件系统的工作原理3.通过本次课程设计加深文件系统部功能及部实现的理解2.课程设计的要求1.需要的基本知识:文件:一组带标志的在逻辑上有完整意义的信息项的序列,这个标识为文件名。

文件系统:操作系统中统一管理信息资源的一种软件,管理文件的存储、检索、更新。

提供安全可靠的共享和保护手段,并且方便用户使用。

2.技能:具有用 C 语言编程的能力,懂得文件系统调用处理的算法及一些操作系统文件系统的实现的基本思想。

3.尚未掌握的知识点:高速缓存管理和磁盘管理算法4.参阅操作系统原理书籍中文件管理的相关知识。

5.老师提出的要求:在理解文件系统的层次结构,掌握高速缓存管理和磁盘管理的基本思想和算法的基础上,掌握文件系统的系统调用处理算法和运用,分析流行操作系统文件系统的实现的基本思想,尝试设计简单的文件系统3.课程设计的主要设计思想在任一 OS下,建立一个大文件,把它假想成一盘,在其中实现一个简单的模拟 UNIX(LINUX)文件系统。

本次文件系统具有以下的功能:1、初始化2、建立文件(需给出文件名,文件长度)3、建立子目录4、打开文件(显示文件所占的盘块)5、删除文件6、删除目录7、显示目录(即显示目录下的信息,包括文件、子目录等)8、显示整个系统信息【关键词】文件管理目录管理操作系统 C 语言二需求分析1)问题获取我们以学生为调查对象。

模拟询问了若干问题,这些问题的提出和解决有助项目的开发和方向定位。

问题如下:1)有关用户操作方面的相关问题#是否需要使用者的登录登出操作?#允许用户执行哪些操作?#各项操作的提示操作是设置在软件界面上还是在菜单里?#允许用户对文件的操作有哪些?2)有关技术支持方面的相关问题# 用户使用的是那种操作系统?(WindowsXP / Linux/苹果?)#是否使用数据库的相关技术?#是否向用户提供相关的技术文档?2)分析经过相关的问题获取,我们分析了本项目的相关需求。

本项目的名称:简易文件系统本系统的使用人员:所有使用计算机的人员本项目的开发工具:WinTc数据库设计:无界面设计:命令行提示方式的程序在用户操作方面,运行本系统前不需要用户的登录操作,运行后可以直接进入操作界面,用户可以直观的使用本程序。

用户可以对文件做以下的操作:文件的建立,删除,查找,文件目录的相关管理,各项操作应可以直接操作,不会有任何的限制。

用户大多使用的是 WindowsXP操作系统,而且很多的用户安装了 WinTc 软件,这样我们以WinTc 编写的程序用户可以直接使用三概要设计本程序的功能模块图如图所示:简易的文件系统创创查查删删建建看看除除在此文件模拟系统上可以实现以下操作:#创建目录: md + 空格 + 目录名,在指定路径下创建指定的目录,如果没有指定路径,则在当前目录下创建指定目录。

对于重名的目录给与错误提示。

# 创建文件: vi +空格 +文件名 + 文件长度,创建一个指定名字的新文件,即在目录中增加一项,对于重名的文件给与错误提示。

# 删除目录: del +空格 +目录名,删除指定的目录及此目录下的文件和子目录。

# 删除文件: del +空格 +文件名,删除指定的文件。

#查看目录: cd + 空格 + 目录名,显示指定目录下的全部文件和一级子目录,如果没有指定目录名,则显示当前目录下的相应容。

# 查看文件: cat +空格+文件名,显示指定的文件,如没有此文件,则显示错误提示。

# 键入 quit退出文件系统。

四详细设计1)具体功能概述初始化,查看当前目录文件列表,查看文件,查看系统信息,创建目录、文件,删除目录、文件,进入当前目录的指定目录,返回上一级目录,显示帮助命令和退出文件模拟 12 项功能。

2)程序流程图4.2.1 Format()1.超级块初始化图 3.2.1.12.信息初始化i<50super_block.free[i]=i;super_block.stack[i]=50+i;图 3.2.1.2i<640j<1003.存储空间初始化i_node[i].file_address[j]=-1i_node[i].file_length=-1;i_node[i].file_style=-1;图 3.2.1.34.将空闲块的信息用成组的方法写进每组的最后一个块中图 3.2.1.4i<204494.2.2Callback(int length)(i+1)%50==0是否k=i+1;j<50是k<20450否memory[i].free[j]=k;memory[i].memory[i].n++; free[j]=-1k++;memory[i].a=0;continue;j<50memory[i].free[j]=-1;memory[i].n=0;图 3.2.2I=length-1;i>=0k=physic[i];m=49-super_block.n;是super_block.n==50否j<50memory[k].free[j]=super_block.free[j];super_block.n=0;memory[k].n=50;4.2.3 Allot(int length)memory[k].a=0;是m==-1否m=49;super_block.free[m]=physic[i];super_block.n++;图 3.2.3i<lengthk=50-super_block.n;m=super_block.free[k];p=super_block.free[49];是m==-1||memory[p].a==1否printf(" 内存不足 , 不能够分配空间 \n");callback(length);super_block.n==1是否emory[m].a=1;physic[i]=m;super_block.n=0;4.2.4create_file(char filename[],int length)j<memory[m].nsuper_block.free[j]=memory[m].free[j];super_block.n++;continue;physic[i]=m;memory[m].a=1;uper_block.n--图图 i<6403.2.strcmp(filename,root[i].是 file_name)==0 否 printf(" 文件已经存在,不允许建立重名的文件 ")i<640是root[i].i_num==-1否strcpy(root[i].file_name,filename);strcpy(root[i].dir_name,cur_dir);i_node[i].filestyle=style;i_node[i].file_length=length;allot(length);j<lengthi_node[i].file_address[j]=physic[j];break;4.2.5del_file(char filename[])图 3.2.5I<640是strcmp(filename,root[i].file_name)==0否4.2.6del_dir(char filename[])k=root[i].i_num;j<i_node[k].file_length printf(" 不存在这个文件 \n");physic[j]=i_node[k].file_address[j];callback(i_node[k].file_length);j<100i_node[k].file_address[j]=-1;strcpy(root[i].file_name,"");root[i].i_num=-1;strcpy(root[i].dir_name,"");I_node[k].file_length=-1;i_node[k].file_style=-1;图 3.2.6i<640k=root[i].i_num;strcmp(root[i].file_name,filename)==0&& strcmp(cur_dir,filename)!=0 && (i_node[k].file_style)==0j<6404.2.7void display_curdir()strcmp(filename,root[j].是 dir_name)==0 否 printf(" 这个不是目录文printf(" 目录 del_file(file件或者不存在这个目录不为空不能name);或者你要删除的是直接删除 ")当前目录\n");图 3.2.7I<6403.2.8display_dir(charstrcmp(curfilename[])dir,root[i].dir_name)==0是否k=root[i].i_num;printf("\t\t %s\t",root[i].file_name); printf("\t%d\t",i_node[k].file_style);printf("%d\t",i_node[k].file_length);printf("%s\n",root[i].dir_name);是图 3.2.8I<640否k=root[i].i_num;strcmp(filename,root[i].file_name)==0)printf(" 没有这个目录 \n");&& (i_node[k].file_style==0)是否strcpy(cur_dir,filename);4.2.9void open_file(char filename[]是i<640图 3.2.93)程序代码:k=root[i].i_num;/* HELLO.C -- Hello, world */strcmp(filename,root[i].file_name)==0&& (i_node[k].file_style==1)#include "stdio.h"否printf(" 没有这个文件是#include <stdlib.h>或者这个文件不是正规文件#include <conio.h>printf("\t\t %s\t",root[i].file_name);printf("\t%d\t",i_node[k].file_style);#include <string.h>printf("%d\t",i_node[k].file_length);printf("%s\n",root[i].dir_name);int physic[300];/*文件地址缓冲区 */printf("\t\t文件占用的物理地址 \n");int style=1; /*文件的类型 */j<i_node[k].file_lengthchar cur_dir[10]="c";/*当前目录*/printf("%d",i_node[k].file_address[j]);struct command{char [10];}cmd[12];struct block{int n;/*空闲的盘快的个数*/int free[50]; /*存放空闲盘快的地址*/int a;/*模拟盘快是否被占用*/}memory[200];struct block_super{int n;/*空闲的盘快的个数*/int free[50]; /*存放进入栈中的空闲块*/int stack[50]; /*存放下一组空闲盘快的地址*/}super_block;struct node/* i结点信息*/{否\n");int file_style; /* i结点文件类型*/int file_length; /* i结点文件长度*/int file_address[100]; /* i结点文件的物理地址*/ } i_node[64];struct dir/*目录项信息*/{char file_name[10]; /*文件名*/int i_num; /*文件的结点号*/char dir_name[10]; /*文件所在的目录*/} c[64];void format() /*格式化*/{int i,j,k;super_block.n=50;for(i=0;i<50;i++) /*超级块初始化*/{super_block.free[i]=i; /*存放进入栈中的空闲块*/ super_block.stack[i]=50+i; /*存放下一组的盘块*/ }for(i=0;i<64;i++) /* i结点信息初始化*/{for(j=0;j<100;j++){i_node[i].file_address[j]=-1;/*文件地址*/}i_node[i].file_length=-1; /*文件长度*/i_node[i].file_style=-1; /*文件类型*/}for(i=0;i<64;i++) /*根目录区信息初始化*/{strcpy(c[i].file_name,"");c[i].i_num=-1;strcpy(c[i].dir_name,"");for(i=0;i<200;i++) /*存储空间初始化*/{memory[i].n=0;/*必须有这个*/memory[i].a=0;for(j=0;j<50;j++){memory[i].free[j]=-1;}}for(i=0;i<200;i++) /*将空闲块的信息用成组的方法写进每组的最后一个块中 */{/*存储空间初始化*/if((i+1)%50==0){k=i+1;for(j=0;j<50;j++){if(k<200){memory[i].free[j]=k;/*下一组空闲地址*/memory[i].n++; /*下一组空闲个数注意在memory[i].n++之前要给其赋初值 */k++;}else{memory[i].free[j]=-1;}}memory[i].a=0; /*标记为没有使用*/continue; /*处理完用于存储下一组盘块信息的特殊盘块后,跳过本次循环 */}for(j=0;j<50;j++){memory[i].free[j]=-1;memory[i].n=0;}printf("已经初始化完毕 \n");printf("欢迎进入 UNIX文件模拟系统!!!\n\n");}void write_file(FILE *fp) /*将信息读入系统文件中*/ {int i;fp=fopen("system","wb");for(i=0;i<200;i++){fwrite(&memory[i],sizeof(struct block),1,fp);}fwrite(&super_block,sizeof(struct block_super),1,fp);for(i=0;i<64;i++){fwrite(&i_node[i],sizeof(struct node),1,fp);}for(i=0;i<64;i++){fwrite(&c[i],sizeof(struct dir),1,fp);}fclose(fp);}void read_file(FILE *fp) /*读出系统文件的信息*/{int i;fp=fopen("system","rb");for(i=0;i<200;i++){fread(&memory[i],sizeof(struct block),1,fp);}fread(&super_block,sizeof(struct block_super),1,fp);for(i=0;i<64;i++){fread(&i_node[i],sizeof(struct node),1,fp);}for(i=0;i<64;i++){fread(&c[i],sizeof(struct dir),1,fp);}fclose(fp);}void callback(int length) /*回收磁盘空间*/{int i,j,k,m,q=0;for(i=length-1;i>=0;i--){k=physic[i]; /*需要提供要回收的文件的地址*/m=49-super_block.n; /*回收到栈中的哪个位置*/if(super_block.n==50) /*注意当super_block.n==50时m=-1;的值*/{/* super_block.n==50的时候栈满了,要将这个栈中的所有地址信息写进下一个地址中*/for(j=0;j<50;j++){memory[k].free[j]=super_block.free[j];}super_block.n=0;memory[k].n=50;}memory[k].a=0;if(m==-1){m=49;/*将下一个文件地址中的盘块号回收到栈底中,这个地址中存放着刚才满栈的地址的信息*/super_block.free[m]=physic[i]; /*将下一个文件地址中的盘块号回收到栈中 */super_block.n++;}}void allot(int length) /*分配空间*/{int i,j,k,m,p;for(i=0;i<length;i++){k=50-super_block.n; /*超级块中表示空闲块的指针*/m=super_block.free[k]; /*栈中的相应盘块的地址*/p=super_block.free[49]; /*栈中的最后一个盘块指向的地址*/if(m==-1||memory[p].a==1) /*检测是否还有下一组盘块*/{printf("存不足 , 不能够分配空间 \n");callback(length);break;}if(super_block.n==1){memory[m].a=1; /*将最后一个盘块分配掉*/physic[i]=m;super_block.n=0;for(j=0;j<memory[m].n;j++) /*从最后一个盘块中取出下一组盘块号写入栈中 */{super_block.free[j]=memory[m].free[j];super_block.n++;}continue; /*要跳过这次循环,下面的语句在IF 中已经执行过 */ }physic[i]=m; /*栈中的相应盘块的地址写进文件地址缓冲区*/ memory[m].a=1;super_block.n--;}void create_file(char filename[],int length) /*创建文件*/{int i,j;for(i=0;i<64;i++){if(strcmp(filename,c[i].file_name)==0){printf("文件已经存在,不允许建立重名的文件\n");return;}}for(i=0;i<64;i++){if(c[i].i_num==-1){c[i].i_num=i;strcpy(c[i].file_name,filename);strcpy(c[i].dir_name,cur_dir); /*把当前目录名给新建立的文件*/i_node[i].file_style=style;i_node[i].file_length=length;allot(length);for(j=0;j<length;j++){i_node[i].file_address[j]=physic[j];}break;}}}void create_dir(char filename[]) /*创建目录*/{style=0;/* 0代表文件类型是目录文件*/create_file(filename,4);style=1;/*用完恢复初值,因为全局变量,否则*/void del_file(char filename[]) /*删除文件*/{int i,j,k;for(i=0;i<64;i++){if(strcmp(filename,c[i].file_name)==0){k=c[i].i_num;for(j=0;j<i_node[k].file_length;j++){physic[j]=i_node[k].file_address[j];}callback(i_node[k].file_length); /*调用回收函数*/for(j=0;j<100;j++) /*删除文件后要将文件属性和目录项的各个值恢复初值 */{i_node[k].file_address[j]=-1; /*地址恢复初值*/}strcpy(c[i].file_name,""); /*文件名恢复初值*/c[i].i_num=-1; /*目录项的I结点信息恢复初值*/strcpy(c[i].dir_name,""); /*目录项的文件目录信息恢复初值*/i_node[k].file_length=-1; /*文件长度恢复*/i_node[k].file_style=-1; /*文件类型恢复初值*/break;}}if(i==64){printf("不存在这个文件 \n");}}void del_dir(char filename[]) /*删除目录需要判断目录下时候为空 , 不为空就不删除*/int i,j,k;for(i=0;i<64;i++)/*还要加条件判断要删除的目录是不是当前目录*/{k=c[i].i_num;/*找到目录名字*/if(strcmp(c[i].file_name,filename)==0&& strcmp(cur_dir,filename)!=0 && (i_node[k].file_style)==0 ){for(j=0;j<64;j++){if(strcmp(filename,c[j].dir_name)==0){printf("目录不为空不能直接删除\n");break;}}if(j==64){del_file(filename);break;}break;}}if(i==64){printf("这个不是目录文件或者不存在这个目录,或者你要删除的是当前目录 \n");}}void display_curdir()/*显示当前目录下的文件列表*/{int i,k;printf("\t\t文件名字文件类型文件长度所属目录\n");for(i=0;i<64;i++){if(strcmp(cur_dir,c[i].dir_name)==0) /*查询文件中所在目录信息和当前目录信息相同的数据*/{k=c[i].i_num;printf("\t\t %s\t",c[i].file_name); /*文件名*/printf("\t%d\t",i_node[k].file_style); /*文件的类型*/printf("%d\t",i_node[k].file_length); /*文件的长度*/printf("%s\n",c[i].dir_name); /*文件所在的目录*/}}}void display_dir(char filename[]) /*进入指定的目录*/{int i,k;for(i=0;i<64;i++){k=c[i].i_num;/*判断文件类型是不是目录类型*/if((strcmp(filename,c[i].file_name)==0)&& (i_node[k].file_style==0)){strcpy(cur_dir,filename); /*将要进入的指定目录设置为当前目录赋值不要反了 strcpy(目的,源) */break;}}if(i==64){printf("没有这个目录 \n");}}void open_file(char filename[])/*打开文件*/{int i,j,k;printf("\t\t文件名字文件类型文件长度所属目录\n");for(i=0;i<64;i++){k=c[i].i_num;if(strcmp(filename,c[i].file_name)==0&& (i_node[k].file_style==1)){printf("\t\t %s\t",c[i].file_name); /*文件名*/printf("\t%d\t",i_node[k].file_style); /*文件的类型*/printf("%d\t",i_node[k].file_length); /*文件的长度*/printf("%s\n",c[i].dir_name); /*文件所在的目录*/printf("\t\t文件占用的物理地址 \n");for(j=0;j<i_node[k].file_length;j++) /*显示物理地址*/{printf("%d ",i_node[k].file_address[j]); /*文件具体占用的盘块号 */}printf("\n");break;}}if(i==64){printf("没有这个文件或者这个文件不是正规文件\n");}}void back_dir()/*返回上一级目录*/{int i,k;for(i=0;i<64;i++)/*查询和当前目录名相同的目录文件名*/{k=c[i].i_num;if(strcmp(cur_dir,c[i].file_name)==0 && (i_node[k].file_style==0)){strcpy(cur_dir,c[i].dir_name); /*将查询到的目录文件名所在的目录赋值给当前目录*/}}}void display_sys()/*显示系统信息(磁盘使用情况)*/{int i,m,k=0;for(i=0;i<200;i++){if(memory[i].a==0)k++;}m=200-k;printf("空闲的盘块数是: \t");printf("%d\n",k);printf("使用的盘块数是: \t");printf("%d\n",m);}void help()/*显示帮助信息 */{printf("注意:创建的文件长度 < 300\n\n"); /*说明文件 */printf("0.初始化 **************************format\n");printf("1.查看当前目录文件列表 ************dir\n");printf("2.查看文件 ************************cat-----(cat +空格 +文件名 ) \n");printf("3.查看系统信息 ********************ls\n");printf("4.创建目录 ************************md------(md +空格 +目录名 ) \n");printf("5.创建文件 ************************vi------(vi +空格 +文件名 + 文件长度 ) \n");printf("6.删除文件 ************************del-----(del +空格 +文件名 ) \n");printf("7.删除目录 ************************deldir--(del +空格 +目录名 )\n");printf("8.进入当前目录下的指定目录 ********cd--------(cd +空格+ 目录名 )\n");printf("9. 返回上一级目录 ******************rd \n");printf("10. 显示帮助命令 *******************help \n");printf("11. 退出文件模拟 *******************quit \n"); }void main()/*主函数*/{char tmp[10],[10],tmp1[10],k;struct command tmp2[10];int i, j=0,p,len=0;FILE *fp;help();strcpy(cmd[0].,"format"); /*将各个命令存进命令表*/strcpy(cmd[1].,"dir");strcpy(cmd[2].,"cat");strcpy(cmd[3].,"ls");strcpy(cmd[4].,"md");strcpy(cmd[5].,"vi");strcpy(cmd[6].,"del");strcpy(cmd[7].,"deldir");strcpy(cmd[8].,"cd");strcpy(cmd[9].,"rd");strcpy(cmd[10].,"help");strcpy(cmd[11].,"quit");if((fp=fopen("system","rb"))==NULL) /*判断系统文件是否存在*/{printf("can not open file\n");printf("format the disk Y / N \n");scanf("%c",&k);if(k=='y')format();}else{read_file(fp);/*读取系统文件的容*/}while(1){j=0;/*必须重新给恢复0 否则出错 */strcpy(tmp,cur_dir);while(strcmp(tmp,"c")!=0){for(i=0;i<64;i++){p=c[i].i_num;if(strcmp(tmp,c[i].file_name)==0 && (i_node[p].file_style==0)){strcpy(tmp2[j].,tmp);j++;strcpy(tmp,c[i].dir_name);}}}strcpy(tmp2[j].,tmp);for(i=j;i>=0;i--){printf("%s/",tmp2[i].);}scanf("%s",);/*输入命令并且查找命令的相关操作*/for(i=0;i<12;i++){if(strcmp(,cmd[i].)==0){p=i;break;}}if(i==12)/*如果没有这个语句以后输入的命令都和第一次输入的效果一样 */{p=13; /*随便的一个值*/}switch(p){case 0: format();/*初始化*/break;case 1: display_curdir(); /*查看当前目录下的文件列表*/ break;case 2: scanf("%s",tmp); /*查看文件*/open_file(tmp);break;case 3: display_sys();/*查看系统信息*/break;case 4:scanf("%s",tmp);/*创建目录*/create_dir(tmp);break;case 5: scanf("%s",tmp); /*创建文件*/scanf("%d",&len);create_file(tmp,len);break;case 6: scanf("%s",tmp); /*删除文件*/for(i=0;i<64;i++) /*判断文件是不是正规文件*/{j=c[i].i_num;if(strcmp(tmp,c[i].file_name)==0 && (i_node[j].file_style)==1){del_file(tmp);break;}}if(i==64){printf("这个不是正规文件文件 \n");}break;case 7:scanf("%s",tmp); /*删除目录*/del_dir(tmp);break;case 8: scanf("%s",tmp1); /*进入当前目录下的指定目录相当于进入目录cd +目录名*/display_dir(tmp1);break;case 9: back_dir();/*返回上一级目录*/break;case 10:help();break;case 11:write_file(fp);/*将磁盘利用信息写进系统文件,退出*/ return;default:printf("SORRY,没有这个命令 \n");break;}}}五程序的调试与运行结果说明经过调试,程序运行一切正常。

相关主题