2022年2022年简单文件系统的实现实验报告 .pdf
《2022年2022年简单文件系统的实现实验报告 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年简单文件系统的实现实验报告 .pdf(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、操作系统课程设计报告简单文件系统的实现专业:班级:姓名:学号:老师:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 18 页 - - - - - - - - - 一、课程设计的目的1. 通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部数据结构、功能以及实现过程的理解。二、课程设计要求1. 在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的单用户单任务系统中的文件系统。在退出该文件系统的使用时,应将该虚
2、拟文件系统以一个 Windows 文件的方式保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。2 文件存储空间的分配可采用显式链接分配或其他的办法。3 空闲磁盘空间的管理可选择位示图或其他的办法。如果采用位示图来管理文件存储空间,并采用显式链接分配方式,那么可以将位示图合并到FAT 中。文件目录结构采用多级目录结构。为了简单起见,可以不使用索引结点,其中的每个目录项应包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。要求提供以下有关的操作命令:my_format :对文件存储器进行格式化,即按照文件系统的结构对虚拟磁盘空间进行布局,并在其上创建根目录以及用于
3、管理文件存储空间等的数据结构。my_mkdir :用于创建子目录。my_rmdir :用于删除子目录。my_ls:用于显示目录中的内容。my_cd:用于更改当前目录。my_create:用于创建文件。my_open:用于打开文件。my_close:用于关闭文件。my_write :用于写文件。my_read:用于读文件。my_rm:用于删除文件。my_exitsys:用于退出文件系统。三、程序的设计细想和框图1打开文件函数fopen() (1)格式: FILE *fopen(const char *filename,const char *mode) (2)功能:按照指定打开方式打开指定文件。
4、(3)输入参数说明:filename:待打开的文件名,如果不存在就创建该文件。mode:文件打开方式,常用的有:r :为读而打开文本文件(不存在则出错)。w :为写而打开文本文件(若不存在则创建该文件;反之,则从文件起始位置写,原内容将被覆盖)。a:为在文件末尾添加数据而打开文本文件。(若不存在则创建该文件;反之,在原文件末尾追加) 。r+ :为读和写而打开文本文件。(读时,从头开始;在写数据时,新数据只覆盖所占的空间,其后不变 ) 。w+ :首先建立一个新文件,进行写操作,随后可以从头开始读。(若文件存在,原内容将全部消失 ) 。a+ :功能与 a相同;只是在文件末尾添加新的数据后,可以从头
5、开始读。另外,上述模式字符串中都可以加一个“b”字符,如rb、wb、ab、rb+、wb+、ab+等组合,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 18 页 - - - - - - - - - 字符“ b”表示 fopen() 函数打开的文件为二进制文件,而非纯文字文件。(4)输出:一个指向FILE 类型的指针。2关闭文件函数fclose() (1)格式: int fclose(FILE * stream); (2)功能:用来关闭先前fopen()打开的一个文件。此动
6、作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。(3)输入参数说明:stream:指向要关闭文件的指针,它是先前执行fopen()函数的返回值。(4)输出:若关闭文件成功则返回0;有错误发生时则返回EOF 并把错误代码存到errno。3读文件函数fread() (1)格式: size_t fread( void *buffer, size_t size, size_t count, FILE *stream );(2)功能:读二进制文件到内存。(3)输入参数说明:buffer:用于存放输入数据的缓冲区的首地址;stream:使用 fopen()打开的文件的指针,用于指示要读取的文件
7、;size:每个数据块的字节数;count: 要读入的数据块的个数;size*count:表示要求读取的字节数。(4)输出:实际读取的数据块的个数。4写文件函数fwrite() (1)格式: size_t fwite(const void *buffer,size_t size,size_t count,FILE *stream);(2)功能:将数据写到二进制文件中。(3)输入参数说明:buffer:用于存放输出数据的缓冲区的首地址;stream:使用 fopen()打开的文件的指针,用于指示要写出的文件;size:每个数据块的字节数;count: 要写出的数据块的个数;size*count:
8、表示要求写出的字符数。(4)输出:实际写出的数据块的个数。5判断文件结束函数feof () (1)格式: int feof(FILE * stream) (2)功能:用来判断是否已读取到文件末尾。(3)输入参数说明:stream:使用 fopen()打开的文件的指针,用于指示要判断的文件。(4)输出:如果已读到文件尾则返回非零值,其他情况返回0。6 主要函数功能实现: int format(); / 格式化磁盘int mkdir(char *sonfname); / 创建子目录int rmdir(char *sonfname); / 删除子目录int create(char *name); /
9、 创建文件int listshow();/ 显示子文件信息int delfile(char *name); / 删除文件int changePath(char *sonfname);/ 更改当前路径int write(char *name); / 写入文件名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 18 页 - - - - - - - - - int exit();/ 退出系统int open(char *file);/ 打开文件int close(char *fil
10、e);/ 关闭文件int read(char *file);/ 读取文件7 主要的框架四、程序实现和程序调试遇到的问题的分析1 对于 DOS 的文件操作使用不熟悉,经常输入错误命令2 调试的时候跟踪变量的时候,难以锁定实际的变量是什么3 对于文件的存储结构不熟悉,在构造FAT 的时候不知如何解决,查阅了大量的资料和跟老师交流才慢慢开始理解4 由于买的实验册对于文件的介绍过于简单,导致理解上出现很大的困难。五、结果分析和总结1 基本上实现了DOS 下简单文件系统的实现,通过学习基本掌握了文件系统的存储结构2 当遇到困难的时候通过认真思考很查阅资料很大问题都是可以自己解决的。通过这次实验锻炼了自己
11、的动手的能力和分析问题的能力3 在构造函数的时候可以开阔思维同时加深自己对文件系统实现的理解4 通过这样的实验开始对DOS 的环境文件命令输入有了初步的理解5 通过跟老师的讨论解决自己心中的疑惑六、程序#include #include #include #include using namespace std; #define GENERAL 1/1代表普通文件2 代表目录文件0 表示空文件#define DIRECTORY 2 #define Zero 0 struct FCB char fname16; / 文件名char type; / 0 空文件1 目录文件2 空文件int size
12、; /文件大小int fatherBlockNum; /当前的父目录盘块号int currentBlockNum; /当前的盘块void initialize() strcpy(fname,0); type = Zero; size =0; fatherBlockNum = currentBlockNum = 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 18 页 - - - - - - - - - ; const char* FilePath = C:myfil
13、es;/*常量设置 */ const int BlockSize = 512; /盘块大小const int OPEN_MAX = 5; /能打开最多的文件数const int BlockCount = 128; /盘块数const int DiskSize = BlockSize * BlockCount; /磁盘大小const int BlockFcbCount = BlockSize/sizeof(FCB);/目录文件的最多FCB 数int OpenFileCount = 0; / 统计当前打开文件数目struct OPENLIST /用户文件打开表 int files; /当前打开文件
14、数FCB fOPEN_MAX; /FCB 拷贝OPENLIST() files=0; for(int i=0;iOPEN_MAX;i+) fi.fatherBlockNum = -1;/为分配打开fi.type=GENERAL; ; struct dirFile/*-目录文件结构-*/ struct FCB fcbBlockFcbCount; void init(int _FatherBlockNum,int _CurrentBlockNum,char *name)/父块号,当前块号,目录名 strcpy(fcb0.fname,name); / 本身的 FCB fcb0.fatherBlock
15、Num=_FatherBlockNum; fcb0.currentBlockNum=_CurrentBlockNum; fcb0.type=DIRECTORY; /标记目录文件for(int i=1;iformat();/ 打开文件列表初始化delete openlist; openlist=new OPENLIST; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 18 页 - - - - - - - - - /*- 保存到磁盘上myfiles-*/ fp = fope
16、n(FilePath,w+); fwrite(BaseAddr,sizeof(char),DiskSize,fp); fclose(fp); printf( 格式化成功! !n); return 1; int mkdir(char *sonfname)/*-创建子目录 -*/ / 判断是否有重名寻找空白子目录项寻找空白盘块号当前目录下增加该子目录项分配子目录盘块,并且初始化修改fat 表int i,temp,iFAT; struct dirFile *dir; /当前目录的指针if(current = 2) / 根目录dir=&(osPoint-root); else dir=(struct
17、dirFile *)(osPoint-data current-3); /*- 为了避免该目录下同名文件夹-*/ for(i = 1;ifcbi.type=DIRECTORY & strcmp(dir-fcbi.fname,sonfname)=0 ) printf( 该文件夹下已经有同名的文件夹存在了!n); return 0; for(i = 1;i fcbi.type=Zero) break; if(i = BlockFcbCount) printf( 该目录已满 !请选择新的目录下创建!n); return 0; temp = i; for(i = 3;i FAT1i = 0) brea
18、k; if(i = BlockCount) printf( 磁盘已满 !n); return 0; iFAT=i; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 18 页 - - - - - - - - - /*-接下来进行分配-*/ osPoint-FAT1iFAT=osPoint-FAT2iFAT = 2; /2 表示分配给下级目录文件/填写该分派新的盘块的参数strcpy(dir-fcbtemp.fname,sonfname); dir-fcbtemp.type=
19、DIRECTORY; dir-fcbtemp.fatherBlockNum=current; dir-fcbtemp.currentBlockNum=iFAT; /初始化子目录文件盘块dir=(struct dirFile*)(osPoint-data iFAT-3); /定位到子目录盘块号dir-init (current,iFAT,sonfname);/iFAT 是要分配的块号,这里的current 用来指要分配的块的父块号printf( 创建子目录成功!n); return 1; int rmdir(char *sonfname)/*-删除当前目录下的文件夹-*/ int i,temp,
20、j;/ 确保当前目录下有该文件,并记录下该FCB 下标struct dirFile *dir; /当前目录的指针if(current=2) dir=&(osPoint-root); else dir=(struct dirFile *)(osPoint-data current-3); for(i=1;ifcbi.type=DIRECTORY & strcmp(dir-fcbi.fname,sonfname)=0) break; temp=i; if(i=BlockFcbCount) printf( 当前目录下不存在该子目录!n); return 0; j = dir-fcbtemp.curr
21、entBlockNum; struct dirFile *sonDir; /当前子目录的指针sonDir=(struct dirFile *)(osPoint-data j - 3); for(i=1;ifcbi.type!=Zero) printf( 该文件夹为非空文件夹,为确保安全,请清空后再删除!n); return 0; /*开始删除子目录操作*/ osPoint-FAT1j = osPoint-FAT2j=0; /fat 清空char *p=osPoint-dataj-3; /格式化子目录memset(p,0,BlockSize); dir-fcbtemp.initialize();
22、 /回收子目录占据目录项printf( 删除当前目录下的文件夹成功n); return 1; /*- 在当前目录下创建文本文件-*/ int create(char *name) int i,iFAT;/temp, int emptyNum = 0,isFound = 0; /空闲目录项个数struct dirFile *dir; /当前目录的指针if(current=2) dir=&(osPoint-root); else dir=(struct dirFile *)(osPoint-data current-3); for(i=1;ifcbi.type = Zero & isFound =
23、 0) emptyNum = i; isFound = 1; else if(dir-fcbi.type=GENERAL & strcmp(dir-fcbi.fname,name)=0 ) printf( 无法在同一目录下创建同名文件!n); return 0; if(emptyNum = 0) printf( 已经达到目录项容纳上限,无法创建新目录!n); return 0; for(i = 3;iFAT1i=0) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 18
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年2022年简单文件系统的实现实验报告 2022 简单 文件系统 实现 实验 报告
限制150内