操作系统课程设计简单文件系统的实现_第1页
操作系统课程设计简单文件系统的实现_第2页
操作系统课程设计简单文件系统的实现_第3页
操作系统课程设计简单文件系统的实现_第4页
操作系统课程设计简单文件系统的实现_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、操作系统课程设计报告小组编号:小组成员:一、课程设计概述:1、题目:简单文件系统的实现2、实现内容(1)在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录 的单用户单任务系统中的文件系统.在退出该文件系统的使用时,应将该虚拟文件系统以一个 Windows文件的方式保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中.(2)文件存储空间的分配可采用显式链接分配或其他的方法.(3)空闲磁盘空间的治理可选择位示图或其他的方法.如果采用位示图来治理文件存储空间, 并采用显式链接分配方式,那么可以将位示图合并到FAT中.(4)文件目录结构采用多级目录结构.为了简单起见,

2、可以不使用索引结点,其中的每个目录 项应包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护.(5)要求提供以下操作命令:my_format:对文件存储器进行格式化,即根据文件系统的结构对虚拟磁盘空间进行布 局,并在其"t创立根目录以及用于治理文件存储空间等的数据结构.my_mkdir:用于创立子目录.my_rmdir:用于删除子目录.my_ls:用于显示目录中的内容.my_cd:用于更改当前目录.my_create:用于创立文件.my_open:用于翻开文件.my_close:用于关闭文件.my_write:用于写文件.my_read:用于读文件.my_rm:

3、用于删除文件.my_exitsys:用于退出文件系统.二、设计思路(主要算法描述、程序流程图等):1.系统主函数main()(1)对应命令:无(2)命令调用格式:无(3)函数设计格式:voidmain()(4)功能:系统主函数(5)输入:无(6)输出:无(7)函数需完成的工作:对前面定义的全局变量进行初始化;调用startsys(进入文件系统;列出文件系统提供的各项功能及命令调用格式;显示命令行提示符,等待用户输入命令;将用户输入的命令保存到一个 buf对buf中的内容进行命令解析,并调用相应的函数执行用户键入的命令;如果命令不是“ my_exitsy§ ,那么命令执行完毕后转.欢迎

4、共阅2.进入文件系统函数startsys()(1)对应命令:无(2)命令调用格式:无(3)函数设计格式:voidstartsys()(4)功能:由main()函数调用,进入并初始化我们所建立的文件系统,以供用户使用.(5)输入:无(6)输出:无.(7)函数需完成的工作:申请虚拟磁盘空间;使用c语言的库函数fopen()JT开myfsys文件:假设文件存在,那么转;假设文件不存在,那么创立之,使用c语言的库函数fread()读入myfsys文件内容到用户空间中的一个缓冲区中,并判断其开始的8个字节内容是否为(文件系统魔数),如果是,那么转;否那么转;将上述缓冲区中的内容复制到内存中的虚拟磁盘空间

5、中;转在屏幕上显示“ myfsys文件系统不存在,现在开始创立文件系统信息,并调用 my_format() 对中申请到的虚拟磁盘空间进行格式化操作.转;将虚拟磁盘中的内容保存到 myfsys文件中;转使用c语言的库函数fclose(因15 myfsys文件;初始化用户翻开文件表,将表项 0分配给根目录文件使用,并填写根目录文件的相关信息,由于根目录没有上级目录,所以表项中的 dirno和diroff分别置为5 (根目录所在起始块号)和 0; 并将ptrcurdir指针指向该用户翻开文件表项.将当前目录设置为根目录.3.磁盘格式化函数my_format()(1)对应命令: my_format(2

6、)命令调用格式: my_format(3)函数设计格式:voidmy_format()(4)功能:对虚拟磁盘进行格去化,布局虚拟磁盘,建立根目录文件(或根目录区).(5)输入:无(6)输出:无.(7)函数需完成的工作:将虚拟磁盘第一个块作为引导块,开始的 8个字节是文件系统的魔数,记为“;在之后写入文件系统的描述信息,如FAT表大小及位置、根目录大小及位置、盘块大小、盘块数量、数据区 开始位置等信息;在引导块后建立两张完全一样的 FAT表,用于记录文件所占据的磁盘块及治理虚拟磁盘块的分配,每个FAT占据两个磁盘块;对于每个FAT中,前面5个块设置为已分配,后面995个块设置 为空闲;在第二张F

7、AT后创立根目录文件root,将数据区的第1块(即虚拟磁盘的第6块)分配给根目 录文件,在该磁盘上创立两个特殊的目录项:.和“.,其内容除了文件名不同之外,其他字 段完全相同.4.更改当前目录函数 my_cd()(1)对应命令:my_cd(2)命令调用格式: my_cddirname(3)函数设计格式:voidmy_cd(char*dirname)(4)功能:改变当前目录到指定的名为 dirname的目录.(5)输入:dirname:新的当前目录的目录名;(6)输出:无欢迎共阅(7)函数需完成的工作:调用my_open()fj开指定目录名的父目录文件,并调用 do_read()读入该父目录文件

8、内容到内存1在父目录文件中检查新的当前目录名是否存在,如果存在那么转,否那么返回,并显示出错信息;调用my_close(大闭中翻开的父目录文件;调用my_close(大闭原当前目录文件;如果新的当前目录文件没有翻开,那么翻开该目录文件;并将ptrcurdir指向该翻开文件表项;设置当前目录为该目录.5.创立子目录函数 my_mkdir()(1)对应命令:my_mkdir(2)命令调用格式: my_mkdirdirname(3)函数设计格式:voidmy_mkdir(char*dirname)(4)功能:在当前目录下创逐名为 dirname的子目录.(5)输入:dirname: 新建目录的目录名

9、.(6)输出:无.(7)函数需完成的工作:调用do_read()读入当前目录文件内容到内存,检查当前目录下新建目录文件是否重名,假设重名 那么返回,并显示错误信息;为新建子目录文件分配一个空闲翻开文件表项,如果没有空闲表项那么返回-1,并显示错误信息;检查FAT是否有空闲的盘块,如有那么为新建目录文件分配一个盘块,否那么释放中分配的翻开文件表项,返回,并显示错误信息;在当前目录中为新建目录文件寻找一个空闲的目录项或为其追加一个新的目录项;需修改当前目录文件的长度信息,并将当前目录文件的用户翻开文件表项中的fcbstate置为1;准备好新建目录文件的FCB的内容,文件的属性为目录文件,以覆盖写方

10、式调用do_write()将其填写到对应的空目录项中;在新建目录文件所分配到的磁盘块中建立两个特殊的目录项“.和“,目录项,方法是:首先在用户空间中准备好内容,然后以截断写或者覆盖写方式调用 do_write()将其写到中分配到的磁 盘块中; 返回.6 .删除子目录函数rmdir()(1)对应命令:my_rmdir(2) 命令调用格式: my_rmdirdirname(1) 函数设计格式:i voidmy_rmdir(char*dirname)(2)功能:在当前目录下删除名为 dirname的子目录.(3)输入:dirname:欲删除目录的目录名.(4)输出:无.(5)函数需完成的工作:调用d

11、o_read()读入当前目录文件内容到内存,检查当前目录下欲删除目录文件是否存在,假设不 存在那么返回,并显示错误信息;检查欲删除目录文件是否为空(除了 “ .和“.外没有其他子目录和文件),可根据其目录项 中记录的文件长度来判断,假设不为空那么返回,并显示错误信息; 检查该目录文件是否已经翻开,假设已翻开那么调用my_close(大闭掉;回收该目录文件所占据的磁盘块,修改 FAT;从当前目录文件中清空该目录文件的目录项,且free字段置为0:以覆盖写方式调用do_write()来实现;欢迎共阅修改当前目录文件的用户翻开表项中的长度信息,并将表项中的fcbstate置为1;返回.7 .显示目录

12、函数 my_ls()(1)对应命令:my_ls(2)命令调用格式:my_ls(3)函数设计格式:voidmy_ls(void)(4)功能:显示当前目录的内容(子目录和文件信息).(5)输入:无(6)输出:无(7)函数需完成的工作:调用do_read()读出当前目录文件内容到内存;将读出的目录文件的信息根据一定的格式显示到屏幕上;返回.8 .创立文件函数my_create()(1) 对应命令: my_create(2)命令调用格式: my_createfilename(3)函数设计格式:intmy_create(char*filename)(4)功能:创立名为filename的新文件.(5)输入

13、:filename:新建文件的文件名,可能包含路径.(6)输出:假设创立成功,返回该文件的文件描述符(文件翻开表中的数组下标);否那么返回-1.(7)函数需完成的工作:为新文件分配一个空闲翻开文件表项,如果没有空闲表项那么返回-1,并显示错误信息;假设新文件的父目录文件还没有翻开, 那么调用my_open(翻开;假设翻开失败,那么释放中为新建文件分配的空闲文件翻开表项,返回-1,并显示错误信息;调用do_read()读出该父目录文件内容到内存,检查该目录下新文件是否重名,假设重名那么释放中分配的翻开文件表项,并调用 my_close(大闭中翻开的目录文件;然后返回-1,并显示错误信检查FAT是

14、否有空闲的盘块,如有那么为新文件分配一个盘块,否那么释放中分配的翻开文件表项,并调用my_close(大闭中翻开的目录文件;返回-1,并显示错误信息;在父目录中为示文件寻找一个空闲的目录项或为其追加一个新的目录项;需修改该目录文件的长度信息,并将该目录文件的用户翻开文件表项中的fcbstate置为1;准备好新文件的FCB的内容,文件的属性为数据文件,长度为0,以覆盖写方式调用do_write() 将其填写到中分配到的空目录项中;1 为新文件填写中分配到的空闲翻开文件表项,fcbstate字段值为0,读写指针值为0;调用my_close(大闭中翻开的父目录文件;将新文件而翻开文件表项序号作为其文

15、件描述符返回.9 .删除文件函数my_rm()(1)对应命令:my_rm(2)命令调用格式: my_rmfilename(3)函数设计格式:voidmy_rm(char*filename)(4)功能:删除名为filename的文件.(5)输入:filename:欲删除文件的文件名,可能还包含路径.(6)输出:无.(7)函数需完成的工作:欢迎共阅假设欲删除文件的父目录文件还没有翻开,那么调用my_open(翻开;假设翻开失败,那么返回,并显示错误信息;调用do_read()读出该父目录文件内容到内存,检查该目录下欲删除文件是否存在,假设不存在那么返回,并显示错误信息;检查该文件是否已经翻开,假设

16、已翻开那么关闭掉;回收该文件所占据的磁盘块,修改 FAT;从文件的父目录文件中清空该文件的目录项,且free字段置为0:以覆盖写方式调用do_write()来实现;修改该父目录文件的用户翻开文件表项中的长度信息,并将该表项中的fcbstate置为1;返回.10 .翻开文件函数 my_open()(1) 对应命令: my_open(2)命令调用格式: my_openfilename(3)函数设计格式:intmy_open(char*filename)(4)功能:翻开当前目录下名为 filename的文件.(5)输入:filename:欲翻开文件的文件名(6)输出:假设翻开成功,返回该文件的描述符

17、(在用户翻开文件表中表项序号);否那么返回-1.(7)函数需完成的工作:检查该文件是否已经翻开,假设已翻开那么返回-1,并显示错误信息;调用do_read()读出父目录文件的内容到内存,检查该目录下欲翻开文件是否存在,假设不存在那么返回-1,扉显示错误信息;检查用户翻开文件表中是否有空表项,假设有那么为欲翻开文件分配一个空表项,假设没有那么返回 -1,并显示错误信息;为该文件填写空白用户翻开文件表表项内容,读写指针置为0;将该文件所分配到的空白用户翻开文件表表项序号(数组下标)作为文件描述符fd返回.11 .关闭文件函数my_close()(1)对应命令: my_close(2)命令调用格式:

18、 my_closefd(3)函数设计格式:voidmy_close(intfd)(4)功能:关闭前面由my_open(翻开的文件描述符为fd的文件.(5)输入:fd:文件描述符.(6)输出:无. ;(7)函数需完成的工作:检查fd的有效性(fd不能超出用户翻开文件表所在数组的最大下标),如果无效那么返回-1;检查用户翻开文件表表项中的fcbstate字段的值,如果为1那么需要将该文件的FCB的内容保存 到虚拟磁盘上该文件的目录项中,方法是:翻开该文件的父目录文件,以覆盖写方式调用do_write() 将欲关闭文件的FCB写入父目录文件的相应盘块中;回收该文件占据的用户翻开文件表表项(进行清空操

19、作),并将topenfile字段置为0;返回.12 .写文件函数 my_write()(1)对应命令:my_write(2)命令调用格式: my_writefd(3)函数设计格式:intmy_write(intfd)(4)功能:将用户通过键盘输入的内容写到fd所指定的文件中.磁盘文件的读写操作都必须以完 整的数据块为单位进行,在写操作时,先将数据写在缓冲区中,缓冲区的大小与磁盘块的大小相欢迎共阅同,然后再将缓冲区中的数据一次性写到磁盘块中;读出时先将一个磁盘块中的内容读到缓冲区 中,然后再传送到用户区.本实例为了简便起见,没有设置缓冲区治理,只是在读写文件时由用 户使用malloc()申请一块

20、空间作为缓冲区,读写操作结束后使用 free()释放掉.写操作常有三种方式:截断写、覆盖写和追加写.截断写是放弃原来文件的内容,重新写文件;覆盖写是修改文件在当前读写指针所指的位置开始的局部内容;追加写是在原文件的最后添加新 的内容.在本实例中,输入写文件命令后,系统会出现提示让用户选择其中的一种写方式,并将 随后键盘输入的内容根据所选的方式写到文件中,键盘输入内容通过CTR+Z键(或其他设定的键)结束.(5)输入:fd: open()函数的返回值,文件的描述符;(6)输出:实际写入的字节数.(7)函数需完成的工作:检查fd的有效性(fd不能超出用户翻开文件表所在数组的最大下标),如果无效那么

21、返回-1,并显示出错信息;提示并等待用户输入写方式:(1:截断写;2:覆盖写;3:追加写)如果用户要求的写方式是截断写,那么释放文件除第一块外的其他磁盘空间内容(查找并修改FAT 表),将内存用户翻开文件表项中文件长度修改为0,将读写指针置为0并转;如果用户要求的写方式是追加写,那么修改文件的当前读写指针位置到文件的末尾,并转;如果写方式是覆盖写, 那么直接转;提示用户:整个输入内容通过CTR+Z键(或其他设定的键)结束;用户可分屡次输入写入内容, 每次用回车结束;等待用户从键盘输入文件内容,并将用户的本次输入内容保存到一临时变量text口中,要求每次输入以回车结束,全部结束用 CTR+Z键(

22、或其他设定的键);调用do_write()函数将通过键盘键入的内容写到文件中.如果do_write()函数的返回值为非负值,那么将实际写入字节数增加do_write()函数返回值,否那么显示出错信息,并转;如果text口中最后一个字符不是结束字符 CTR+Z ,那么转继续进行写操作;否那么转;如果当前读写指针位置大于用户翻开文件表项中的文件长度,那么修改翻开文件表项中的文件长度信息,并将fcbstate置1 ;返回实际写入的字节数.13 .实际写文件函数 do_write()(1)对应命令:无(2)命令调用格式:无(3)函数设计格式:i intmy_write(intfd , char*tex

23、t, intlen, charwstyle)(4)功能:被写文件函数 my_write()调用,用来将键盘输入的内容写到相应的文件中去.(5)输入:fd: open()函数的返回值,文件的描述符;text:指向要写入的内容的指针;len:本次要求写入字节数wstyle:写方式(6)输出:实际写入的字节数.(7)函数需完成的工作:用malloc()申请1024B的内存空间作为读写磁盘的缓冲区 buf,申请失败那么返回-1,并显示出错 信息;将读写指针转化为逻辑块块号和块内偏移off,并利用翻开文件表表项中的首块号及FAT表的相关内容将逻辑块块号转换成对应的磁盘块块号blkno;如果找不到对应的磁

24、盘块,那么需要检索欢迎共阅FAT为该逻辑块分配一新的磁盘块,并将对应的磁盘块块号blkno登记到FAT中,假设分配失败,那么返回-1,并显示出错信息;如果是覆盖写,或者如果当前读写指针所对应的块内偏移off不等于0,那么将块号为blkno的虚拟磁盘块全部1024B的内容读到缓冲区buf中;否那么使用ASCII码0清空buf;将text中未写入的内容暂存到缓冲区 buff的第off字节开始的位置,直到缓冲区满,或者接收 到结束字符CTR+Z为止;将本次写入字节数记录到 tmplen中;将buf中1024B的内容写入到块号为blkno的虚拟磁盘块中;将当前读写指针修改为原来的值加上 tmplen;

25、并将本次实际写入的字节数增加 tmplen;如果tmplen小于len,那么转继续写入;否那么转;返回本次实际写入的字节数.14 .读文件函数my_read()(1)对应命令: my_read(2)命令调用格式: my_readfdlen(3)函数设计格式:intmyread(intfd,intlen)(4)功能:读出指定文件中从读写指针开始的长度为len的内容到用户空间中.(5)输入:fd: open()函数的返回值,文件的描述符;len:要从文件中读出的字节数.(6)输出:实际读出的字节数.(7)函数需完成的工作:定义一个字符型数组textlen,用来接收用户从文件中读出的文件内容;检查f

26、d的有效性(fd不能超出用户翻开文件表所在数组的最大下标),如果无效那么返回-1,并显示出错信息;调用do_read()将指定文件中的len字节内容读出到text口中;如果do_read()的返回值为负,那么显示出错信息;否那么将 text口中的内容显示到屏幕上;返回.15 .实际读文件函数do_read()(1)对应命令:无(2)命令调用格式:无(3)函数设计格式:intdo_read(intfd,intlen,char*text)(4)功能:被my_read()调用,读出指定文件中从读写指针开始的长度为len的内容到用户空间的text中.(5)输入:fd: open()函数的返回值,文件的

27、描述符;len:要求从文件中读出的字节数.text:指向存放读出数据的用户区地址(6)输出:实际读出的字节数.(7)函数需完成的工作:使用malloc()申请1024B空间作为缓冲区buf,申请失败那么返回-1,并显示出错信息;将读写指针转化为逻辑块块号及块内偏移量off,利用翻开文件表表项中的首块号查找FAT表,找到该逻辑块所在的磁盘块块号;将该磁盘块块号转化为虚拟磁盘上的内存位置;将该内存位置开始的1024B (一个磁盘块)内容读入 buf中;比较buf中从偏移量off开始的剩余字节数是否大于等于应读写的字节数 len,如果是,那么将从 off开始的buf中的len长度的内容读入到text

28、口中;否那么,将从off开始的buf中的剩余内容读入 至 ij text口中;将读写指针增加中已读字节数,将应读写的字节数len减去中已读字节数,假设len大于0,那么转;否那么转;欢迎共阅使用free()释放中申请的buf返回实际读出的字节数.16 .退出文件系统函数my_exitsys()(1)对应命令: my_exitsys(2)命令调用格式: my_exitsys(1)函数设计格式:voidmy_exitsys()(2)功能:退出文件系统.一(3)输入:无(4)输出:无.(5)函数需完成的工作:使用C库函数fopen()f丁开磁盘上的myfsys文件;将虚拟磁盘空间中的所有内容保存到磁

29、盘上的myfsys文件中;使用c语言的库函数fclose(内5 myfsys文件;撤销用户翻开文件表,释放其内存空间释放虚拟磁盘空间.流程图程序启动加载文件系统my exitsys是一/文件系X-否统是否 -等待用户命令输入创立文件系统,并格式化my_ls my creat my_rm | myooen =三、程序实现代码: «入命令 )#include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#defineBLOCKSIZE1024 磁盘块大小#defin

30、eSIZE1024000虚拟磁盘空间大小#defineEND65535/FAT中的文件结束标志# defineFREE0FA1中盘块空闲标志# defineROOTBLOCKNUM2根目录区所占盘块数# defineMAXOPENFILE10最多同时翻开文件个数 t #defineMAXTEXT10000/*文件限制块*/typedefstructFCBcharfilename8;/Dt 件名charexname3;/收件扩展名unsignedcharattribute;/以件属性字段,值为0时表示目录文件,值为1时表示数据文件unsignedshorttime;欣件仓1J建时间unsigne

31、dshortdate浓件创立 日 期unsignedshortfirst;欣件起始盘块号unsignedlonglength;放件长度charfree;表示目录项是否为空,假设值为 0,表示空,值为1,表示已分配欢迎共阅fcb;/*文件分配表*/typedefstructFAT(unsignedshortid;假盘块的状态(空闲的,最后的,下一个)fat;/*用户翻开文件表*/typedefstructUSEROPEN(charfilename8;/Dt 件名charexname3;/收件扩展名unsignedcharattribute;/以件属性字段,值为0时表示目录文件,值为1时表示数据文

32、件unsignedshorttime;/件仓1J 建时间unsignedshortdate;/t 件创立 日 期unsignedshortfirst;欣件起始盘块号unsignedlonglength;放件长度(对数据文件是字节数,对目录文件可以是目录项个数)charfree;/表示目录项是否为空,假设值为 0,表示空,值为1,表示已分配unsignedshortdirno;/1应翻开文件的目录项在父目录文件中的盘块号intdiroff;/相应翻开文件的目录项在父目录文件的dirno盘块中的目录项序号chardir80;/相应翻开文件所在的路径名,这样方便快速检查出指定文件是否已经翻开intf

33、ather;/父目录在翻开文件表项的位置intcount;/读写指针在文件中的位置,文件的总字符数charfcbstate;/是否修改了文件的FCB的内容,如果修改了置为1,否那么为0chartopenfile;/俵示该用户翻开表项是否为空,假设值为 0,表示为空,否那么表示已被某翻开文件占 据useropen;/*引导其*/typedefstructBLOCK0(charmagic10;/仪件系统魔数charinformation200;/存储一些描述信息,如磁盘块大小、磁盘块数量、最多翻开文件数等unsignedshortroot潸艮目录文件的起始盘块号unsignedchar*start

34、block;/虚拟磁盘上数据区开始位置block0;unsignedchar*myvhard;/件旨向虚拟磁盘的起始地址useropenopenfilelistMAXOPENFILE;/ 用户翻开文件表数组intcurdir;用户翻开文件表中的当前目录所在翻开文件表项的位置charcurrentdir80;/记录当前目录的目录名(包括目录的路径)unsignedchar*startp;/妃录虚拟磁盘上数据区开始位置charmyfilename口uUmyAlesys"/文件系统的文件名voidstartsys();/进入文件系统voidmy_format();/ 磁盘格式化voidmy

35、_cd(char*dirname);/更改当前 目 录voidmy_mkdir(char*dirname);/ 仓建子 目 录voidmy_rmdir(char*dirname);/ 删除子 目录voidmy_ls();/显示目录voidmy_create(char*filename);/创立文件欢迎共阅voidmy_rm(char*filename);删除文件 intmy_open(char*filename);/打 开文件 intmy_close(intfd);/厌闭文件 intmy_write(intfd);/ 写文件 intdo_write(intfd,char*text,intlen

36、,charwstyle);/实际写文件 intmy_read(intfd,intlen);/ 读文件 intdo_read(intfd,intlen,char*text);/实际读文件 voidmy_exitsys();/退出文件系统 unsignedshortfindblock();/&找空闲盘块 intfindopenfile();/寻找空闲文件表项 voidstartsys()FILE*fp;unsignedcharbufSIZE;fcb*root; inti;myvhard=(unsignedchar*)malloc(SIZE);/ 申请虚拟磁盘空间 memset(myvhar

37、d,0,SIZE);/将 myvhard 中前 SIZE 个字节用 0 替换并返回 myvhard if(fp=fopen(myfilename,"r")!=NULL) fread(buf,SIZE,1,fp);/将二进制文件读取到缓冲区_ 二,fclose(fp); printf("myfilesysisnotexist,begintocreatthefile.n"); my_format(); else for(i=0;i<SIZE;i+) myvhardi=bufi; else printf("myfilesysisnotexist

38、,begintocreatthefile.n"); my_format(); 一 root=(fcb*)(myvhard+5*BLOCKSIZE); strcpy(openfilelist0.filename,root->filename); strcpy(openfilelist0.exname,root->exname); openfilelist0.attribute=root->attribute; openfilelist0.time=root->time; openfilelist0.date=root->date; openfilelist

39、0.first=root->first; openfilelist0.length=root->length; openfilelist0.free=root->free; openfilelist0.dirno=5;欢迎共阅openfilelist0.diroff=0;strcpy(openfilelist0.dir,"root");openfilelist0.father=0;openfilelist0.count=0;openfilelist0.fcbstate=0;openfilelist0.topenfile=1;for(i=1;i<MAX

40、OPENFILE;i+)openfilelisti.topenfile=0;curdir=0;strcpy(currentdir,"root");startp=(block0*)myvhard)->startblock;voidmy_format()FILE*fp;fat*fat1,*fat2;block0*blk0;time_tnow;structtm*nowtime;fcb*root;inti;blk0=(block0*)myvhard;fat1=(fat*)(myvhard+BLOCKSIZE);fat2=(fat*)(myvhard+3*BLOCKSIZE);

41、root=(fcb*)(myvhard+5*BLOCKSIZE);strcpy(blk0->information,"MyFileSystemVer1.0nBlocksize=1KBWholesize=1000KBBlocknum=10 00RootBlocknum=2n");blk0->root=5;blk0->startblock=(unsignedchar*)root;for(i=0;i<5;i+)fat1->id=END;fat2->id=END;一.ifat1+;fat2+;fat1->id=6;fat2->id=6

42、;fat1+;fat2+;fat1->id=END;fat2->id=END;fat1+;fat2+;for(i=7;i<SIZE/BLOCKSIZE;i+)fat1->id=FREE;欢迎共阅fat2->id=FREE;fat1+;fat2+;now=time(NULL);nowtime=localtime(&now);strcpy(root->filename,".");strcpy(root->exname,"");root->attribute=0x28;root->time=nowt

43、ime->tm_hour*2048+nowtime->tm_min*32+nowtime->tm_sec/2;root->date=(nowtime->tm_year-80)*512+(nowtime->tm_mon+1)*32+nowtime->tm_mday;root->first=5;root->length=2*sizeof(fcb);root->free=1; I zroot+;now=time(NULL);nowtime=localtime(&now);strcpy(root->filename,"

44、.");strcpy(root->exname,"");root->attribute=0x28;root->time=nowtime->tm_hour*2048+nowtime->tm_min*32+nowtime->tm_sec/2;root->date=(nowtime->tm_year-80)*512+(nowtime->tm_mon+1)*32+nowtime->tm_mday;root->first=5;root->length=2*sizeof(fcb);root->fre

45、e=1;fp=fopen(myfilename,"w");fwrite(myvhard,SIZE,1,fp);fclose(fp);voidmy_cd(char*dirname)char*dir;intfd;dir=strtok(dirname,"");/分解字符串为一组字符串.dirname为要分解的字符串,""为分隔符字符串if(strcmp(dir,".")=0)return;elseif(strcmp(dir,".")=0)if(curdir)curdir=my_close(curdir

46、);return;elseif(strcmp(dir,"root")=0)while(curdir)curdir=my_close(curdir);欢迎共阅dir=strtok(NULL,"");while(dir)(fd=my_open(dir);if(fd!=-1)curdir=fd;elsereturn;dir=strtok(NULL,"");voidmy_mkdir(char*dirname)(fcb*fcbptr;fat*fat1,*fat2;time_tnow;structtm*nowtime;chartextMAXTEX

47、T;unsignedshortblkno;intrbn,fd,i;fat1=(fat*)(myvhard+BLOCKSIZE);fat2=(fat*)(myvhard+3*BLOCKSIZE);openfilelistcurdir.count=0;rbn=do_read(curdir,openfilelistcurdir.length,text);fcbptr=(fcb*)text;for(i=0;i<rbn/sizeof(fcb);i+)在当前目录下找,是否有重名目录if(strcmp(fcbptr->filename,dirname)=0&&strcmp(fcb

48、ptr->exname,"")=0)(printf("Error,thedirnameisalreadyexist!n");return;fcbptr+;fcbptr=(fcb*)text;for(i=0;i<rbn/sizeof(fcb);i+)(if(fcbptr->free=0)break;fcbptr+;blkno=findblock();/寻找空闲盘块if(blkno=-1)return;(fat1+blkno)->id=END;(fat2+blkno)->id=END;欢迎共阅now=time(NULL);now

49、time=localtime(&now);strcpy(fcbptr->filename,dirname);strcpy(fcbptr->exname,"");fcbptr->attribute=0x30;fcbptr->time=nowtime->tm_hour*2048+nowtime->tm_min*32+nowtime->tm_sec/2;fcbptr->date=(nowtime->tm_year-80)*512+(nowtime->tm_mon+1)*32+nowtime->tm_mday

50、;fcbptr->first=blkno;fcbptr->length=2*sizeof(fcb);fcbptr->free=1;openfilelistcurdir.count=i*sizeof(fcb);/巴当前目录的文件读写指针定位到文件末尾do_write(curdir,(char*)fcbptr,sizeof(fcb),2);从指针 fcbptr 开始写一个 fcb 大小的内容到当前目录fd=my_open(dirname);返回新建立的目录文件在用户翻开文件数组的下标if(fd=-1)return;fcbptr=(fcb*)malloc(sizeof(fcb);魁

51、立新目录的'.','.'目录now=time(NULL);nowtime=localtime(&now);strcpy(fcbptr->filename,".");strcpy(fcbptr->exname,"");fcbptr->attribute=0x28;fcbptr->time=nowtime->tm_hour*2048+nowtime->tm_min*32+nowtime->tm_sec/2;fcbptr->date=(nowtime->tm_year

52、-80)*512+(nowtime->tm_mon+1)*32+nowtime->tm_mday;fcbptr->first=blkno;fcbptr->length=2*sizeof(fcb);fcbptr->free=1;do_write(fd,(char*)fcbptr,sizeof(fcb),2);now=time(NULL);nowtime=localtime(&now);strcpy(fcbptr->filename,".");strcpy(fcbptr->exname,"");fcbptr-

53、>attribute=0x28;fcbptr->time=nowtime->tm_hour*2048+nowtime->tm_min*32+nowtime->tm_sec/2;fcbptr->date=(nowtime->tm_year-80)*512+(nowtime->tm_mon+1)*32+nowtime->tm_mday;fcbptr->first=blkno;fcbptr->length=2*sizeof(fcb);fcbptr->free=1;do_write(fd,(char*)fcbptr,sizeof(

54、fcb),2);free(fcbptr);my_close(fd);fcbptr=(fcb*)text;fcbptr->length=openfilelistcurdir.length;openfilelistcurdir.count=0;do_write(curdir,(char*)fcbptr,sizeof(fcb),2);更新当前目录文件的内容openfilelistcurdir.fcbstate=1;欢迎共阅voidmy_rmdir(char*dirname)( 一fcb*fcbptr,*fcbptr2;fat*fat1,*fat2,*fatptr1,*fatptr2;chart

55、extMAXTEXT,text2MAXTEXT;unsignedshortblkno;intrbn,rbn2,fd,i,j;fat1=(fat*)(myvhard+BLOCKSIZE);fat2=(fat*)(myvhard+3*BLOCKSIZE);if(strcmp(dirname,".")=0|strcmp(dirname,".")=0)(printf("Error,can'tremovethisdirectory.n");return; I Xopenfilelistcurdir.count=0;rbn=do_read

56、(curdir,openfilelistcurdir.length,text);fcbptr=(fcb*)text;for(i=0;i<rbn/sizeof(fcb);i+)/查找要删除的目录(if(strcmp(fcbptr->filename,dirname)=0&&strcmp(fcbptr->exname,"")=0)break;fcbptr+;if(i=rbn/sizeof(fcb)(printf("Error,thedirectoryisnotexist.n");return;fd=my_open(dirna

57、me);目录在当前翻开文件数组中的下标rbn2=do_read(fd,openfilelistfd.length,text2);做取要删除的目录的内容fcbptr2=(fcb*)text2;for(j=0;j<rbn2/sizeof(fcb);j+)/判断要删除目录是否为空(if(strcmp(fcbptr2->filename,".")&&strcmp(fcbptr2->filename,".")&&strcmp(fcbptr2->filename,")(my_close(fd);printf("Error,thedirectoryisnotempty.n");return;fcbptr2+;blkno=openfilelistfd.first;while(blkno!=END)修改要删除目录在fat中所占用的目录项的属性(fatptr1=fat1+blkno;fatptr2=fa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论