操作系统课程设计模拟文件系统Word格式文档下载.docx
- 文档编号:18318799
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:19
- 大小:69.74KB
操作系统课程设计模拟文件系统Word格式文档下载.docx
《操作系统课程设计模拟文件系统Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计模拟文件系统Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
1'
表示已分配。
后半部用于存放目录接点和文件接点。
超级块不参与文件空间的动态分配。
其他块用于存贮目录接点和文件接点的信息。
四.需求分析
该模拟文件系统包括目录文件(简称目录)、普通文件(简称文件),并实现下面一些基本功能:
1.改变目录:
CD〈目录名〉,工作目录转到指定的目录下。
2.创建文件:
CREATE〈文件名〉,创建一个指定名字的新文件,即在目录中增加一项,不考虑文件的内容。
3.删除文件:
DELF〈文件名〉,删除指定的文件。
4.显示目录:
DIR[〈目录名〉],显示目录下全部文件和第一级子目录,如果没有指定路径名,则显示当前目录下的内容。
5.创建目录:
MD〈目录名〉,再指定路径下创建指定的目录,或者在没有指定路径时,在当前目录下创建子目录。
6.删除目录:
DELD〈目录名〉,删除指定的目录。
7.保存文件SAVEF〈目录名〉保存指定文件
8.保存目录SAVED〈文件名〉,保存指定目录
9.获得命令帮助HELP
10.退出文件系统EXIT
要考虑的特殊情况:
1.各个命令对全路径和相对路径的支持
<
1>
.目录不存在时,给出错误信息
2>
.不能用cd进入文件
3>
.相对路径的解析
4>
.路径中的空格剔除
2.新建目录或文件时的问题
<
重名问题;
目录或文件的名字长度限制;
<
目录或文件的名字中包含不合法字符(注意空格)
3.删除目录或文件时的问题
删除不存在的文件或目录,给出错误提示
删除目录时目录不为空;
如果该目录为空,则可删除,否则给出是否做删除,删除操作将该目录下的全部文件和子目录都删除
进入到某个目录下,却要删除本目录或者上级目录
4.保存目录和文件时的问题
保存不存在的文件和目录,给出错误的提示
保存目录时,应当保存其下的的子目录和文件
五.系统设计
1.
流程图
2.数据结构
目录文件结点信息存储结构:
structdir_node//目录节点
{
SYSTEMTIMEctime;
//创建时间
chardir_name[32];
//目录名
intchild_dir[8];
//子目录索引
intdir_count;
//当前子目录数
intchild_file[16];
//子文件索引
intfile_count;
//当前子文件数
intparent;
//父目录索引
}
文件目录存储位置存储结构:
structfile_node//文件节点
charfile_name[32];
//文件名
intblock[4];
//该文件占有的磁盘块索引
intblock_count;
//该文件当前占有的磁盘块数
intfile_length;
//文件长度
};
文件、目录、盘块的占用的标志位
intdir_flag[DIR_NUM];
//各目录节点占用标志,0表示空闲,1表示被占用
intfile_flag[FILE_NUM];
//各文件节点的占用标志
intblock_flag[BLOCK_NUM];
//磁盘块的占用标志
常驻内存的标志文件(目录)修改的标志位和标志文件(目录)修改标志位的标志位
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.主要模块说明
创建文件
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<
FILE_NUM;
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!
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)//如果父目录已满,则创建失败
Parentdirectoryisfull!
}
intpos=get_file(parent,file_name);
//开始创建文件
if(pos==-1)
Createfileerror!
dir_node*p=&
dir[parent];
//修改父目录的控制信息
inttop=p->
file_count;
p->
child_file[top]=pos;
file_count++;
dir_change_flag[parent]++;
returnpos;
intcreate(char*name)//创建文件的主调函数,前提是已经取得要创建文件的索引
{//成功返回文件的索引号,否则返回-1
intparent,p=0;
parent=get_parent(name,p);
if(parent==-1)//找不到父目录,输入错误,创建失败
Pathnameerror!
returncreate_file(parent,name+p);
创建目录
intcreate_dir(intparent,char*dir_name)//在指定的目录下创建目录,如果成功则返回目录
{//的索引号,否则返回-1
if(dir[parent].dir_count==8)//如果父目录已满,则创建失败
intpos=get_dir(parent,dir_name);
//开始创建目录
Createdirectoryerror!
dir_node*p=&
dir_count;
child_dir[top]=pos;
dir_count++;
intmd(char*name)//创建目录的主调函数,它的参数只有用户输入
{//如果创建成功,则返回目录的索引号,否则
//返回-1
if(parent==-1)//父目录找不到,输入有误,创建失败
returncreate_dir(parent,name+p);
删除文件
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)//搜索该文件是否存在,不存在则删除失败
Thefiletodeletenotexist!
del_file(del_pos);
//开始删除文件
if(p->
file_count>
=2)
inttop=p->
file_count-1;
p->
child_file[index]=p->
child_file[top];
file_count--;
returndel_pos;
intdelfile(char*name)//删除文件的主调函数,前提是知道了删除文件的名字
if(parent==-1)
returndel_file(parent,name+p);
删除目录
voiddel_dir(intpos)//删除指定的目录节点,该目录已经为空
dir_flag[pos]=0;
dirflag_flag[pos]++;
dir_change_flag[pos]=0;
voiddel(intpos)//删除一个指定目录及它下面的所有文件及所有目录
dir[pos].file_count;
i++)//删除当前目录下的所有文件
del_file(dir[pos].child_file[i]);
for(i=0;
dir[pos].dir_count;
i++)//删除子目录
del(dir[pos].child_dir[i]);
del_dir(pos);
//删除当前目录
voiddel_dir(intparent,intdel_pos,intindex)//在一个指定的目录下删除一个目录及它下面的
{//所有文件及所有目录
del(del_pos);
//开始删除目录
if(dir[parent].dir_count>
=2)//修改父目录的控制信息
inttop=dir[parent].dir_count-1;
dir[parent].child_dir[index]=dir[parent].child_dir[top];
dir[parent].dir_count--;
保存文件
voidsavefile(intfile_id)//显式保存文件的核心函数
if(fileflag_flag[file_id]%2!
=0)//如果创建或删除,需要写回磁盘{
write_bit(file_id,1);
fileflag_flag[file_id]=0;
if(file_change_flag[file_id]>
0)//如果控制信息被修改,需要写回磁盘
{write_inode(file_id,1);
file_change_flag[file_id]=0;
for(inti=0;
file[file_id].block_count;
i++)
{
inttemp=file[file_id].block[i];
if(blockflag_flag[temp]%2!
=0)//如果磁盘块被释放或被占用,需要写回磁盘{
write_bit(temp,2);
blockflag_flag[temp]=0;
intsave_file(intparent,char*file_name)//显式保存文件
intpos,index;
if((pos=search(parent,file_name,1,index))==-1)
Thefilenotexistincurrentdirectory!
savedir(parent);
//保存父目录
savefile(pos);
intsavefile(char*name)//保存文件的主调函数,前提知道了要保存的文件名
returnsave_file(parent,name+p);
6>
保存目录
voidsave_dir(intdir_id)//保存空目录函数
if(dirflag_flag[dir_id]%2!
=0)//如果删除或创建,需要写回磁盘{
write_bit(dir_id,0);
dirflag_flag[dir_id]=0;
if(dir_change_flag[dir_id]>
0)//如果控制信息被修改,需要写回磁盘{
write_inode(dir_id,0);
dir_change_flag[dir_id]=0;
voidsavedir(intdir_id)//保存一个目录,及它的所有父目录,用了递归
if(dir_id==-1)
return;
save_dir(dir_id);
savedir(dir[dir_id].parent);
voidsave(intdir_id)//保存一个目录及它下面的所有目录及文件
{//用了递归
dir[dir_id].dir_count;
i++)
save(dir[dir_id].child_dir[i]);
dir[dir_id].file_count;
savefile(dir[dir_id].child_file[i]);
intsave_dir(intparent,char*dir_name)//显式保存目录
if((pos=search(parent,dir_name,0,index))==-1)
save(pos);
//保存自身及下面的所有文件及目录
write_bit(pos,0);
intsaved(char*name)//保存目录的主调函数,前提是知道了保存目录的名字
returnsave_dir(parent,name+p);
7>
改变目录
voidpaste(intdir_id)//用于设置当前路径
if(dir_id==0)
paste(dir[dir_id].parent);
strcat(curr_path,dir[dir_id].dir_name);
strcat(curr_path,"
/"
intchange_dir(char*name)//改变工作目录,成功则返回该目
{//录的索引号,否则返回-1
intparent,p=0,pos,index;
if(strcmp(name,"
)==0)
pos=0;
elseif(strcmp(name,"
.."
pos=curr_dir->
parent;
else
{
parent=get_parent(name,p);
if(parent==-1)
{printf("
return-1;
pos=search(parent,name+p,0,index);
if(pos==-1)//如果该目录不存在,则失败
Thedictorynotexist!
curr_path[3]='
\0'
;
paste(pos);
curr=pos;
//改变当前目录及路径
curr_dir=&
dir[curr];
returncurr;
8>
显示当前目录下的文件和子目录信息
voidshow_dir(intdir_id)//以下几个函数用于显示当前目录下面的目录和文件,
{//跟上面不同的是,它不能显示目录及文件之间的关系,
printf("
%s"
dir[dir_id].dir_name);
//但它可以显示一些细节,如创建时间,文件
for(inti=strlen(dir[dir_id].dir_name);
20;
printf("
"
DIR>
"
for(i=25;
30;
%d-%.2d-%.2d%.2d:
%.2d:
%.2d\n"
dir[dir_id].ctime.wYear,dir[dir_id].ctime.wMonth,dir[dir_id].ctime.wDay,dir[dir_id].ctime.wHour,dir[dir_id].ctime.wMinute,dir[dir_id].ctime.wSecond);
voidshow_file(intfile_id)//显示一个文件
{printf("
file[file_id].file_name);
for(inti=strlen(file[file_id].file_name);
FILE>
for(i=26;
%.2d"
file[file_id].ctime.wYear,file[file_id].ctime.wMonth,file[file_id].ctime.wDay,file[file_id].ctime.wHour,file[file_id].ctime.wMinute,file[file_id].ctime.wSecond);
for(i=0;
8;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 模拟 文件系统