1、摘 要设计一个小型的文件管理系统,在XP系统下,建立一个大文件,把它假想成一张盘,在其上实现小型文件管理系统。该小型文件系统有一个简单的主界面,提供五条简单的命令:dir、mkfile、type、copy、delfile,分别用于显示文件目录、建立文件、显示文件内容、复制和删除一个文件。关键字:操作系统,课程设计,文件系统目 录第一章设计内容111 设计目的112 设计要求113 程序设计思想1第二章 数据结构、算法和算法流程图221 数据结构222 程序功能图223 程序流程图3第三章 程序运行结果及分析631 程序运行结果632 程序分析7第四章 心得体会8参考文献9附录 程序清单1021
2、第一章 设计内容11 设计目的通过设计一个小型文件系统,进一步掌握文件管理的方法和技术,使学生初步具有研究、设计、编制和调试操作系统模块的能力。12 设计要求(1) 问题描述在任一OS下,建立一个大文件,把它假想成一张盘,在其中实现一个简单的小型文件系统。(2) 基本要求该文件系统没有子目录机制,文件连续分配,不考虑换“盘”和分区。做一个简单的操作界面,提供五条简单的命令:dir、mkfile、type、copy、delfile,分别用于显示文件目录、建立文件、显示文件内容、复制和删除一个文件。13 程序设计思想阅读操作系统方面的书籍,了解操作系统的文件系统原理。结合分析课程设计要求,确定实体
3、以及它们之间的关系。实体关系有三张表(磁盘空间分配表、文件表、打开文件表)、一个模拟磁盘的数组、命令服务和用户构成。用户负责输入命令。命令服务实现命令的解释、命令检查、命令帮助以及调用相关模块执行相应的命令功能。建立一个系统文件(模拟盘),并对此进行盘块的划分,第一个盘块存放文件目录,第二盘块存放盘块位示图,自第三个盘块开始存放各具体文件的内容,文件目录存放文件的名字,文件的扩展名,开始盘块号,所占用的盘块数目,文件的大小;盘块位示图用来标记盘块是否被占用。构造这些实体的关系图,数据流图、程序流程图来进行具体的设计。第二章 数据结构、算法和算法流程图21 数据结构数据结构说明:本程序所运用的主
4、要有两个数据结构,分别如下:文件目录结构: struct filename /文件目录项结构体 char name9; /文件名 char ext4; /扩展名 int i; /文件所占用磁盘块的第一个磁盘块号 int Amount; /文件所占用磁盘块的块数 long int size; /文件大小;盘块结构:struct empty /盘块结构体 int map100; /盘块位示图 int filenum; /文件数量; 22 程序功能图模拟文件系统显示内容显示目录创建文件复制文件删除文件图2.1文件系统提供的文件操作有建立文件(mkfile)、复制文件(copy)、显示文件所有内容(t
5、ype)、删除文件(delfile)。可以通过键盘输入命令来模拟文件的操作。23 程序流程图(1)主程序流程图:开始初始化盘块输入命令分析命令有无该命令?显示错误信息创建文件显示目录显示内容复制文件删除文件有无执行命令结束图2.2(2)初始化模块流程图:图2.3(3)写入磁盘流程图:图2.4(4)显示目录流程图:图2.5(5)显示文件流程图:图2.6(6)删除文件流程图:图2.7(7)复制文件流程图:图2.8(8)创建文件流程图:图2.9第三章 程序运行结果及分析31 程序运行结果(1)程序主界面图3.1(2)创建一个文件,输入“3”显示“输入文件内容,按 键保存且退出!”图3.2(3)往文件
6、里写内容:Hello World!显示文件长度,并要求给文件命名,命名后保存返回主界面图3.3(4)读取刚才写入的文件,结果正确图3.4(5)删除刚写入的文件,测试成功图3.5对于测试用例,还有很多路径都有测试过,鉴于篇幅,就不再列出所有可能的路径来进行白盒测试。32 程序分析本程序使用一个Windows下的文件来模拟一个磁盘,向磁盘中装入文件并进行相关操作。采用了以空间换时间的算法,文件的大小在系统中是固定的,虽然会浪费一些空间,但文件的存取速率会加快。第四章 心得体会通过本次的课程设计,使我能够正确运用操作系统课程中所学的基本理论和知识,加深了对文件系统基本概念的理解,以及磁盘文件系统的文
7、件操作。还有让我感受挺深的是对软件工程方法的应用。设计一个软件,先要做好需求分析,这一点很重要,如果没有分析好需求,到软件设计的最后,发现所做的功能不符合要求,那么一切都得重做,前面所有的努力都付诸东流。还有比较重要的是,画好程流程图。在程序设计的开始,由于分析工作做得不够深入和细致,吃了点小苦头。对于这样一个小设计来说,都会吃苦头,要是大工程更是无法想像,有可能会项目失败。以后得加强对软件工程的学习。另外在运用C语言的时候,感觉有点生疏,在组织语言时时而出错,在编程和调试的过程中,经常会出现意想不到的问题,并非每个问题都可以从相关资料中找到解决方法,有些问题是无法预料到的,这就需要通过自己理
8、性的分析得出问题的解决方案。 在设计过程中,查询了不少相关资料,不断的发现问题、提出问题、解决问题。在对自己所编写的源程序段的纠错的过程中,使我更好的理解了操作系统中文件系统的理论知识,同时在编程时用到了模块化的设计思想,这种编程方法可以使我们的编程变的更简单,可以使我们的查错与纠错变的更方便。总的来说通过这次的设计的学习使我学到了很多在平时的学习中学不到的很多东西,通过这次课程设计,使我对操作系统和编程产生兴趣,我想我会在这条路上继续前进下去。我相信,只要不断的严格要求自己,注意培养自己的思维能力,就一定会有更大更辉煌的发展和提高。参考文献1 张尧学编计算机操作系统教程(第三版)习题解答与实
9、验指导北京:清华大学出版社,20062 汤子瀛主编计算机操作系统(第三版)西安:西安电子科技大学出版社,2001 3 CSDN论坛附录 程序清单#include iostream.h#include string#include stdio.hextern C void exit(int);struct filename /文件目录项结构体 char name9; /文件名 char ext4; /扩展名 int i; /文件所占用磁盘块的第一个磁盘块号 int Amount; /文件所占用磁盘块的块数 long int size; /文件大小file11;int num; struct em
10、pty /盘块结构体 int map11; /盘块位示图 int filenum; /文件数量emptytable; /模块说明:void SystemInit() /模拟磁盘文件初始化函数 for(int i=2;i10;i+) /初始化存放位示图的盘块 emptytable.mapi=0; emptytable.map0=1; emptytable.map1=1; emptytable.filenum=0;FILE *fp;if(fp=fopen(filesys,wb+)=NULL) /wb+:为读写建立一个新文件;打开系统文件将文件目录盘块和 /位示图盘块写入系统文件printf(can
11、 not open file n);exit(0);fseek(fp,512L,0);fwrite(&emptytable,sizeof(struct empty),1,fp);fclose(fp);printf(!初始化系统成功!);void WriteFile() /将目录以及空闲盘块表写入磁盘 FILE *fp;if(fp=fopen(filesys,rb+)=NULL)printf(can not open file n);exit(0);rewind(fp);for(int i=0;inum;i+) fwrite(&filei,sizeof(struct filename),1,fp
12、); /文件目录 fseek(fp,512L,0);fwrite(&emptytable,sizeof(struct empty),1,fp); /位示图fclose(fp);void dir() / 显示文件目录 int i,j;FILE *fp;if(fp=fopen(filesys,rb)=NULL)printf(can not open file n);exit(0); fseek(fp,512L,0); /空闲盘块表的定位fread(&emptytable,sizeof(struct empty),1,fp);rewind(fp); /文件目录表的定位 num=emptytable.
13、filenum;for(i=0;inum;i+) fread(&filei,sizeof(struct filename),1,fp); if (num!=0) printf(系统文件目录结构:n); for(i=0,j=1;inum;i+,j+) printf(%s.%sn,filei.name,filei.ext); if(j=5) printf(n); j=1; printf(n文件数量为 %d ,num); fclose(fp);void type() /显示文件内容 FILE *fp;int i,j;if(fp=fopen(filesys,rb)=NULL)printf(can no
14、t open file n);exit(0); fseek(fp,512L,0); fread(&emptytable,sizeof(struct empty),1,fp); rewind(fp); num=emptytable.filenum; for(i=0;inum;i+) fread(&filei,sizeof(struct filename),1,fp); printf(%s.%sn,filei.name,filei.ext); / char name9,ext14; printf(请输入文件名:n); gets(name); /scanf(%s,name);/getchar();
15、printf(请输入扩展名:); gets(ext1); /scanf(%s,ext1);getchar(); if(*(name+0)=0) printf(文件名不能为空 ! n); return; if(*ext1=0) strcpy(ext1,txt); int sign=0; for(i=0;inum;i+) if(strcmp(filei.name,name)=0) & (strcmp(filei.ext,ext1)=0) printf(-找到第%d个文件(从0开始)-n,i); sign=1;break; / if(sign=0) printf(无此文件n); return; /显
16、示文件 int b,m,n ; b=filei.i; n=filei.size; printf(-该文件位于第%d(从第0块开始)块n,b); / printf(-从文件读出的文件长度为:%dn-,n); /fseek(fp,b*512L,0); char cc; /printf(-文件内容长度为:%ldn,n); printf(-文件内容为:-n); for( m=0,j=1; mn; m+,j+) / fseek(fp,b*512L+m,0); /fread(&cc,sizeof(char),1,fp); cc=fgetc(fp); printf(%c,cc); if(j%80=0)pri
17、ntf(n); printf(n); fclose(fp);void delfile() /删除一个文件 FILE *fp;int i;if(fp=fopen(filesys,r)=NULL)printf(can not open file n);exit(0);fseek(fp,512L,0);fread(&emptytable,sizeof(struct empty),1,fp);rewind(fp);num=emptytable.filenum;for(i=0;inum;i+)fread(&filei,sizeof(struct filename),1,fp);char name9,ex
18、t13;printf(请输入文件名:n);gets(name);/scanf(%s,name);getchar();printf(请输入扩展名:n);gets(ext1);/scanf(%s,ext1);getchar();if(*name=0)printf(文件名不能为空 ! n); return; if(*ext1=0) strcpy(ext1,txt);char judge;printf(是否删除文件%s.%s y/n,name,ext1);scanf(%c,&judge); getchar();if(judge=y)|(judge=Y)printf(准备删除文件%s.%s !n,nam
19、e,ext1);else if(judge=n)|(judge=N) return; else printf(系统默认放弃!n); return; int sign=0; for(i=0;inum;i+)if(strcmp(filei.name,name)=0)&(strcmp(filei.ext,ext1)=0)sign=1; break; if(sign=0) printf(文件名错n); return; /回收空间int b=filei.i;int Amount=filei.Amount;int j;for(j=0;jAmount;j+)emptytable.mapb+=0;for( j
20、=i;jnum-1;j+) strcpy(filej.name,filej+1.name); strcpy(filej.ext,filej+1.ext); filej.i=filej+1.i; filej.size=filej+1.size; filej.Amount=filej+1.Amount; emptytable.filenum=emptytable.filenum-1; num=emptytable.filenum; WriteFile(); fclose(fp);void copy() /复制一个文件 FILE *fq;int i,j;if(fq=fopen(filesys,rb+
21、)=NULL)printf(can not open file n); exit(0); fseek(fq,512l,0);fread(&emptytable,sizeof(struct empty),1,fq);rewind(fq);num=emptytable.filenum;for(i=0;inum;i+) fread(&filei,sizeof(struct filename),1,fq);char SourceName9,DestName9,ext14,ext24;printf(请输入源文件名:);gets(SourceName); /scanf(%s,SourceName);get
22、char();printf(请输入源文件扩展名:);gets(ext1); /scanf(%s,ext1);getchar();printf(请输入目标文件名:);gets(DestName); /scanf(%s,DestName);getchar();printf(请输入目标扩展文件名);gets(ext2); /scanf(%s,ext2);getchar();if(*ext2=0) strcmp(ext2,txt); if(*SourceName)=0 | (*DestName)=0)cout错误! 文件名不能为空!n;return; if(strcmp(SourceName,Dest
23、Name)=0)cout错误! 两个文件名不能相等!n;return;for(i=0;inum;i+) if(strcmp(SourceName,filei.name)=0) strcpy(filenum.name,DestName); strcpy(filenum.ext,ext2); /filenum.i=filei.i; filenum.size=filei.size; filenum.Amount=filei.Amount; break; / if (inum)printf(输入的文件名与第%d个源文件相等(i从0开始)n,i); /else printf(不存在源文件n); retu
24、rn;/空间分配 int sign=0; for(int m=2 ; m0; j-) /寻找一连续的空闲盘块if(emptytable.mapm+j-1=1)sign=1;break;if(sign=0) break;m+=j-1;sign=0; if (m = 10-filenum.Amount) for(j=0;j filenum.Amount;j+)emptytable.mapm+j=1; filenum.i=m;else printf(没有足够的连续的盘块数); /写数据 FILE *fq1; rewind(fq); fq1=fq; fseek(fq,(filei.i) * 512L,
25、0); printf(n-源文件的起始盘块号:%d,filei.i); / /rewind(fp1); fseek(fq1,(filenum.i) * 512L,0); printf(n-复制文件的起始盘块号:%d,filenum.i); / char cc; printf(n-源文件内容为:-n); for(int k=0 ; kfilei.size;k+) fseek(fq,(filei.i) * 512L+k,0); fread(&cc,sizeof(char),1,fq); / printf(%c,cc); fseek(fq1,(filenum.i) * 512L+k,0); fwri
26、te(&cc,sizeof(char),1,fq1); printf(n); num=num+1; emptytable.filenum=num; WriteFile(); /写目录及位示图 fclose(fq); fclose(fq1); void mkfile() /建立一个文件 struct strNode /数据块char word64;struct strNode *next;*head,*p,*q;char name9,ext14;int i=0,j=0;head=p=q=new struct strNode; /申请结构体内存空间char ch;printf(请输入文件内容,按
27、键保存且退出!n); dofor(i=0;iwordi=ch;if(ch=)break;if(ch!=)p=new struct strNode;q-next=p;q=p;j+;while(ch!=); getchar(); int num1, size=(j*64+i)*sizeof(char); / printf(文件长度为:%dn,size); char judge=n; do printf(请输入文件的英文名字:); gets(name);/scanf(%s,name);getchar(); printf(请输入文件的扩展名:); gets(ext1);/scanf(%s,ext1);
28、getchar();if(*ext1=0)strcpy(ext1,txt);judge=y; if(*name=0)printf(错误!文件名不能为空!n);printf(是否放弃此文件Y/N );scanf(%c,&judge);getchar();if( (judge=y) | (judge=Y) ) return; while( (judge=n) | (judge=N) ); FILE *fp;if(fp=fopen(filesys,r+)=NULL)printf(can not open file);exit(0);fseek(fp,512l,0);fread(&emptytable
29、,sizeof(struct empty),1,fp);rewind(fp);num=emptytable.filenum;for(i=0;inum;i+)fread(&filei,sizeof(struct filename),1,fp); printf(%s.%sn,filei.name,filei.ext);for (i=0;i0) num1=num1+1;strcpy(filenum.name,name);strcpy(filenum.ext,ext1);filenum.size = size;filenum.Amount=num1;int sign=0 ,n=0;/空间分配 for(
30、int m=2 ; m 0; n-) if(emptytable.mapm+n-1=1)sign=1;break;if(sign=0)break;m+=n-1;sign=0;if(m=10-num1)filenum.i = m;elseprintf(空间不足!n);return; for(j=0;j 0;j-) ch=p-wordi+; fwrite(&ch,sizeof(char),1,fp); if(i=64) i=0; p=p-next; / cycle-; fclose(fp);void mnue() /菜单函数 printf(nn); printf( !请选择一个功能!n); printf( :n); printf( : 1. Init Sysfile. :n); printf( : 2. Dir. : n); printf( : 3. Create a file. : n); printf( : 4. Type. :n); printf( : 5. Copy. : n); printf( : 6. Delfile. :n); printf( : 7. Exit.