计算机 08 级《操作系统课程设计》任务书
一、课程设计的性质和目的
操作系统课程设计是计算机专业的专业课程,通过课程设计使学生进一步巩固课堂所学知识,全
面熟悉、掌握操作系统的基本设计方法和技巧,进一步提高分析问题、解决问题及上机操作能力,
为将来从事计算机工作打下一定的专业基础。
二、设计课题
模拟实现单级目录的 FAT 文件系统
基本思路:用二进制文件空间模拟磁盘空间,用文件块操作模拟磁盘块操作。
基本设计要求:1、实现如下文件系统功能(过程或函数):
void LISTDIR(void);
int FCREATE(char *filename);
int FDELETE(char *filename);
int FOPEN(char *filename);
int FCLOSE(int fileid);
int FREAD(void *ptr, int n, int fileid);
int FWRITE(void *ptr, int n, int fileid);
a、 打开文件系统 FILE *OPENSYS(char *filename);
b、 关闭文件系统 int CLOSESYS(FILE *stream);
c、 显示目录
d、 建立文件
e、 删除文件
f、 打开文件
g、 关闭文件
h、 文件块读
i、 文件块写
j、 判断文件结束 int FEOF(int fileid);
k、 获取文件指针 long FGETPOS(int fileid);
l、 设置文件指针 int FSETPOS(int fileid, long offset);
m、取得文件长度 long FGETLEN(char *filename);
2、提供文件系统创建程序
3、有功能检测模块
4、为简化程序设计,假定目录区域大小固定。
文件系统空间划分:
保留扇区
FAT 表区
(或字节映像图区)
根目录区
文件分区
可以使用的 C 语言文件操纵函数:
FILE *fopen(const char *filename, const char *mode);
int fclose(FILE *stream);
int fseek(FILE *stream, long offset, int whence);
long ftell(FILE *stream);
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);
1
目录
一、程序的功能 ................................................ 3
二、程序的基本设计思路 ........................................ 3
三、主要的数据结构 ............................................ 4
4.1 创建文件流程图 .......................................... 6
4.3 FREAD 函数流程图 ........................................ 8
五、程序调试及其运行结果 ...................................... 9
六、设计总结与心得体会 ....................................... 12
七、附录(源程序清单) ......................................... 13
2
一、程序的功能
该程序主要模拟实现单级目录的 FAT 文件系统,该系统要求能实现对文件的创建、
删除、读、写、打开、关闭以及能显示目录等操作,在创建文件时,系统首先为新文件
分配所需的外存空间,并且在文件系统的相应目录中,建立一个目录项,该目录项记录
了新文件的文件名及其在外存中的地址等属性。而当已经不再需要某个文件时,便可以
把它从文件系统中删除。这时执行的是与创建新文件相反的操作。系统先从目录中找到
要删除的文件项,使之成为空项,紧接着回收该文件的存储空间,用于下次分配。通过
读指针,将位于外部存储介质上的数据读入到内存缓冲区这样就实现了文件的读取,通
过写指针,将内存缓冲区中的数据写入到位于外部存储介质上的文件中。在开始使用文
件时,首先必须打开文件。这可以将文件属性信息装入内存,以便以后快速查用。在完
成文件使用后,应该关闭文件。这不但是为了释放内存空间,而且也因为许多系统常常
限制可以同时打开的文件数。当创建文件时,先在目录表中查找是否存在此文件表,若
存在则表示文件同名不能创建,否则在目录表中为此文件先建立一个目录项,保存文件
的一些基本属性,如创建日期、大小、文件名等,并保存文件的首索引块扇区号,对文
件读写也是先在目录项里查找文件是否存在,再根据文件的首索引块扇区号,查找对应
块号中的内容对其进行读写操作,删除一个文件后回收为其分配的空间,并更新目录表、
修改文件控制块。显示目录项可以显示文件名、长度以及创建日期。
二、程序的基本设计思路
模拟实现单极目录 FAT 的文件系统基本思路:用二进制文件空间模拟磁盘空间,
用文件块操作模拟磁盘块操作。在一个文件系统中对文件进行操作,实现文件的创建、
读写等等操作。在创建文件时先在目录项中进行查找,若创建的文件已存在,文件的创
建首先检验目录是否为空,为空则把文件夹或文件连接到该目录下,不为空则把检查目
录下是否有同名文件夹或文件,有则提示创建不成功,而文件夹打开是则把文件夹名称
及其地址压入打开文件夹栈,文件关闭则把文件夹名称及其地址从打开文件夹栈中抛
出。文件夹和文件的删除,文件夹下没有打开的文件或文件没有打开才能删除,否则删
除失败,每次操作成功都要更改目录和 FCB 信息。该过程都保存在文件中,是对文件的
操作。本系统建于 Windows 平台,开发环境为 WIN-TC。
3
三、主要的数据结构
单级目录单级索引文件系统:
常量
#define BlockSize
512
#define DirSize 32
保留扇区结构
struct ReserveBlock{
int sysblocknum;
/*文件系统总扇区数*/
int resblocknum;
/*保留扇区扇区数*/
int mapblocknum;
/*字节映像图扇区数*/
int rootblocknum;
/*根目录区扇区数*/
char fillchar[BlockSize-4*sizeof(int)];
/*填充字节*/
};
目录结构
struct DirBlock{
char filename[11];
/*文件名限长 11 个字符*/
char fillchar[DirSize-4*sizeof(int)-sizeof(long int)-11];
/*填充字节*/
long filelen;
/*文件长度*/
int year,month,day;
/*定义年月日*/
int firstindexaddr;
/*文件首索引块扇区号*/
};
索引块结构
struct IndexBlock{
int dataaddr[BlockSize/sizeof(int)-1];
/*数据块块号数组*/
int nextindexaddr;
/*本文件下一索引块块号*/
};
索引节点结构
struct IndexNode{
struct IndexBlock block;
/*索引块数据*/
int blockaddr;
/*本节点索引块块号*/
struct IndexNode *nextnode;
/*指向下一索引节点的指针*/};
FCB(文件控制块)结构
4
struct FCBBlock{
int fileid;
/*文件标识*/
struct DirBlock fileinfo;
/*目录信息*/
long filepos;
/*文件读写指针*/
int fdtblockaddr;
/*目录项所在块号*/
int fdtblockindex;
/*目录项所在块内序号*/
struct FCBBlock *next;
/*指向下一个文件控制块的指针*/
struct IndexNode *firstindexnode;
/*指向第一个索引节点的指针*
/}
5
四、相关流程图
4.1 创建文件流程图
N
Start
主界面
输入 start 打
开文件系统
Y
输入 creat 来
创建文件
输入文件名,大
小,创建日期
N
判 断 是
否重名
Y
文 件 创 建
成功
文 件 创 建 失 败 ,
重新输入文件名
End
6
4.2 删除文件流程图
Start
判断是否存在
该文件
判断该文件是
否被 open
创 建 (creat)
一个文件
先 close 关
闭文件
输入 del 成功
删除文件
End
7
4.3 FREAD 函数流程图
Start
a==Null
N
a->fileid==fileid
Y
Y
N
(a->filepos+n)>((a->fileid*512)
+a->fileinfo.filelen)
N
Y
printf("超出空间。\n")
输出字符串
输 出 无 此
fileid
a=a->next
End
8