操作系统课程设计文件系统管理学院计算机学院专业计算机科学与技术班级姓名学号2013年1月8日广东工业大学计算机学院制评定等级文件系统管理一、实验目的模拟文件系统的实现的基本功能,了解文件系统的基本结构和文件系统的管理方法看,加深了解文件系统的内部功能的实现。通过高级语言编写和实现一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作系统命令的实质内容和执行过程有比较深入的了解。二、实验内容和要求编程模拟一个简单的文件系统,实现文件系统的管理和控制功能。在用户程序中通过使用文件系统提供的create,open,read,write,close,delete等文件命令,对文件进行操作。以下报告主要包括:1.可行性分析2.需求分析3.概要设计4.详细设计5.测试6.总结三、可行性分析1、技术可行性对于图形编程还不了解,但是经过本学期的三次实验的练习,可以设计好命令操作界面。利用大二期间学习的数据结构可以模拟出此课程设计的要求。2、经济可行性课程设计作为本课程的练习及进一步加深理解。与经济无关,可以不考虑。(零花费,零收益)3.法律可行性自己编写的程序,仅为练习,不作其他用途,与外界没什么联系,可行。四、需求分析编写程序实现文件系统,主要有以下几点要求:1、实现无穷级目录管理及文件管理基本操作2、实现共享“别名”3、加快了文件检索五、概要设计为了克服单级目录所存在的缺点,可以为每一位用户建立一个单独的用户文件目录UFD(UserFileDirectory)。这些文件目录可以具有相似的结构,它由用户所有文件的文件控制块组成。此外,在系统中再建立一个主文件目录MFD(MasterFileDirectory);在主文件目录中,每个用户目录文件都占有一个目录项,其目录项中包括用户名和指向该用户目录的指针。本设计主要实现下面几个数据结构:MDF用户名文件目录指针用户名文件目录指针UFD文件名保护码文件长度文件名···AFD打开文件名打开保护码读写指针总体的流程图如下:六、详细设计主要数据结构:1.MFD(MasterFileDirectory),主要用以存放用户,可以增加存放密码的字符数组,本设计没有保密安全方面的忧虑,为了使用时操作更简单省去密码。所以,MFD结构仅包括用户名和指向子目录的一个指针,以及指向下一用户的连接点,为线性结构。structMFD{charname[20];//用户名UFD*bst_pointer;//文件目录指针MFD*link;};2.UFD(UserFileDirectory),用于存放文件的数据结构。由于本设计为了加快检索速度,使用了二叉排序树的结构,所以UFD结构中相应加入了用于树结构的parent,leftchild,和rightchild记录链接情况。当本文件为普通文件时,为下级记录申请AFD(file),folder为空。同样,当本文件为文件夹时,为它申请相应的空间,AFD为空。以此来达到无穷级别目录的存储。structUFD{UFD*parent;UFD*leftchild;UFD*rightchild;UFD*folder;//作为文件夹时指向下一层,文件时为空UFD*pre_folder;//指向上一层目录(文件夹时用到)AFD*file;//作文文件时文件的具体内容charname[30];//文件(夹)名字intlength;//作为文件时文件的长度,默认为0charrw;//读写标志rorwcharshare;//共享标志yorncharfile_folder;//指示此文件是文件或文件夹,f为文件,o为文件夹};3.AFD,存放文件的内容的结构,比较简单,文件内容用一个字符数组存储,为顺序结构,最多可存放99个字符structAFD{charafd_file[100];intread;//读指针intwrite;//写指针};4.RECstructREC//UFD的线性链,用于记录共享文件和已打开文件{UFD*file;REC*link;};关键函数说明:voidLog_in();//登陆voidInit_user();//创建用户voidCheck_user();//查看用户以上三个函数为开始时管理用户创建和登陆的函数。开始时没有用户,需要创建后才可登陆。创建用户即自动分配一个存放用户文件的UFD,此时的UFD为空,需要后续的创建文件以及文件夹的分配。UFD*operations(UFD*fileBST);//文件夹的操作调用用户登陆后即开始对该用户文件UFD的操作,同时,若在文件夹中创建一个文件夹,它同样可以分配得到一个UFD,对用户文件的操作可以重复调用,以此来达到无穷级目录的操作。在里层文件的操作和外层的是一样的,但若要退回外层文件夹就需要逐层返回,不能立即跳到某一层某地址。操作完毕后返回改变后的文件存储状态。voidfcreate(UFD*fileBST);//对文件夹的六个基本操作UFD*fdelete(UFD*fileBST);voidfopen(UFD*fileBST);voidfclose(UFD*fileBST);voidfread_write(UFD*fileBST,charf);//读写操作。按选择f=5为读6为写以上五个函数为对文件的六个基本操作,其中读文件和写文件部分代码相同,所以由一个函数完成。在create五个函数中,分别对文件夹fileBST做了相应的处理,由于删除文件的函数可能会删除到头结点,所以需要一个返回值。voidinsertBST(UFD*fileBST,UFD*newBST);//在fileBST中插入新的结点newBSTUFD*searchBST(UFD*fileBST,charname);//在fileBST树中查找名字为name的结//点并返回该结点,文件不存在则返回空voidBSTtraverse(UFD*fileBST);//遍历二叉树UFD*deleteBST(UFD*fileBST,charname[30]);//删除name结点,返回删除后的结点由于该设计的存储结构用到了二叉排序树,所以把相关的操作写成函数,供基本操作的函数调用。insert函数在fileBST中插入新的结点newBST;search函数在fileBST树中查找名字为name的结点并返回该结点,文件不存在则返回空;还有traverse和delete函数对二叉排序树做了基本的操作。voidprint_path(UFD*fileBST);//输出当前路径voidprint_open_file();//输出已打开的文件为了在文件系统中使用户看出路径及一些相关的状态,设置了输出文件路径的函数,路径由每个文件的结构体中pre_folder记录上一层的文件夹名字,这样逐层输出即可达到目的。每执行一次操作就输出一次已打开的文件的具体情况,打开的文件应及时关闭,否则删除时会有删除失败提示。UFD*check_share(charname[30]);//在共享链中检查是否有name文件,有则//返回该UFD,没则NULLvoiddel_in_share(UFD*node);//在共享链中删除node结点以上两个函数为对共享文件的处理函数,当打开或读写文件时在本层文件中未找到相应的文件时,就用check_share函数在共享文件中查找,如果存在就返回该文件的UFD,不存在就返回NULL,而del_in_share函数是伴随着删除文件的函数出现的,目的是为了删除文件以后不会在共享链中再存在。具体代码如下:filesysterm.hstructAFD{charafd_file[100];intread;//读指针intwrite;//写指针};structUFD{UFD*parent;UFD*leftchild;UFD*rightchild;UFD*folder;//作为文件夹时指向下一层,文件时为空UFD*pre_folder;//指向上一层目录(文件夹时用到)AFD*file;//作文文件时文件的具体内容charname[30];//文件(夹)名字intlength;//作为文件时文件的长度,默认为0charrw;//读写标志rorwcharshare;//共享标志yorncharfile_folder;//指示此文件是文件或文件夹,f为文件,o为文件夹};structMFD{charname[20];//用户名UFD*bst_pointer;//文件目录指针MFD*link;};structREC//UFD的线性链,用于记录共享文件和已打开文件{UFD*file;REC*link;};voidLog_in();//登陆voidInit_user();//创建用户voidCheck_user();//查看用户UFD*operations(UFD*fileBST);//文件夹的操作调用,user不为空时为第一层voidfcreate(UFD*fileBST);//对文件夹的六个基本操作UFD*fdelete(UFD*fileBST);voidfopen(UFD*fileBST);voidfclose(UFD*fileBST);voidfread_write(UFD*fileBST,charf);//代码有重复,合并读写操作。按选择s=5为读6为写voidinsertBST(UFD*fileBST,UFD*newBST);//新文件插入到user文件树中UFD*searchBST(UFD*fileBST,charname);//在fileBST树中查找名字为name的结点并返回该结点//文件不存在则返回空voidBSTtraverse(UFD*fileBST);//遍历二叉树UFD*deleteBST(UFD*fileBST,charname[30]);//删除成功返回1,失败返回0voidprint_path(UFD*fileBST);//输出当前路径voidprint_open_file();//输出已打开的文件UFD*check_share(charname[30]);//在共享链中检查是否有name文件,有则返回UFD,没则NULLvoiddel_in_share(UFD*node);//在共享链中删除node结点main.cpp#includeiostream#includeconio.h#includefilesystem.hMFD*mfd_link=NULL;//用户链表MFD*pre_user;//当前操作用户UFD*pre_opera_folder=NULL;//当前操作文件夹intfolder_depth=0;//记录当前文件深度(用于辅助pre_folder的初始化)REC*share_file=NULL;REC*open_file=NULL;voidprint_path(UFD*fileBST)//输出路径{if(fileBST-pre_folder!=NULL){print_path(fileBST-pre_folder);printf(/%s,fileBST-pre_folder-name);}elseprintf(/%s,pre_user-name);}voidprint_open_file(){REC*temp;inti=5;temp=open_file;while(temp!=NULL){printf(%s\t%d\t\t,temp-file-name,temp-file-length);if(temp-file-rw=='r')printf(只读\t);elseprintf(可读写\t);if(temp-file-share=='y')printf(是\t);elseprintf(否\t);for(i=0;i5;i++){if(temp-file-file-afd_file[i]!='\0')printf(%c,temp-file-file-afd_file[i]);elseb