操作系统课程设计方案Linux二级文件系统设计方案Word文档下载推荐.docx
《操作系统课程设计方案Linux二级文件系统设计方案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计方案Linux二级文件系统设计方案Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
read读文件
write写文件
cd进出目录
2.列目录时要列出文件名,物理地址,保护码和文件长度
3.源文件可以进行读写保护
【实验环境】
C++
DevCpp
【设计思路】
本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。
另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。
首先应确定文件系统的数据结构:
主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
用户创建的文件,可以编号存储于磁盘上。
如:
file0,file1,file2…并以编号作为物理地址,在目录中进行登记。
结构体:
typedefstruct/*thestructureofOSFILE*/
{
intfpaddr;
/*filephysicaladdress*/
intflength;
/*filelength*/
intfmode;
/*filemode:
0-ReadOnly;
1-WriteOnly;
2-ReadandWrite;
3-Protect;
*/
charfname[MAXNAME];
/*filename*/
}OSFILE;
//存放重要信息
typedefstruct/*thestructureofOSUFD*/
charufdname[MAXNAME];
/*ufdname*/
OSFILEufdfile[MAXCHILD];
/*ufdownfile*/
}OSUFD;
//用户下面的文件
typedefstruct/*thestructureofOSUFD'
LOGIN*/
charufdpword[8];
/*ufdpassword*/
}OSUFD_LOGIN;
typedefstruct/*fileopenmode*/
intifopen;
/*ifopen:
0-close,1-open*/
intopenmode;
/*0-readonly,1-writeonly,2-readandwrite,3-initial*/
}OSUFD_OPENMODE;
主要的函数说明:
voidLoginF();
/*LOGINFileSystem用户登录*/
voidDirF();
/*DirFileSystem列目录*/
voidCdF();
/*ChangeDir改变目录*/
voidCreateF();
/*CreateFile创建文件*/
voidDeleteF();
/*DeleteFile删除文件*/
voidModifyFM();
/*ModifyFileMode修改*/
voidOpenF();
/*OpenFile打开文件*/
voidCloseF();
/*CloseFile关闭文件*/
voidReadF();
/*ReadFile读文件*/
voidWriteF();
/*WriteFile写文件*/
voidQuitF();
/*QuitFileSystem离开文件系统*/
voidhelp();
其他重要函数:
voidclrscr()//清屏
intExistD(char*dirname)/*WhetherDirNameExist,Exist-i,NotExist-0*/
intExistF(char*filename)/*WhetherFileNameExist,Exist-i,NotExist-0*/
intFindPANo()/*findoutphysicaladdressnum*/
voidSetPANo(intRorW)/*Setphysicaladdressnum,0-read,1-write*/
voidInputPW(char*password)/*inputpassword,use'
*'
replace*/
char*ltrim(char*str)/*removetheheadingblanks.去除左空白*/
char*rtrim(char*str)/*removethetrailingblanks.去除右空白*/
intWriteF1()/*writefile相当于置换文件*/
程序流程说明:
整体流程:
结束
各部分功能流程:
Open:
NN
Y
Delete:
Y
N
Y
Write:
Y
N
1
Close:
【源程序清单】
voidOpenF()/*OpenFile*/
printf("
\n\nC:
\\%s>
"
strupr(dirname));
//显示当前路径
intfcoun,i;
//定义两个整形变量
charfname[MAXNAME],fmode[25];
//定义两个字符串变量
intfmod;
//文件模式
\nPleaseinputFileName:
);
gets(fname);
//接收打开文件的文件名
ltrim(rtrim(fname));
//去除左右空白
if(ExistF(fname)<
0)//判断文件是否存在
{//不存在
\nError.文件名\'
%s\'
不存在\n"
fname);
wgetchar=1;
}else{//存在
i=ExistD(username);
//获取用户物理信息
for(inta=0;
a<
fcount[i];
a++)//遍历用户文件
{
if(strcmp(fname,ufd[i]->
ufdfile[a].fname)==0)//找到文件
fcoun=a;
break;
}
ifopen[i][fcoun].ifopen=1;
//将文件状态置为打开状态
PleaseinputOpenMode(0-ReadOnly,1-WriteOnly,2-ReadandWrite,3-Protect):
//打开文件模式
gets(fmode);
//获取模式
fmod=atoi(fmode);
//将字符串转换为整型
ifopen[i][fcoun].openmode=fmod;
//将文件的模式置为OpenMode
\nOpenSuccessed"
}
voidDeleteF()/*DeleteFile*/
//显示路径
charfname[MAXNAME],str[50],str1[50];
//定义三个字符串变量
inti,k,j;
intfpaddrno1;
//记录文件物理地址块号
if(strcmp(strupr(ltrim(rtrim(dirname))),"
)==0){//判断主目录是否为空
\nError.请确认您要删除的是否在用户目录下!
\n"
if(strcmp(strupr(dirname),strupr(username))!
=0){//判断用户是否在用户目录下
\nError.您只能删除修改自己用户目录下的文件哦!
}else{
//接收删除的文件名
//去除文件名的左右空白
i=ExistF(fname);
//用户文件位置
if(i>
=0){
k=ExistD(username);
//获取用户所在存储位置
if(ifopen[k][i].ifopen==1){//文件状态处于打开状态,不许删除
\nError.\'
处于打开状态!
请先关闭哟!
if(ufd[k]->
ufdfile[i].fmode==3){//保护文件,不可删除
\nError.\'
处于被保护状态!
fpaddrno1=ufd[k]->
ufdfile[i].fpaddr;
//获取文件的物理地址块号
fpaddrno[fpaddrno1]=0;
//回收物理地址块号
for(j=i;
j<
fcount[k];
j++)//将文件都向前移动
ufd[k]->
ufdfile[j]=ufd[k]->
ufdfile[j+1];
//将j+1位置为j
strcpy(str,"
c:
\\osfile\\file\\"
itoa(fpaddrno1,str1,10);
//将整数转化为字符串
strcat(str,str1);
strcat(str,"
.txt"
//连接
remove(str);
//删除物理文件
fcount[k--];
//文件个数减一
\n\'
isdeletedsuccessfully.\n"
wgetchar=