2022年FAT文件系统操作系统课程设计实验报告 .pdf
《2022年FAT文件系统操作系统课程设计实验报告 .pdf》由会员分享,可在线阅读,更多相关《2022年FAT文件系统操作系统课程设计实验报告 .pdf(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、操作系统课程设计之三设计任务:模拟OS文件系统在任一 OS (Window或者 Dos;也可以是在 Linux 下,但要求能将结果演示给老师看)下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟OS文件系统。1、在现有机器硬盘上开辟10M (共 10000 个盘块 ,每盘块大小为1k)的硬盘空间(生成一个 10M的用户文件 SDisk.dat即可) ,作为设定的硬盘空间。2、编写一管理程序SDisk,对此空间进行管理,以模拟OS文件系统,要求:、盘块大小 1k、空闲盘块的管理:采用位示图法、文件空间管理:采用FAT (文件分配表),每个盘块号占 2 个字节、目录项管理:、每个 目录
2、项占用 32 字节,其中前 8 个字节( 0-7)为文件名,之后跟3 个字节(8-10)的扩展名, 26-27 字节,存放文件的第一个盘块号,最后四个字节(28-31) ,存放文件长度(如果目录项对应的是下一级子目录(文件),其文件长度部分为 0)、目录按文件方式管理,每个目录仅用一个盘块 (即 1k,最多装 32 个目录项)、第 0 个目录项为本目录,即“ . ”,第 0 个字节为“ . ” ,即 0 x2E,第 26-27 字节指明本目录所在盘块。、第 1 个目录项为父目录,即“ . ”,第 0,1 个字节为“ . ”即 0 x2E,0 x2E,第26-27 字节指明父目录所在盘块。、每个
3、目录实际能放下文件或子目录30 项。、文件系统空间分配:、第 0 个盘块( 1k)存放磁盘信息(可以设定为格式说明“FAT32 ” 、盘块大小,盘块数等内容)、第 1 个盘块起,至 125 盘块,共 125 个盘块( 125k)存放 FAT内容、第 126、127(2 个)盘块,存放位示图、从第 128 盘块至 10000 盘块,皆为数据(区)盘块,其逻辑编号从0 开始,至名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 21 页 - - - - - - - - - 987
4、2号数据盘块,即第 0数据盘块为 128号盘块, 第 1数据盘块为 129号盘块, ,、第 0 数据盘块 (即 128号盘块) ,存放 根目录 (同样只用一个盘块作根目录) ,由于第 0、1 目录项为“ . ”(本目录) , “. ”(父目录),因此根目录下同样只能存放 30个文件或目录,并且从第2 个目录项开始。、文件或子目录数据,放在第1 数据盘块及以后的数据盘块中,由用户按需要使用。3、SDisk 管理程序的功能要求如下:、正常情况下,显示等待命令输入符号# 、改变目录命令:#cd 目录名,改变当前工作目录,目录不存在时给出出错信息#cd . ,返回上一级目录,如果是根目录,给出提示信息
5、、生成新目录#md 目录名,创建新目录(需要更改FAT内容和位示图内容)、删除目录#rd 目录名,删除目录,如果目录不存在时给出出错信息(需要更改FAT内容和位示图内容)、显示目录#dir ,显示指定目录下或当前目录下的信息,包括文件名、扩展名、物理地址(文件或目录第一个盘块号) 、文件长度、子目录、创建新文件#CreateFile 文件名 . 扩展名 文件长度, 根据文件名 . 扩展名,创建一个目录项(fcb ) ,根据文件长度和位示图中空闲盘块情况,分配足够多的连续盘块 ,给新文件(需要更改 FAT内容和位示图内容)。、删除文件#DelFile 文件名 . 扩展名,在文件所在的目录项中,将
6、第一个字节变为0 xE5,并同时修改 FAT内容和位示图内容;如果文件不存在,给出出错信息、文件拷贝#CopyFile 老文件 , 新文件,为新文件创建一个目录项, 并将老文件内容复制到新文件中,并同时修改FAT内容和位示图内容、显示位示图内容#ShowBitMP ,将位示图内容(已有信息部分) ,显示在屏幕上(按十六进制)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 21 页 - - - - - - - - - 、显示 FAT内容#ShowFAT ,将 FAT内容(已
7、有信息部分) ,显示在屏幕上(按十六进制)4、程序的总体流程为:、输出提示符 #,等待接受命令,分析键入的命令;、对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令(1、请参考“ 03.FAT32文件系统简介 .doc ”中,有关文件系统的规定; 2 、请参考 WinHex中,目录所显示的信息进行编程)/ 关于 FAT 和 MAP 表的解释/ 用 bitset库,做 MAP 的是否判断,因为作业要求从数据块从128 位开始,所以bitset的前 128 位被置为 -1,同样 FAT表也是,其次, MAP 表和 FAT表同样是用数组方式做保存,这样就略过了是对具体地址的操作,从数
8、组的下标很容易的定位,关于对 FAT表和 MAP 表的用法1. 当要用到数据块是,查询MAP 表(因为只做比较查询即可), 查询到的未用位置置 1,然后在FAT表上进行相应记录,在本程序做出的规定是,当文件夹FAT表做-1,若是文件则按照FAT做对应的顺序记录,最后一块同样是-1 结束,2. 回收的时候,是按照FAT表的首项,做顺序置0,然后 MAP 也在相应位置置0 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 21 页 - - - - - - - - - #incl
9、ude #include #include #include #include /*/ /AUTHOR:CHENLOG /ENVIROMENT:VC2008 WIN7 /DATE:2011-6-5 VERSION 1.0 /*/ usingnamespace std; constint BLOCKNUM_SIZE=2; / 盘块号大小constint BLOCK_SIZE=1024; / 一个盘块大小数constint BLOCK_NUM=10001; / 盘块数量constint DISK_SIZE=1024*1000*10; / 磁盘大小constint LIST_SIZE=32; / 目
10、录项大小constint MAP_SIZE=10001; /MAP 长度constint FATNUM=125; /FAT 的盘块数第块没有用constint FATLIST=512; / 每个盘口 FAT 的记录数constint DATABEG=128; / 数据项开始 FAT 号struct FCB char fname8; / 文件名char exname3; / 扩展名short fnum; / 首块号int length; / 文件大小,目录则文件大小为;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理
11、- - - - - - - 第 4 页,共 21 页 - - - - - - - - - ; struct fatid short idFATNUM*FATLIST; /FAT 大小 512个记录一块*FAT; struct map bitset maplist; *MAP; struct DIR struct FCB listLIST_SIZE+1; *filedir; int currentid=128; / 当前 FAT 号int currentdir=128; / 当前目录块号初始化是+1 由于第个单元没有使用char *file; / 磁盘的首地址char *FilePath=myf
12、at ; /window 文件保存地址FILE *fp; /window 文件地址string CURRENT=root; / 当前路径char cmd30; / 输入指令char command16; /* *对文件存储器进行格式化*创建根目录* */ void findBit(struct map *MAP) void init(struct fatid *FAT) int i,j; for (i=1;iDATABEG) FAT-idi=0; else FAT-idi=-1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - -
13、名师精心整理 - - - - - - - 第 5 页,共 21 页 - - - - - - - - - void format() bool i; FAT=( struct fatid *)(file+BLOCK_SIZE); / 当前 FAT地址 MAP=(struct map *)(file+(FATNUM+1)*BLOCK_SIZE); / 初始化位示图init(FAT); FAT-id0=9872; filedir=(struct DIR *)(file+(FATNUM+1+2)*BLOCK_SIZE); / 当前目录指针地址FAT-id128=-1; FAT-id0=9872-1;
14、strcpy(filedir-list0.fname,. ); strcpy(filedir-list0.exname,dir); filedir-list0.fnum=currentdir; filedir-list0.length=0; strcpy(filedir-list1.fname,.); strcpy(filedir-list1.exname,dir); filedir-list1.fnum=currentdir; filedir-list1.length=0; fp=fopen(FilePath,w+ ); fwrite(file,sizeof ( char ),DISK_SI
15、ZE,fp); fclose(fp); printf(初始化已经完成 , 现在可以进行操作了!nn); /* *创建子目录*/ int mkdir( char *str) int i,j; int blockid; / 将要创建的 FAT 号名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 21 页 - - - - - - - - - int blockdir; / 将要创建的目录块号int listnum; / 目录块内编号struct fatid *flagid; st
16、ruct DIR *dir; / 当前目录指针struct map *MAP; struct fatid *FAT; if (strcmp(str, )=0) printf( 目录名称不能为空n ); return 0; dir=(struct DIR *)(file+(currentdir)*BLOCK_SIZE); MAP=(struct map *)(file+(FATNUM+1)*BLOCK_SIZE); FAT=( struct fatid *)(file+BLOCK_SIZE); for (i=DATABEG+1;imaplisti=0) break ; if (iBLOCK_NU
17、M) printf( 内存不足 n ); return 0; MAP-maplisti=1; /map 置即已用dir=( struct DIR *)(file+(currentdir)*BLOCK_SIZE); for (i=2;ilisti.fname,str)=0) printf(目录下有同名文件夹n ); return 0; for (i=2;ilisti.fname, )=0) / 有空的目录块且无重名,第一版本的时候与上面的循环放在一起,存在一个情况是前面的建立的目录删除后,直接被同名的覆盖了break ; if (iLIST_SIZE) printf( 内存不足 n ); ret
18、urn 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 21 页 - - - - - - - - - flagid=(struct fatid *)(file+BLOCK_SIZE); /fat 首位地址for (j=DATABEG+1;jidj=0) blockdir=j; break ; strcpy(dir-listi.fname,str); dir-listi.fnum=blockdir; strcpy(dir-listi.exname,dir); dir-
19、listi.length=0; dir=( struct DIR *)(file+blockdir*BLOCK_SIZE); / 为新目录项创建根目录strcpy(dir-list0.fname,. ); strcpy(dir-list0.exname,dir); dir-list0.fnum=blockdir; dir-list0.length=0; strcpy(dir-list1.fname,.); strcpy(dir-list1.exname,dir); dir-list1.fnum=currentdir; dir-list1.length=0; flagid-idj=-1; / 修
20、改 FAT 目录尾部FAT-id0=FAT-id0-1; printf( 已经成功创建目录%s n ,str); return 0; /* *显示目录*/ int listshow() int i,sumfile,sumdir,fl100,dr100;/fl 为文件的号数, dr 为目录的号数sumfile=sumdir=0; struct DIR *dir; struct fatid *FAT; dir=( struct DIR *)(file+currentdir*BLOCK_SIZE); for (i=0;ilisti.length=0&(strcmp(dir-listi.fname,
21、)!=0)&(dir-listi.fnum!=0)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 21 页 - - - - - - - - - / 为目录的 drsumdir=i; sumdir+; if (dir-listi.length!=0&strcmp(dir-listi.fname, )!=0) / 为目录的 flsumfile=i; sumfile+; for (i=0;ilistdri.fname); for (i=0;ilistfli.fname,dir-
22、listfli.exname); printf(n ); printf(n 在该目录下共有 %d 个文件 , %d 个文件夹 nn,sumfile,sumdir-2); return 0; /* *删除子目录*/ int rmdir(char *str) int i; int blockid; int flag=0; /FAT 号int blocknum; / 目录块struct fatid *FAT; struct DIR *dir; struct DIR *flagdir; / 标记目录块char c= a; / 做用户交互int m=2; / 从第三个子目录项开始搜索要删除的目录项情况F
23、AT=(struct fatid *)(file+BLOCK_SIZE); dir=( struct DIR *)(file+currentdir*BLOCK_SIZE); / 当前目录指针MAP=( struct map *)(file+(FATNUM+1)*BLOCK_SIZE); for (i=2;ilisti.fname,str)=0) / 找到要删除的子目录名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 21 页 - - - - - - - - - break
24、; if (iLIST_SIZE) printf( 该文件夹下不存在%s,str); return 0; while (1) printf(是否确认?( Y/N) ); cinc; if (c= y|c= Y )|(c=n |c= N ) break; if (c= n |c= N ) return 0; blocknum=dir-listi.fnum; flagdir=(struct DIR *)(file+blocknum*BLOCK_SIZE); while (m!=LIST_SIZE) if (strcmp(flagdir-listm.fname, )!=0) printf(该目录下有
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年FAT文件系统操作系统课程设计实验报告 2022 FAT 文件系统 操作系统 课程设计 实验 报告
限制150内