胡浩亮课程设计报告.docx
《胡浩亮课程设计报告.docx》由会员分享,可在线阅读,更多相关《胡浩亮课程设计报告.docx(31页珍藏版)》请在冰点文库上搜索。
胡浩亮课程设计报告
学校代码:
10128
学号:
200620205007
课程设计
题目:
文件系统的设计与实现
********
学院:
信息工程学院
系别:
计算机系
专业:
软件工程
班级:
软06
指导教师:
赵俊生副教授
马志强讲师
2009年1月15日
摘要
设计一个小型的文件管理系统,在XP系统下,建立一个大文件,把它假想成一张盘,在其上实现小型文件管理系统。
该小型文件系统有一个简单的主界面,提供五条简单的命令:
dir、mkfile、type、copy、delfile,分别用于显示文件目录、建立文件、显示文件内容、复制和删除一个文件。
关键字:
操作系统,课程设计,文件系统
第一章设计内容
1.1设计目的
通过设计一个小型文件系统,进一步掌握文件管理的方法和技术,使学生初步具有研究、设计、编制和调试操作系统模块的能力。
1.2设计要求
(1)问题描述
在任一OS下,建立一个大文件,把它假想成一张盘,在其中实现一个简单的小型文件系统。
(2)基本要求
该文件系统没有子目录机制,文件连续分配,不考虑换“盘”和分区。
做一个简单的操作界面,提供五条简单的命令:
dir、mkfile、type、copy、delfile,分别用于显示文件目录、建立文件、显示文件内容、复制和删除一个文件。
1.3程序设计思想
阅读操作系统方面的书籍,了解操作系统的文件系统原理。
结合分析课程设计要求,确定实体以及它们之间的关系。
实体关系有三张表(磁盘空间分配表、文件表、打开文件表)、一个模拟磁盘的数组、命令服务和用户构成。
用户负责输入命令。
命令服务实现命令的解释、命令检查、命令帮助以及调用相关模块执行相应的命令功能。
建立一个系统文件(模拟盘),并对此进行盘块的划分,第一个盘块存放文件目录,第二盘块存放盘块位示图,自第三个盘块开始存放各具体文件的内容,文件目录存放文件的名字,文件的扩展名,开始盘块号,所占用的盘块数目,文件的大小;盘块位示图用来标记盘块是否被占用。
构造这些实体的关系图,数据流图、程序流程图来进行具体的设计。
第二章数据结构、算法和算法流程图
2.1数据结构
数据结构说明:
本程序所运用的主要有两个数据结构,分别如下:
文件目录结构:
structfilename{//文件目录项结构体
charname[9];//文件名
charext[4];//扩展名
inti;//文件所占用磁盘块的第一个磁盘块号
intAmount;//文件所占用磁盘块的块数
longintsize;//文件大小
};
盘块结构:
structempty{//盘块结构体
intmap[100];//盘块位示图
intfilenum;//文件数量
};
2.2程序功能图
文件系统提供的文件操作有建立文件(mkfile)、复制文件(copy)、显示文件所有内容(type)、删除文件(delfile)。
可以通过键盘输入命令来模拟文件的操作。
2.3程序流程图
(1)主程序流程图:
(2)初始化模块流程图:
(3)写入磁盘流程图:
(4)显示目录流程图:
(5)显示文件流程图:
(6)删除文件流程图:
(7)复制文件流程图:
(8)创建文件流程图:
第三章程序运行结果及分析
3.1程序运行结果
(1)程序主界面
(2)创建一个文件,输入“3”显示“输入文件内容,按@键保存且退出!
”
(3)往文件里写内容:
HelloWorld!
显示文件长度,并要求给文件命名,命名后保存返回主界面
(4)读取刚才写入的文件,结果正确
(5)删除刚写入的文件,测试成功
对于测试用例,还有很多路径都有测试过,鉴于篇幅,就不再列出所有可能的路径来进行白盒测试。
3.2程序分析
本程序使用一个Windows下的文件来模拟一个磁盘,向磁盘中装入文件并进行相关操作。
采用了以空间换时间的算法,文件的大小在系统中是固定的,虽然会浪费一些空间,但文件的存取速率会加快。
第四章心得体会
通过本次的课程设计,使我能够正确运用操作系统课程中所学的基本理论和知识,加深了对文件系统基本概念的理解,以及磁盘文件系统的文件操作。
还有让我感受挺深的是对软件工程方法的应用。
设计一个软件,先要做好需求分析,这一点很重要,如果没有分析好需求,到软件设计的最后,发现所做的功能不符合要求,那么一切都得重做,前面所有的努力都付诸东流。
还有比较重要的是,画好程流程图。
在程序设计的开始,由于分析工作做得不够深入和细致,吃了点小苦头。
对于这样一个小设计来说,都会吃苦头,要是大工程更是无法想像,有可能会项目失败。
以后得加强对软件工程的学习。
另外在运用C语言的时候,感觉有点生疏,在组织语言时时而出错,在编程和调试的过程中,经常会出现意想不到的问题,并非每个问题都可以从相关资料中找到解决方法,有些问题是无法预料到的,这就需要通过自己理性的分析得出问题的解决方案。
在设计过程中,查询了不少相关资料,不断的发现问题、提出问题、解决问题。
在对自己所编写的源程序段的纠错的过程中,使我更好的理解了操作系统中文件系统的理论知识,同时在编程时用到了模块化的设计思想,这种编程方法可以使我们的编程变的更简单,可以使我们的查错与纠错变的更方便。
总的来说通过这次的设计的学习使我学到了很多在平时的学习中学不到的很多东西,通过这次课程设计,使我对操作系统和编程产生兴趣,我想我会在这条路上继续前进下去。
我相信,只要不断的严格要求自己,注意培养自己的思维能力,就一定会有更大更辉煌的发展和提高。
参考文献
[1]张尧学编.计算机操作系统教程(第三版)习题解答与实验指导.北京:
清华大学出版社,2006
[2]汤子瀛主编.计算机操作系统(第三版).西安:
西安电子科技大学出版社,2001
[3]CSDN论坛.
附录程序清单
#include"iostream.h"
#include"string"
#include"stdio.h"
extern"C"voidexit(int);
structfilename//文件目录项结构体
{
charname[9];//文件名
charext[4];//扩展名
inti;//文件所占用磁盘块的第一个磁盘块号
intAmount;//文件所占用磁盘块的块数
longintsize;//文件大小
}file[11];
intnum;
structempty//盘块结构体
{intmap[11];//盘块位示图
intfilenum;//文件数量
}emptytable;
//☆模块说明:
voidSystemInit()//模拟磁盘文件初始化函数
{for(inti=2;i<10;i++)//初始化存放位示图的盘块
emptytable.map[i]=0;
emptytable.map[0]=1;
emptytable.map[1]=1;
emptytable.filenum=0;
FILE*fp;
if((fp=fopen("filesys","wb+"))==NULL)//wb+:
为读写建立一个"新"文件;打开系统文件将文件目录盘块和
{//位示图盘块写入系统文件
printf("cannotopenfile\n");
exit(0);
}
fseek(fp,512L,0);
fwrite(&emptytable,sizeof(structempty),1,fp);
fclose(fp);
printf("初始化系统成功");
}
voidWriteFile()//将目录以及空闲盘块表写入磁盘
{
FILE*fp;
if((fp=fopen("filesys","rb+"))==NULL)
{
printf("cannotopenfile\n");
exit(0);
}
rewind(fp);
for(inti=0;i{
fwrite(&file[i],sizeof(structfilename),1,fp);//////////////////////文件目录
}
fseek(fp,512L,0);
fwrite(&emptytable,sizeof(structempty),1,fp);////////////////////////////位示图
fclose(fp);
}
voiddir()//显示文件目录
{inti,j;
FILE*fp;
if((fp=fopen("filesys","rb"))==NULL)
{printf("cannotopenfile\n");
exit(0);
}
fseek(fp,512L,0);//空闲盘块表的定位
fread(&emptytable,sizeof(structempty),1,fp);
rewind(fp);//文件目录表的定位
num=emptytable.filenum;
for(i=0;ifread(&file[i],sizeof(structfilename),1,fp);
if(num!
=0)
{printf("系统文件目录结构:
\n");
for(i=0,j=1;i{
printf("%s.%s\n",file[i].name,file[i].ext);
if(j==5)
{printf("\n");
j=1;
}
}
}
printf("\n文件数量为%d",num);
fclose(fp);
}
voidtype()//显示文件内容
{
FILE*fp;
inti,j;
if((fp=fopen("filesys","rb"))==NULL)
{printf("cannotopenfile\n");
exit(0);
}
fseek(fp,512L,0);
fread(&emptytable,sizeof(structempty),1,fp);
rewind(fp);
num=emptytable.filenum;
for(i=0;i{fread(&file[i],sizeof(structfilename),1,fp);
printf("%s.%s\n",file[i].name,file[i].ext);////////////////////////////
}
charname[9],ext1[4];
printf("请输入文件名:
\n");
gets(name);//scanf("%s",name);//getchar();
printf("请输入扩展名:
");
gets(ext1);//scanf("%s",ext1);getchar();
if(*(name+0)=='\0')
{
printf("文件名不能为空!
\n");
return;
}
if(*ext1=='\0')
strcpy(ext1,"txt");
intsign=0;
for(i=0;iif((strcmp(file[i].name,name)==0)&&(strcmp(file[i].ext,ext1)==0))
{printf("---找到第%d个文件(从0开始)----\n",i);
sign=1;
break;
}
/////////////////////////////////////////////
if(sign==0)
{printf("无此文件\n");
return;
}
//显示文件
intb,m,n;
b=file[i].i;
n=file[i].size;
printf("---该文件位于第%d(从第0块开始)块\n",b);///////////////////////
printf("---从文件读出的文件长度为:
%d\n---",n);
//fseek(fp,b*512L,0);
charcc;
//printf("---文件内容长度为:
%ld\n",n);
printf("---文件内容为:
---\n");
for(m=0,j=1;m{
fseek(fp,b*512L+m,0);
//fread(&cc,sizeof(char),1,fp);
cc=fgetc(fp);
printf("%c",cc);
if(j%80==0)printf("\n");
}
printf("\n");
fclose(fp);
}
voiddelfile()//删除一个文件
{FILE*fp;
inti;
if((fp=fopen("filesys","r"))==NULL)
{
printf("cannotopenfile\n");
exit(0);
}
fseek(fp,512L,0);
fread(&emptytable,sizeof(structempty),1,fp);
rewind(fp);
num=emptytable.filenum;
for(i=0;ifread(&file[i],sizeof(structfilename),1,fp);
charname[9],ext1[3];
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");
charjudge;
printf("是否删除文件%s.%s[y/n]",name,ext1);
scanf("%c",&judge);getchar();
if((judge=='y')||(judge=='Y'))
printf("准备删除文件%s.%s!
\n",name,ext1);
elseif((judge=='n')||(judge=='N'))
return;
else
{
printf("系统默认放弃!
\n");
return;
}
intsign=0;
for(i=0;iif((strcmp(file[i].name,name)==0)&&(strcmp(file[i].ext,ext1)==0))
{
sign=1;
break;
}
if(sign==0)
{printf("文件名错\n");
return;
}
//回收空间
intb=file[i].i;
intAmount=file[i].Amount;
intj;
for(j=0;jemptytable.map[b++]=0;
for(j=i;j{strcpy(file[j].name,file[j+1].name);
strcpy(file[j].ext,file[j+1].ext);
file[j].i=file[j+1].i;
file[j].size=file[j+1].size;
file[j].Amount=file[j+1].Amount;
}
emptytable.filenum=emptytable.filenum-1;
num=emptytable.filenum;
WriteFile();
fclose(fp);
}
voidcopy()//复制一个文件
{FILE*fq;
inti,j;
if((fq=fopen("filesys","rb+"))==NULL)
{printf("cannotopenfile\n");
exit(0);
}
fseek(fq,512l,0);
fread(&emptytable,sizeof(structempty),1,fq);
rewind(fq);
num=emptytable.filenum;
for(i=0;ifread(&file[i],sizeof(structfilename),1,fq);
charSourceName[9],DestName[9],ext1[4],ext2[4];
printf("请输入源文件名:
");
gets(SourceName);//scanf("%s",SourceName);getchar();
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,DestName)==0)
{
cout<<"错误!
两个文件名不能相等!
\n";
return;
}
for(i=0;iif(strcmp(SourceName,file[i].name)==0)
{
strcpy(file[num].name,DestName);
strcpy(file[num].ext,ext2);
//file[num].i=file[i].i;
file[num].size=file[i].size;
file[num].Amount=file[i].Amount;
break;/////////////////////
}
if(iprintf("输入的文件名与第%d个源文件相等(i从0开始)\n",i);////////////////////////
else
{
printf("不存在源文件\n");
return;
}
//空间分配
intsign=0;
for(intm=2;m<=10-file[num].Amount;m++)
{
if(emptytable.map[m]==0)
{
for(j=file[i].Amount;j>0;j--)//寻找一连续的空闲盘块
if(emptytable.map[m+j-1]==1)
{
sign=1;
break;
}
if(sign==0)break;
m+=j-1;
sign=0;
}
}
if(m<=10-file[num].Amount)
{for(j=0;jemptytable.map[m+j]=1;
file[num].i=m;
}
else
printf("没有足够的连续的盘块数");
//写数据
FILE*fq1;
rewind(fq);
fq1=fq;
fseek(fq,(file[i].i)*512L,0);
printf("\n---源文件的起始盘块号:
%d",file[i].i);/////////////////
//rewind(fp1);
fseek(fq1,(file[num].i)*512L,0);
printf("\n---复制文件的起始盘块号:
%d",file[num].i);//////////////////
charcc;
printf("\n---源文件内容为:
---\n");
for(intk=0;k{
fseek(fq,(file[i].i)*512L+k,0);
fread(&cc,sizeof(char),1,fq);////////////////////////////////
printf("%c",cc);
fseek(fq1,(file[num].i)*512L+k,0);
fwrite(&cc,sizeof(char),1,fq1);
}
printf("\n");
num=num+1;
emptytable.filenum=num;
WriteFile();//写目录及位示图
fclose(fq);
fclose(fq1);
}
voidmkfile()//建立一个文件
{structstrNode//数据块
{charword[64];
structstrNode*next;
}*head,*p,*q;
charname[9],ext1[4];
inti=0,j=0;
head=p=q=newstructstrNode;//申请结构体内存空间
charch;
printf("请输入文件内容,按@键保存且退出!
\n");
do{
for(i=0;i<64;i++)
{
//ch=getchar();
scanf("%c",&ch);
p->word[i]=ch;
if(ch=='@')break