操作系统文件系统课程设计报告Word下载.docx
《操作系统文件系统课程设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《操作系统文件系统课程设计报告Word下载.docx(42页珍藏版)》请在冰豆网上搜索。
读文件:
可通过登录用户来读取任何已创建的只读或读写文件的内容;
如果所要读的文件不是可读文件时,系统会显示该文件不可读;
如果所读文件不存在,系统会显示文件不存在。
写文件:
登录用户后,用户可写或重写读写文件中的内容,并保存文件中的重写内容,以供下次读取;
当所要写的文件不是可写的文件时,系统会显示该文件不可写;
当所要写的文件并不存在时,系统会显示该文件不存在。
执行文件:
登录用户后,用户可执行系统中已创建的执行文件;
当该文件不是可执行文件时,系统会显示该文件不可执行;
当该文件不存在时,系统将会显示该文件不存在。
关闭文件:
可通过选择关闭文件的功能选项,来关闭系统中所有打开的文件,如果没有文件被打开,则系统会显示没有文件打开。
删除用户、文件、文件夹:
登录用户后,用户可通过选择删除的功能选项来删除不想再保存的文件和文件夹,删除后,用户会自动注销;
当选择删除用户的功能选项时,系统会删除该用户,以及该用户所创建的所有文件和文件夹。
2、非功能需求分析
在现代计算机系统中,要用到大量的程序和数据,因内存容量有限,且不能长期保存,故而平时总是把它们以文件的形式存放在外存中,需要时再随时将它们调入内存。
如果有用户注解管理外存上的文件,不仅要求用户熟悉外存特性,了解各文件的属性,以及它们在外存上的位置,而且在多用户环境下,还必须能保持数据的安全性和一致性。
显然,这是用户所不能胜任、也不愿意承担的工作。
于是,取而代之的便是在操作系统中又增加了文件管理功能,即构成一个文件系统,负责管理在外存上的文件,并把对文件的存取、共享和保护等手段提供给用户。
这不仅方便了用户,保证了文件的安全性,还可有效地提高系统资源的利用率。
在该课程设计中,主要设计了一个模拟的多用户的二级共享的文件系统。
通过对用户的管理,文件和文件夹的物理结构,目录的结构和对文件、文件夹的操作的实现,来对系统中的所有文件进行管理。
三、概要设计
1、整体思路概述
运行程序时,首先系统要进行初始化,然后等待输入操作类型,但是在未创建用户之前,只能进行显示目录(此时为空目录)和退出的操作。
当用户创建成功后,即可通过登录用户来创建文件和文件夹。
在输入操作选项之后,必须先登录用户,当确认用户身份正确后,系统才能根据指定的命令进行操作,否则,不能进行操作,必须创建用户后,才能以该用户的身份进行操作。
操作完之后,用户会自动退出,没发出一个操作命令,用户必须登录一次。
只有在发出的命令是显示目录或退出或返回上级目录时,才不需要用户的登录。
2、数据流图
创建用户
创建文件
创建文件夹
上级菜单
删除用户
删除文件
删除文件夹
读文件写文件执行文件打开文件关闭文件显示目录上级菜单
3、功能流程图
四、详细设计
1、实现原理
本程序是一个文件系统模拟程序,模拟文件管理的工作过程。
本程序设计一个最多有10个用户的文件系统,实现文件系统的模拟管理过程,可以
进行创建用户、删除用户、创建文件、删除文件、创建文件夹、删除文件夹、读文件、写文件、执行文件、打开文件、关闭文件、显示目录等操作。
程序设置了主目录MFD、用户文件目录UFD和用户文件夹目录UDD,为打开文件设置了运行目录AFD。
文件保护简单使用了保护码:
只读为’r’,读写为’wr’,只执行为’do’,其他则表示不允许读写、执行。
2、重要数据结构说明
typedefstructufd{…}是文件的数据结构,即用户文件目录。
typedefstructudd{…}是文件夹的数据结构,即用户文件夹目录。
typedefstructmfd{…}是用户的数据结构,即主文件目录。
typedefstructafd{…}是运行中文件的数据结构。
typedefstructsfile{…}是指向文件的索引节点的数据结构。
1)用户的数据结构
typedefstructmfd{
charusername[10];
/*用户名*/
structufd*link;
/*指向该用户的第一个文件*/
structudd*clink;
/*指向该用户的第一个文件夹*/
}MFD;
用来描所创建用户的信息的结点,包含用户名、指向用户文件和文件夹的两个指针。
所以的结点都存放在一个名字为filesysten的数组中。
2)文件夹的数据结构
typedefstructudd{
charfoldername[10];
/*文件夹名*/
structufd*clink;
/*指向该文件夹的第一个文件*/
structudd*cnext;
/*指向该文件夹的第一个文件夹*/
structudd*link;
/*指向同级文件夹*/
}UDD;
用来描述文件夹的信息的结点。
3)文件的数据结构
typedefstructufd{
charfilename[10];
/*文件名*/
charfilecon[100];
/*文件内容*/
charprocode[8];
/*属性*/
intlength;
/*文件长度*/
structufd*nextfile;
/*指向下一个文件*/
}UFD;
用来描述文件信息的数据结构,同个用户的文件结点用一条链链接在一起。
4)运行文件的数据结构
typedefstructafd{/*运行文件目录*/
charfilename[10];
/*打开文件名*/
charfilecon[100];
//文件内容
charprocode[4];
//属性
intrwpointer;
/*读写指针*/
}AFD;
存放着运行文件的信息,标示着某文件正在执行,当关闭文件时,释放结点。
5)共享文件的结点的数据结构
typedefstructsfile{
charusername[10];
//用户名
structufd*file;
//共享的文件
structsfile*next;
//指向下一个共享文件的指针
}SFILE;
每一个文件都有一个共享的结点,该节点存放文件的信息、文件的创造者的名字和指向下一个共享文件的指针,所有文件的共享结点链接在一起,由sharefile指针指向该共享链。
3、重要函数说明
voiddisplayallfile()是用于显示目录的函数;
在实验中,我将创建的所有用户都存储在一个结点数组中,每个用户结点都有指向其文件和文件夹的指针,通过遍历结点数组来遍历用户,通过用户的指针来遍历用户的文件和文件夹。
voidcreateuser()是用于创建用户的函数;
将创建的用户以mfd结点的结构存储在filesystem数组中。
intfindusername(char*username)是用户查找用户的函数,当找到函数时返回保存用户的节点的下标;
当返回值大于等于用户个数时,表示找不到用户。
voiddeleteuser()是用于删除用户的函数;
在filesystem数组中寻找指定名字的用户,当找到该用户时,将用户从数组中删除,并将数组中该用户后面的其他用户的下标往前移一位,即减一;
如果找不到指定用户,则输出:
“用户不存在!
删除失败!
”。
sfile*findsharefile(char*filename)是用于查找共享文件的函数,当找到共享文件锁时返回指向该文件的节点指针,如果找不到,则返回空。
UFD*findfilename(char*filename,UFD*filepointer)是查找文件的函数,返回指向特定文件名的指针,或返回值为NULL。
UDD*findfoldername(char*foldername,UDD*folderpointer)是查找文件夹的函数,返回指向特定文件名的指针,或返回值为NULL。
voiddisplayfile(UFD*link)是用于显示文件属性的函数。
voidcreatefile()是用于创建文件的函数;
当要创建文件时,首先输入登录的用户名,如果该用户不存,输入是否创建用户,否则退出,是的话则创建用户,然后再创建文件;
当用户存在时,则直接创建文件。
创建文件时,若该登录的用户的文件中没有同名文件,则直接创建,否则输出:
“文件名已存在,请输入新的文件名!
”,通过输入新的文件名后再创建文件。
每创建一个文件,都会为文件创建一个共享结点,添加到共享链中。
voidcreatefolder()是用于创建文件夹的函数;
首先输入登陆的用户名,然后再创建,步骤与穿件文件相似,只是没有共享结点。
voiddeletefile()是用于删除文件的函数;
首先查找文件所属用户,然后再查找文件,找到则删除,否则删除失败。
voiddeletefolder()是用于删除文件夹的函数。
AFD*openfile()是用于打开文件的函数,当找到文件时打开文件,创建该文件的运行文件结点,并返回;
找不到文件时,返回值为NULL;
当要打开一个文件之前,首先先登录,如果登录的用户不存在则不能打开文件,如果用户存在,输入需要打开的文件名,如果用户没有创建该文件则寻找共享文件中是否存在其他用户创建的该文件,有则打开,为文件创建运行文件的结点,没有则输出不存在该文件。
在对文件的所有操作之前都需要先调用该函数打开文件,才能进行操作。
voidclosefile()是用于关闭文件的函数;
关闭文件时释放文件的运行文件结点。
voidreadfile()是用于读文件的函数;
打开文件后首先判断文件是否可读,如果是可读文件则读出文件中的内容,否则输出文件不可读。
voidwritefile()是用于写文件的函数;
首先打开文件,判断文件是否可写。
voidexecutefile()是用于执行文件的函数。
//菜单,即有关用户界面的函数
voidmenu()是主菜单,程序执行时就会显示该菜单,初始化界面,并通过该菜单选择相应的功能选项。
voidmenu1()是menu的一个子菜单,包含了所有的创建功能选项和返回上级菜单的选项;
voidmenu2()是menu的一个子菜单,包含了所有的删除功能选项和返回上级菜单的选项;
voidmenu3()是menu的一个子菜单,包含了对文件的各种操作选项、返回上级菜单的选项和显示目录的选项。
4、相关代码
UFD*rw_pointer;
AFD*afd=NULL;
//运行文件
MFDfilesystem[10];
//存放用户的数组
sfile*sharefile=NULL;
//共享文件
voiddisplayallfile()/*显示目录*/
{
inti;
UFD*p;
//指向某个文件的指针
UDD*q;
//指向用户文件目录的指针
system("
cls"
);
/*清屏*/
printf("
\t****************\n"
\t\t显示目录\n"
for(i=0;
i<
num;
i++)
{
printf("
用户:
%s目录如下!
\n"
filesystem[i].username);
p=filesystem[i].link;
//指向该用户的第一个文件
q=filesystem[i].clink;
//指向该用户的第一个文件夹
while(p)
{
printf("
\t文件名:
%s\t||"
p->
filename);
文件属性:
procode);
文件长度:
%d\n"
length);
p=p->
nextfile;
}
while(q)
\t文件夹名:
%s\n"
q->
foldername);
q=q->
link;
}
}
voidcreateuser()/*建立用户*/
\t\t建立用户\n"
if(num>
=10)/*用户文件目录已满,创建文件失败*/
用户已满\n创建文件失败!
return;
输入用户名:
scanf("
%s"
username);
if(!
strcmp(filesystem[i].username,username))
{
用户名已存在,请输入新用户名!
scanf("
strcpy(filesystem[num].username,username);
num++;
用户已创建!
/*-查找用户*/
intfindusername(char*username)//返回用户名下标,当I=NUM时,用户不存在
i=0;
while(i<
num)
if(!
strcmp(filesystem[i].username,username))
break;
i++;
returni;
voiddeleteuser()/*删除用户*/
charcs,username[10];
UFD*p1,*p2;
UDD*p3,*p4;
\t\t删除用户\n"
\n输入用户名:
i=findusername(username);
/*返回用户名下标*/
if(i>
=num)
用户不存在!
\n删除失败!
return;
else
是否删除用户%s及用户%s下所有东西?
(y/n)"
filesystem[i].username,filesystem[i].username);
cscanf("
%c"
&
cs);
if(cs=='
y'
)
p1=p2=filesystem[i].link;
//用户的第一个文件
while(p2)
{
p2=p2->
free(p1);
p1=p2;
p3=p4=filesystem[i].clink;
//用户的第一个文件夹
p4=p4->
free(p3);
p3=p4;
for(i;
num-1;
filesystem[i]=filesystem[i+1];
num--;
\n用户已删除!
else
return;
sfile*findsharefile(char*filename)/*查找共享文档*/
sfile*k;
k=sharefile;
while(k&
&
strcmp(filename,k->
file->
filename))
k=k->
next;
returnk;
/*-查找文件*/
UFD*findfilename(char*filename,UFD*filepointer)//返回指向特定文件名的指针,或返回值为NULL*/
UFD*k;
k=filepointer;
while(k&
strcmp(filename,k->
/*查找文件夹*/
UDD*findfoldername(char*foldername,UDD*folderpointer)//返回指向特定文件名的指针,或返回值为NULL*/
UDD*k;
k=folderpointer;
strcmp(foldername,k->
foldername))
voiddisplayfile(UFD*link)/*显示文件属性*/
p=link;
if(!
p)
\n此目录没有该文件!
"
\n用户文件如下:
while(p)
%s\t||"
%d\n\n"
p=p->
voidcreatefile()/*-创建文件*/
charcx;
inti,j;
UFD*p1,*p2,*newfile;
sfile*q1=sharefile;
\t\t创建文件\n"
用户文件目录已满\n创建文件失败!
输入登录的用户名:
if(i==num)/*如果该用户不存在,且用户个数不小于10,先创建用户再建立用户文件*/
用户不存在,是否建立用户?
cx);
if(cx=='
strcpy(filesystem[num].username,username);
/*创建用户目录*/
num++;
/*为刚创建的用户建立文件*/
newfile=(UFD*)malloc(sizeof(UFD));
//为新建文件分配空间
newfile->
nextfile=NULL;
filesystem[num-1].link=newfile;
//该新建用户的第一个文件为newfile
文件名:
filesystem[num-1].link->
属性(r只读,wr读写,do可执行):
长度:
%d"
(filesystem[num-1].link->
length));
文件已创建!
if(sharefile==NULL)
{
sharefile=(sfile*)malloc(sizeof(sfile));
sharefile->
file=filesystem[num-1].link;
strcpy(sharefile->
username,username);
sh