模拟文件系统.docx
- 文档编号:2961534
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:16
- 大小:71.14KB
模拟文件系统.docx
《模拟文件系统.docx》由会员分享,可在线阅读,更多相关《模拟文件系统.docx(16页珍藏版)》请在冰豆网上搜索。
模拟文件系统
操作系统课程设计
-模拟文件系统
班级:
计044班姓名:
夏鑫
学号:
2004121228
一.实验目的
用高级语言编写和调试一个简单的文件系统。
模拟文件管理的工作过程。
加深理解文件系统的内部功能和内部实现。
二.基本要求
在任意一个OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟UNIX文件系统。
可以实现下列几条命令
FORMAT初始化
MKF创建文件(给出文件名,文件长度)
MKD创建目录
CD改变当前目录(CD..返回根目录)
DELF删除文件
DELD删除目录
DIR显示文件目录(当前目录下)
HELP获得命令的帮助
EXIT退出系统
三.设计思想说明
1.设计环境
课程设计的环境是windowsxpsp2操作系统。
在windows系统中创建一个较大容量的文件,作为所设计文件系统的假想的“文件卷”,从而编写各程序模块。
2.开发环境
课程设计所使用的开发环境是VC++6.0
3.基本思想
以1M的存储器空间为例作为文件空间,空间“分块”。
超级块,在最前面,共占3.2k个字节。
其中0.2K个字节存放目录节点的位示图,1K个字节存放文件节点的位示图,2k字节存放盘块节点的位示图。
用位状态='0'表示空闲,状态='1'表示已分配。
后半部用于存放目录接点和文件接点。
超级块不参与文件空间的动态分配。
其他块用于存贮目录接点和文件接点的信息。
该程序在系统盘内自动创建一个目录A:
作为该系统的根目录。
四.需求分析
该模拟文件系统包括目录文件(简称目录)、普通文件(简称文件),并实现下面一些基本功能:
1.改变目录:
CD〈目录名〉,工作目录转到指定的目录下。
CD..,返回上一级目录下
2.创建文件:
MKF〈文件名〉,创建一个指定名字的新文件,即在目录中增加一项,不考虑文件的内容。
3.删除文件:
DELF〈文件名〉,删除指定的文件。
4.显示目录:
DIR[〈目录名〉],显示目录下全部文件和第一级子目录,如果没有指定路径名,则显示当前目录下的内容。
5.创建目录:
MKD〈目录名〉,再指定路径下创建指定的目录,或者在没有指定路径时,在当前目录下创建子目录。
6.删除目录:
DELD〈目录名〉,删除指定的目录。
7.获得命令帮助HELP
8.退出文件系统EXIT
要考虑的特殊情况:
1.各个命令对全路径和相对路径的支持
<1>.目录不存在时,给出错误信息
<2>.不能用cd进入文件
<3>.相对路径的解析
<4>.路径中的空格剔除
2.删除目录或文件时的问题
<1>删除不存在的文件或目录,给出错误提示
<2>删除目录时目录不为空;如果该目录为空,则可删除,否则给出是否做删除,删除操作将该目录下的全部文件和子目录都删除
<3>进入到某个目录下,却要删除本目录或者上级目录
3。
创建目录或文件相同的问题
<1>文件或目录已经存在时,给出已经定义信息提示
五.系统设计
1.流程图
输入不是exit的命令
关闭文件系统
当没有用户使用时,输入命令为exit
2.数据结构
<1>目录文件结点信息存储结构:
structdir_node//目录节点
{
SYSTEMTIMEctime;//创建时间
chardir_name[32];//目录名
intchild_dir[8];//子目录索引
intdir_count;//当前子目录数
intchild_file[16];//子文件索引
intfile_count;//当前子文件数
intparent;//父目录索引
}
<2>文件目录存储位置存储结构:
structfile_node//文件节点
{
SYSTEMTIMEctime;//创建时间
charfile_name[32];//文件名
intblock[4];//该文件占有的磁盘块索引
intblock_count;//该文件当前占有的磁盘块数
intfile_length;//文件长度
intparent;//父目录索引
};
<3>文件、目录、盘块的占用的标志位
intdir_flag[DIR_NUM];//各目录节点占用标志,0表示空闲,1表示被占用
intfile_flag[FILE_NUM];//各文件节点的占用标志
intblock_flag[BLOCK_NUM];//磁盘块的占用标志
<4>常驻内存的标志文件(目录)修改的标志位和标志文件(目录)修改标志位的标志位
intdir_change_flag[DIR_NUM];//用于标志目录节点的修改
intfile_change_flag[FILE_NUM];//用于标志文件节点的修改
intdirflag_flag[DIR_NUM];//用于标志dir_flag[DIR_NUM]的修改
intfileflag_flag[FILE_NUM];//用于标志file_flag[FILE_NUM]的修改
intblockflag_flag[BLOCK_NUM];//用于标志block_flag[BLOCK_NUM]的修改
<5>记录当前路径和当前目录的全局变量
intcurr;//当前目录索引
dir_node*curr_dir;//当前目录节点指针
charcurr_path[512];//当前路径
3.主要模块说明
<1>创建文件
intget_file(intparent,char*file_name)
//创建文件节点,成功则返回文件的索引号,失败返回-1
{
intindex;
if(search(parent,file_name,1,index)!
=-1)//搜索在父目录下是否有同名文件存在,有则创建失败
{
printf("Filenamerepeated!
\n");
return-1;
}
for(inti=0;i if(file_flag[i]==0) { strcpy(file[i].file_name,file_name); file[i].block_count=0; if(get_block(i)==-1)//给新创建的文件申请磁盘块,如果失败,创建文件将失败 { printf("Diskvolumnerror! \n"); return-1; } file_flag[i]=1; fileflag_flag[i]++;//登记并给文件节点初始化 file_change_flag[i]++; file[i].file_length=0; file[i].parent=parent; GetLocalTime(&file[i].ctime);//获得当前时间 returni; } return-1; } intcreate_file(intparent,char*file_name)//在指定的目录下创建文件,如果创建成功则返回 {//文件的索引号,否则返回-1 if(dir[parent].file_count==16)//如果父目录已满,则创建失败 { printf("Parentdirectoryisfull! \n"); return-1; } intpos=get_file(parent,file_name);//开始创建文件 if(pos==-1) { printf("Createfileerror! \n"); return-1; } dir_node*p=&dir[parent];//修改父目录的控制信息 inttop=p->file_count; p->child_file[top]=pos; p->file_count++; dir_change_flag[parent]++; returnpos; } intcreate(char*name)//创建文件的主调函数,前提是已经取得要创建文件的索引 {//成功返回文件的索引号,否则返回-1 intparent,p=0; parent=get_parent(name,p); if(parent==-1)//找不到父目录,输入错误,创建失败 { printf("Pathnameerror! \n"); return-1; } returncreate_file(parent,name+p);//开始创建文件 } <2>创建目录 intcreate_dir(intparent,char*dir_name)//在指定的目录下创建目录,如果成功则返回目录 {//的索引号,否则返回-1 if(dir[parent].dir_count==DIR_NUM-1)//如果父目录已满,则创建失败 { printf("Parentdirectoryisfull! \n"); return-1; } intpos=get_dir(parent,dir_name);//开始创建目录 if(pos==-1) { printf("Createdirectoryerror! \n"); return-1; } dir_node*p=&dir[parent];//修改父目录的控制信息 inttop=p->dir_count; p->child_dir[top]=pos; p->dir_count++; dir_change_flag[parent]++; returnpos; } intmd(char*name)//创建目录的主调函数,它的参数只有用户输入 {//如果创建成功,则返回目录的索引号,否则 intparent,p=0;//返回-1 parent=get_parent(name,p); if(parent==-1)//父目录找不到,输入有误,创建失败 { printf("Pathnameerror! \n"); return-1; } returncreate_dir(parent,name+p);//开始创建目录 } <3>删除文件 voiddel_file(intpos)//删除文件,调用该函数的前提是已经取得要删除文件的索引号 { return_block(pos);//释放磁盘块 file_flag[pos]=0; fileflag_flag[pos]++; file_change_flag[pos]=0; } intdel_file(intparent,char*file_name)//在指定的目录下删除文件,删除成功则返回文件的 {//索引号,否则返回-1 intdel_pos,index; if((del_pos=search(parent,file_name,1,index))==-1)//搜索该文件是否存在,不存在则删除失败 {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 文件系统