课程设计说明书题目: 模拟DOS文件的建立与使用院系:计算机科学与工程专业班级:计算机10-3学号: **********学生姓名:***指导教师:**2013年 1月 9 日安徽理工大学课程设计(论文)任务书计算机科学与工程学院计算机科学与技术系2012年 11月 20日安徽理工大学课程设计(论文)成绩评定表摘要操作系统是管理计算机硬件资源,控制其他程序运行并为用户提供交互操作界面的系统软件的集合。
操作系统是计算机系统的关键组成部分,负责管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本任务。
文件管理是操作系统的五大职能之一,主要涉及文件的逻辑组织和物理组织,目录的结构和管理。
所谓文件管理,就是操作系统中实现文件统一管理的一组软件、被管理的文件以及为实施文件管理所需要的一些数据结构的总称(是操作系统中负责存取和管理文件信息的机构)文件管理是操作系统中一项重要的功能。
其重要性在于,在现代计算机系统中,用户的程序和数据,操作系统自身的程序和数据,甚至各种输出输入设备,都是以文件形式出现的。
可以说,尽管文件有多种存储介质可以使用,如硬盘、软盘,光盘,闪存,记忆棒,网盘等等,但是,它们都以文件的形式出现在操作系统的管理者和用户面前。
磁盘管理是一项计算机使用时的常规任务,它是以一组磁盘管理应用程序的形式提供给用户的,主要研究的问题包括磁盘调度的算法,访存时延,调度算法的优劣性和适用场合等等。
关键词:模拟dos文件的建立和使用,索引存贮,链式存贮,磁盘调度目录1 设计目的 (1)2 设计要求 (1)2.1模拟设计DOS操作系统中磁盘文件的存储结构 (1)2.1.1算法分析: (2)2.2模拟设计便于直接存取的索引文件结构 (3)2.2.1算法分析: (4)3 模拟算法的实现 (5)3.1流程图 (5)3.1.1主窗口(main函数) (5)3.1.2直接存取的索引文件结构 (6)3.2程序源代码 (7)3.3运行效果图 (11)总结 (13)参考文献 (14)1 设计目的磁盘文件是磁盘上存储的重要信息,通过本实验模拟DOS文件的建立和使用情况,理解磁盘文件的物理结构。
文件管理是操作系统中重要的内容之一,不同的文件系统提供了不同的物理结构,通过实验,深入理解文件的物理结构与存取方法之间的关系,以便更好的掌握文件系统的概念。
2 设计要求2.1 模拟设计DOS操作系统中磁盘文件的存储结构DOS操作系统对磁盘文件的管理采用链接结构,将所有的链接指针集中在一起,存放在文件分配表(FAT)中。
连接文件的第一个物理块号登记在文件目录中。
其设计思想是:假定磁盘上共有N个物理块可供使用,当要存放文件时,从FAT表中寻找其值为0的项,用其对应的物理块存放文件信息,并把文件占有的各物理块用链接指针登记在FAT表中,再把文件的第一个物理块号登记在文件目录中。
文件目录及FAT表如图所示:图2-1在DOS中FAT表的前两项用来记录磁盘的类型。
而从第2项开始记录磁盘的分配情况和文件各物理块的链接情况。
在FAT表中第三项的值如果为0,表示对应的第三块空闲。
由图还知道文件A的各记录依次存放在第2、第4、第15、第16、第50等六个物理块中。
第50块中的指针为FFF,表示文件A的结束。
文件B的各记录依次存放在第7、第10、第20等三个物理块中。
第20块中的指针为FFF。
假定磁盘存储空间共有100个物理块,设计一个文件分配表。
为了简单,文件分配表可用一个数组定义,其中每一个元素与一个物理块对应。
当第 i 个元素为 0 时,表示第 i 块空闲;当第 i 个元素既不为 0 也不为 FFF 时,其值表示该文件的下一个物理块号。
另外,再设一个空闲块总数变量记录系统还有的空闲块数。
为了简单,假定一个物理块指存放一个逻辑记录,要求设计一个程序,把文件的逻辑记录结构转换成 DOS 的链接结构。
当用户要求将已在主存的文件保存在磁盘上时,给出文件名及文件的记录个数,系统应能在磁盘上正确地保存文件。
或当用户要求给指定文件增加记录时,也应正确的实现,并插在指定记录之后。
为了正确地执行模拟程序,可用键盘模拟输入用户的要求。
输入格式为: write(文件名,记录个数) 或i nsert(文件名,逻辑记录号)2.1.1算法分析:void write(char *tmpname,int tmplength){int last,i,j;strcpy(file[filenumber].name,tmpname);//复制文件名和文件块个数file[filenumber].length=tmplength;for(i=2;i<N;i++){ //存文件if(FAT[i]==0){file[filenumber].start=i;//首个空闲块为文件开始块last=i;FAT[last]=FFF;break;}}for(i=1;i<tmplength;i++){ //last为上个记录的位置for(j=2;j<N;j++)if(FAT[j]==0){FAT[last]=j; last=j;FAT[last]=FFF; break;}}FAT[last]=FFF;//文件末存结束标记freespace-=tmplength;//改变空闲块个数filenumber++;printf("文件名和长度:%s %d\n",tmpname,tmplength);}void insert(char *tmpname,int insertpoint){int i;int last,brpoint;for(i=0;i<filenumber;i++)//寻找要执行插入操作的文件,将其数组下标存入last{if(strcmp(file[i].name,tmpname)==0)//比较插入文件名与已存在文件名是否相同{last=i;break;}}brpoint=file[last].start; //brpoint记录当前文件扫描到的位置for(i=0;i<insertpoint-1;i++){ brpoint=FAT[brpoint]; //扫描直到找到插入位置 }for(i=0;i<N;i++)//寻找一个空闲块插入{ if(FAT[i]==0){ FAT[i]=FAT[brpoint];FAT[brpoint]=i;break;}}file[last].length++; //改变空闲块个数与文件长度freespace--;printf("\t文件名和长度:%s %d\n",tmpname,file[last].length);}2.2 模拟设计便于直接存取的索引文件结构为了便于用户直接存取文件的各个逻辑记录,在 MS-DOS 中通过文件目录,再沿着链查找FAT表,便可直接找到指定逻辑记录对应的物理块。
在小型机或更高级的文件系统中,直接存取文件的方法是为每个文件建立一个索引表,指出各逻辑记录与物理块的对应关系。
最简单的形式是一个逻辑记录对应一个物理块。
文件目录与索引表的关系如图所示。
图2-2通常索引表按照逻辑记录顺序建立,这样既有利于顺序存储,又有利于直接存储。
为了标识哪些记录已经建立,哪些记录还没建立,故在索引表中增设一个标志位。
写文件或插入一个记录的过程是寻找一个空闲物理块,然后将其填入索引表对应项中。
其建立过程同第一题,即 write(文件名,记录号)和 insert (文件名,记录号)。
要求用位示图描绘出磁盘的使用情况,并要求模拟程序执行过程的每一步都能显示文件目录、位示图、索引表。
2.2.1算法分析:void search(char *tmpname){int i;for(i=0;i<filenumber;i++){if(strcmp(file[i].name,tmpname)==0)//比较插入文件名与已存在文件名是否相同{printf("\t找到了!\n");printf("\t文件名起始块号文件长度\n");printf(" %s %d %d\n",file[i].name,file[i].start,file[i].length);}}}void search2(int searchpoint){ int i; int m;if(FAT[searchpoint]==0)printf("\t该点空缺,没有文件!");elseif(FAT[searchpoint]==-1&&FAT[searchpoint-1]==-2||FAT[searchpoint]==-2&&FAT[searchpoint +1]==-1){ printf("\t此处为系统空间!"); }else if(FAT[searchpoint]==-1&&FAT[searchpoint+1]==0){ printf("\t找到了!此处的文件名为:%s",file[i].name); }else if(FAT[searchpoint]!=0&&FAT[searchpoint+1]!=-1){for(m=searchpoint;;m++){if(FAT[m]==-1)printf("\t找到了!此处的文件名为:%s",file[i].name);break;}}else if(FAT[searchpoint]!=0&&FAT[searchpoint+1]==-1){printf("找到了!此处的文件名为:%s",file[i].name);}}3 模拟算法的实现3.1流程图3.1.1主窗口(main函数)3.1.2直接存取的索引文件结构3.2程序源代码#include<string.h>#include<conio.h>#include<stdio.h>#include<stdlib.h>const int FDF=-2;const int FFF=-1;const int N=100;//存储空间(FAT表长度)int filenumber;//文件数量struct FILEINFO{char name[10];int start;int length;};FILEINFO file[10];int FAT[N],freespace; //FAT表和剩余空间void printfmenu(){int i;printf("\t文件个数:%d \n",filenumber);printf("\t文件名起始块号文件长度\n");for(i=0;i<filenumber;i++){printf(" %s %d %d\n",file[i].name,file[i].start,file[i].length);}}void printFAT(){int i;printf("\t空闲块数:%d\n",freespace);printf("\t-2代表FDF,-1代表FFF\n");for(i=0;i<N;i++){printf(" No.%d %d\n",i,FAT[i]);}}void search(char *tmpname){int i;for(i=0;i<filenumber;i++){if(strcmp(file[i].name,tmpname)==0)//比较插入文件名与已存在文件名是否相同{printf("\t找到了!\n");printf("\t文件名起始块号文件长度\n");printf(" %s %d %d\n",file[i].name,file[i].start,file[i].length);}}}void search2(int searchpoint){int i;int m;if(FAT[searchpoint]==0)printf("\t该点空缺,没有文件!");elseif(FAT[searchpoint]==-1&&FAT[searchpoint-1]==-2||FAT[searchpoint]==-2&&FAT[searchpoint+ 1]==-1){printf("\t此处为系统空间!");}else if(FAT[searchpoint]==-1&&FAT[searchpoint+1]==0){printf("\t找到了!此处的文件名为:%s",file[i].name);}elseif(FAT[searchpoint]!=0&&FAT[searchpoint+1]!=-1){for(m=searchpoint;;m++){if(FAT[m]==-1)printf("\t找到了!此处的文件名为:%s",file[i].name);break;}}else if(FAT[searchpoint]!=0&&FAT[searchpoint+1]==-1){printf("找到了!此处的文件名为:%s",file[i].name);}}void write(char *tmpname,int tmplength){int last,i,j;strcpy(file[filenumber].name,tmpname);//复制文件名和文件块个数file[filenumber].length=tmplength;for(i=2;i<N;i++){ //存文件if(FAT[i]==0){file[filenumber].start=i;//首个空闲块为文件开始块last=i;FAT[last]=FFF;break;}}for(i=1;i<tmplength;i++){ //last为上个记录的位置for(j=2;j<N;j++)if(FAT[j]==0){FAT[last]=j;last=j;FAT[last]=FFF;break;}}FAT[last]=FFF;//文件末存结束标记freespace-=tmplength;//改变空闲块个数filenumber++;printf("文件名和长度:%s %d\n",tmpname,tmplength);}void insert(char *tmpname,int insertpoint){int i;int last,brpoint;for(i=0;i<filenumber;i++)//寻找要执行插入操作的文件,将其数组下标存入last {if(strcmp(file[i].name,tmpname)==0)//比较插入文件名与已存在文件名是否相同{last=i;break;}}brpoint=file[last].start; //brpoint记录当前文件扫描到的位置for(i=0;i<insertpoint-1;i++){brpoint=FAT[brpoint]; //扫描直到找到插入位置}for(i=0;i<N;i++)//寻找一个空闲块插入{if(FAT[i]==0){FAT[i]=FAT[brpoint];FAT[brpoint]=i;break;}}file[last].length++; //改变空闲块个数与文件长度freespace--;printf("\t文件名和长度:%s %d\n",tmpname,file[last].length);}int main(){int i;char tmpname[10];int tmplength;//要写入文件长度int m;//命令filenumber=0;for(i=0;i<N;i++){ //初始化FAT表FAT[i]=0;}FAT[0]=FDF;FAT[1]=FFF;//FAT[3]=999;freespace=98;while(true){printf("\n");printf("*********************************************************\n");printf(" ****欢迎进入**** \n");printf(" \n");printf(" <<<< 模拟DOS文件的建立和使用>>>> \n");printf(" 0.退出\n");printf(" 1.写入文件 2.插入文件 3.显示文件目录\n");printf(" 4.显示FAT表 5.搜索文件 6.搜索索引点\n");printf("*********************************************************\n");printf("\n");printf("\t选择服务菜单:");scanf("%d",&m);switch(m){case 0: exit(0);case 1: printf("\t输入要写入的文件名:");scanf("%s",&tmpname);printf("\t输入要写入的文件长度:");scanf("%d",&tmplength);write(tmpname,tmplength);break;case 2: printf("\t输入要插入的文件名:");scanf("%s",&tmpname);int insertpoint;printf("\t输入要插入的点:");scanf("%d",&insertpoint);insert(tmpname,insertpoint);break;case 3: printfmenu();break;case 4: printFAT();break;case 5: printf("\t请输入要搜索的文件名:");scanf("%s",&tmpname);search(tmpname);break;case 6: printf("\t请输入要搜索的索引点:");int searchpoint;scanf("%d",&searchpoint);search2(searchpoint);break;}}printFAT();}3.3运行效果图A、模拟设计DOS操作系统中磁盘文件的存储结构运行结果B、FAT()列表C、模拟设计便于直接存取的索引文件结构运行效果总结通过本次的课程设计学习对dos文件的管理系统有了初步的了解。