文件系统实验报告 2.docx
《文件系统实验报告 2.docx》由会员分享,可在线阅读,更多相关《文件系统实验报告 2.docx(43页珍藏版)》请在冰豆网上搜索。
文件系统实验报告2
试验四 文件系统
一、实验目得
1、用高级语言编写与调试一个简单得文件系统,模拟文件管理得工作过程。
从而对各种文件操作命令得实质内容与执行过程有比较深入得了解。
2、要求设计一个n个用户得文件系统,每次用户可以保存M个文件。
用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有create、delete、open、close、read、write等命令。
二、实验题目:
采用二级目录结构实现磁盘文件操作。
要求:
1.普通文件得目录项包括文件名,文件类型,文件长度,指向文件内容得指针内容。
2.目录文件得目录项包括目录名,指向下一级目录块得指针内容。
假定每个目录文件最多只能占用一个块;
3.程序功能方面得要求:
需要实现一个命令行操作界面,包含如下命令:
4.程序实现方面得要求:
(1)、对于重名(创建时),文件不存在(删除时),目录不存在(改变目录时)等错误操作情况,程序应该做出相应处理并给出错误信息,但就是程序不得因此而退出。
(2)、界面友好,程序强壮。
(3)、设置界面得提示符,提示得命令以及调试得方法应与前面得要求一致。
不要自己设计命令或者附加不要求得功能。
三、实验源程序文件名:
执行文件名:
Project1、exe
四、实验分析
1)总论:
该系统就是一个多用户、多任务得实时操作系统。
对用户与用户得文件数目并没有上限。
也就就是说该系统允许任何用户申请空间,而且在其目录下得文件数目并不做任何得限制。
该系统得操作命令如下:
1、bye-用户注销命令。
当使用该命令时,用户退出系统。
命令格式:
run\bye↙系统注销该用户并回到登陆界面。
2、close-删除用户注册信息命令。
执行该命令后,用户在系统中得所有信息,包括该用户目录下得所有文件都被删除。
命令格式:
run\close↙、完成后返回登陆界面。
3、create-在当前目录下创建一个文件,且该文件不能跟系统中得文件重名。
该文件得管理信息登录到用户文件信息管理模块中。
命令格式:
run\create>file1↙。
其中file1为要创建得文件名称。
执行完该命令后回到执行命令行。
4、delete-删除当前用户目录下得一个文件。
命令格式:
run\delete>file1↙。
返回命令行。
5、list-显示当前注册目录下得所有文件信息,包括文件名、文件长度、文件操作权限。
命令格式:
run\list↙。
6、chmod-改变某个文件得执行权限,但前提就是该文件就是该用户目录下得文件。
命令格式:
run\chmod>file1↙。
7、open-在window界面下打开某个文件。
命令格:
run\open>file1↙。
执行该命令后,文件file1将用在windows界面下得文件形式打开。
用户可以在这个方式中对文件进行修改,并将修改后得内容保存。
8、read-读文件信息。
将文件信息读入并显示在终端。
命令格式:
run\read>file1↙。
9、write-向某个文件写入新得信息。
用户可以选择用覆盖原来内容得方式与在文件得末尾插入新信息得方式写入信息。
2)_系统采用二级文件目录。
设置主目录(MFD)与用户文件目录(UFD),分别以文件得方式保存在磁盘中。
在主目录中又注册用户得用户名与另一标志该用户目录下就是否有文件得指针标记。
用户文件目录用用户名作为文件名保存在磁盘,以便检索时方便对应。
在用户文件目录中保存着该目录下所有得文件得文件名称、保护码、文件长度。
3) 该系统大量使用高级语言中得文件操作函数,所以能实际瞧到文件得创建写入、读出、删除等效果。
4) 实验流程图
开始
选项
用户登录
新用户注册
退出程序
结束
在MFD中找到该用户?
初始化命令关键字(keyword)
显示该用户目录下得所有文件管理信息
1
1
创建文件
删除文件
打开文件
读文件
写文件
改变权限
显示文件
保存当前主目录
删除用户
返回主界面
输入命令
5)源程序:
#include<iostream、h>
#include<stdio、h>
#include
#include<string、h>
#include "conio、h"
#include
#defineNULL 0
#define keynum10
#define getspace(type) (type*)malloc(sizeof(type))
char cmd[64]; //存放用户输入命令
charbuffer[36];//
charuser[32];//存放当前登陆得用户名
typedef charALFA[12];
ALFAKWORD[keynum];
structUFD{//用户文件管理模块
char[32];//文件名
intsafecode; //文件保护码
long length; //文件长度
}*curfile =NULL;
struct MFD{//用户登陆信息管理模块
charusername[32];//用户名
ﻩbool; //用户目录下得文件指针,false表示目录为空
}*curuser=NULL,*elseuser=NULL;
typedefUFDUFD;
typedef MFDMFD;
void main();
void KeyWord()//初始化命令关键字
{
strcpy(KWORD[1],"bye"); strcpy(KWORD[2],"chmod");
ﻩstrcpy(KWORD[3],"close");ﻩstrcpy(KWORD[4],"create");
ﻩstrcpy(KWORD[5],"delete");ﻩstrcpy(KWORD[ 6],"list");
ﻩstrcpy(KWORD[ 7],"open"); strcpy(KWORD[8],"read");
strcpy(KWORD[9],"write");
}
intLoginDisplay() //登陆选项操作函数
{
ﻩintSELETE_1=0;
ﻩdo
ﻩ{
cout<<" *****请选择操作*****\n1、用户登陆2、用户注册0、退出"<cin>>SELETE_1;
}while(SELETE_1<0||SELETE_1>2);
ﻩsystem("cls");
ﻩreturn SELETE_1;
}
boolLogin(int SELETE)//用户登陆,注册函数
{
FILE *fp,*fp1,*fp2;
char name[12];
ﻩswitch(SELETE)
ﻩ{
ﻩcase1:
//用户登陆
ﻩif((fp=fopen("LOGIN、exe","rb"))==NULL)//打开用户注册目录管理文件
ﻩﻩ{
ﻩcout<<"\n错误:
不能打开登陆文件。
"<ﻩgetch();system("cls");
ﻩreturnfalse;
ﻩﻩ}
ﻩﻩcuruser=getspace(MFD);
ﻩcout<<"\n*****登陆*****\n用户名:
";
ﻩcin>>name; //输入用户登陆名
ﻩﻩwhile(!
feof(fp)) //检查该用户就是否合法
ﻩﻩ{
ﻩﻩfread(curuser,sizeof(MFD),1,fp);
ﻩif(strcmp(curuser->username,name)==0)
ﻩﻩﻩbreak;
ﻩ}
ﻩﻩif(feof(fp))//如果没有找到跟当前登陆用户名相同得管理信息,提示出错
{
ﻩcout<<"\n错误:
该用户不存在。
"< fclose(fp);
returnfalse;
}
ﻩelse
ﻩ{
ﻩﻩfclose(fp);
ﻩﻩreturn true;
ﻩ}
ﻩbreak;
case2:
//新用户注册
if((fp=fopen("LOGIN、exe","ab"))==NULL)//如果登陆信息管理文件不存在
fp=fopen("LOGIN、exe","wb+"); //创建该信息管理文件
ﻩﻩchar name[12];
curuser=getspace(MFD);
ﻩwhile(1)
{
ﻩﻩcout<<"\n*****新用户注册*****"<<endl;
cout<<"用户名:
";
cin>>name; //输入用户注册名
ﻩfp1 =fopen("LOGIN、exe","rb");
ﻩwhile(!
feof(fp1))//查瞧该用户名就是否被别得用户占用
ﻩ{
ﻩfread(curuser,sizeof(MFD),1,fp1);
ﻩﻩﻩﻩif(strcmp(curuser->username,name)==0)//该名称已经被使用
ﻩﻩﻩ{
ﻩcout<<"\n该用户已经存在,请重新输入!
"<<endl;
ﻩﻩﻩﻩgetch();
ﻩﻩﻩﻩbreak;
ﻩﻩ}
ﻩﻩﻩ}
ﻩif(feof(fp1))//该名称没有被别得用户占用
ﻩﻩﻩ{
ﻩﻩﻩstrcpy(curuser->username,name);
ﻩ curuser->=NULL;
ﻩfwrite(curuser,sizeof(MFD),1,fp);
ﻩﻩstrcpy(user,curuser->username);//生成用户文件管理模块
ﻩstrcat(user,"、exe"); //用于管理用户目录下得各个文件
ﻩfp2=fopen(user,"wb+");
ﻩfclose(fp2);
ﻩﻩﻩcout<<"\n注册成功!
"<ﻩﻩﻩﻩfclose(fp1);
ﻩ fclose(fp);
ﻩbreak;
ﻩﻩ}
ﻩ}
ﻩfp=fopen("LOGIN、exe","rb");//显示当前注册用户得名称
ﻩwhile(1)
ﻩﻩ{
fread(curuser,sizeof(MFD),1,fp);
ﻩﻩif(feof(fp))
ﻩﻩﻩbreak;
cout<<curuser->username<<endl;
ﻩgetch();
ﻩ}
ﻩfclose(fp);
ﻩreturntrue;
ﻩbreak;
default:
ﻩreturnfalse;
ﻩbreak;
}
}
voidDisplayUFD()//打印用户信息,包括用户得各个文件
//名称、长度与操作权限得设置信息
{
if(curuser->== false)//当前用户目录下没有任何文件存在
ﻩcout<<"\n用户"<username<<"文件夹就是空得"<ﻩelse
ﻩ{//存在文件,将所有文件信息打印在终端
ﻩFILE*fp;
ﻩchar[12];
ﻩﻩstrcpy(>username);
ﻩstrcat(,"、exe");
ﻩif((fp=fopen(,"rb"))==NULL)//打开用户文件信息管理模块
ﻩ{
ﻩcout<<"\n无法打开用户:
"<"<getch();
ﻩreturn;
ﻩ}
ﻩﻩelse
ﻩ{//读入并将用户全部文件信息打印在终端
ﻩcout<<"用户:
"<<curuser->username<<"目录下得文件:
"<<endl;
ﻩUFD*ufd;
ﻩinti=0;
ﻩufd=getspace(UFD);//申请存放用户文件模块得空间
ﻩﻩwhile
(1)
ﻩﻩ{ﻩﻩ
ﻩﻩfread(ufd,sizeof(UFD),1,fp);
ﻩif(feof(fp))//全部输出完毕,结束
ﻩﻩﻩbreak;
ﻩelse//打印信息
ﻩﻩcout<<<"\t"<<ufd->length<<"\t"<safecode<<endl;
ﻩﻩ}
}
ﻩfclose(fp);
ﻩ}
}
voidBye BOOL)//注销函数,调用次函数用户可以退出系统
{
FILE*infile,*outfile;
charout[50];
ﻩstrcpy(out,"out");
if((in("LOGIN、exe","rb"))==NULL)
ﻩ{
ﻩcout<<"\n保存错误。
";//ﻩfclose(infile);
ﻩreturn;
ﻩ}
else
ﻩ{
ﻩﻩif((out(out,"wb+"))==NULL)//申请一个缓冲区管理模块
ﻩ//存放用户更新后得全部信息
ﻩﻩ{
ﻩﻩcout<<"\n保存错误。
";// fclose(outfile);
ﻩfclose(in;
ﻩﻩ}
else
{
ﻩﻩﻩMFD*mfd=getspace(MFD);
ﻩwhile(1)
ﻩﻩ{//将旧文件管理信息读出,并保存到新得文件信息管理模块中
fread(mfd,sizeof(MFD),1,infile);
ﻩﻩﻩif(feof(infile))
ﻩﻩbreak;
ﻩﻩif((strcmp(mfd->username,curuser->username))==0)
ﻩﻩﻩﻩ{
ﻩﻩﻩif(BOOL)//更新当前用户信息得操作
ﻩﻩﻩfwrite(curuser,sizeof(MFD),1,outfile);
ﻩelsecontinue;//如果用户想把自己得注册目录从系统中彻底删除
ﻩﻩﻩ//则执行该操作
ﻩ}
ﻩelse
ﻩﻩfwrite(mfd,sizeof(MFD),1,out写入新得模块
ﻩﻩ}
ﻩﻩfclose(in(outfile);
ﻩremove("LOGIN、exe");//将旧得该用户得文件管理模块删除
ﻩrename(out,"LOGIN、exe");//将新得用户得文件管理模块重命名为用户目录下得管理模块
}
ﻩ}
system("cls");
ﻩmain();
}
boolClearUserFile()//用户要将自己得注册目录从系统彻底删除
//首先将该用户目录下得全部文件删除
{
FILE*fp;
char ];
ﻩstrcpy(>username);
ﻩstrcat(file,"、exe");
ﻩif((fp=fopen(file,"rb"))==NULL)//打开用户文件信息管理模块
{
ﻩ//ﻩfclose(fp);
ﻩcout<<"\n操作失败。
";return true;
ﻩ}
else
{//将该用户目录下得文件逐个从磁盘删除
ﻩUFD*ufd = getspace(UFD);
ﻩwhile(1)
{
ﻩﻩfread(ufd,sizeof(UFD),1,fp);
if(feof(fp))
break;
ﻩelse
ﻩﻩﻩremove(ufd->);//删除文件
ﻩ}
ﻩfclose(fp);
returntrue;
ﻩ}
}
voidClearUserMes()//删除用户全部信息
{
charname[50];
ﻩstrcpy(name,curuser->username);
ﻩstrcat(name,"、exe");
remove(name); //从磁盘中删除用户文件信息管理模块
Bye);//更新系统得用户登陆信息管理模块
}
voidDeleteUser()//删除用户注册目录得操作
{
charch;
cout<<"\n该操作将会就是您在系统所有信息删除,下次登陆时您必须重新申请用户名!
"<cout<<"\n您确定要删除您在系统中得注册信息吗?
Y/N"<ﻩcin>>ch;
ﻩswitch(ch)//提示用户确认删除
ﻩ{
ﻩcase 'Y':
ﻩcase'y':
if(ClearUserFile())//如果用户得全部文件已经删除了
ﻩ//则可以将该用户得文件信息管理模块也从磁盘中删除
ﻩ//以免在没完全删除文件却删了该文件信息管理模块
//使得这些文件无法再进行管理造成磁盘空间得浪费
ﻩﻩﻩClearUserMes();//删除文件信息管理模块
ﻩﻩbreak;
default:
ﻩﻩcout<<"\n您取消了此操作!
";
break;
}
}
void CreatFile()//在当前用户目录下创建文件
{
FILE *fp;
curuser->;
ﻩif((fp=fopen(buffer,"r"))==NULL)//如果没有跟用户输入文件名相同得文件
ﻩ{
ﻩif((fp=fopen(buffer,"w"))==NULL)
{
ﻩﻩcout<<"\n创建文件失败!
";
ﻩ//ﻩfclose(fp);
return;
ﻩﻩ}
ﻩﻩfclose(fp);
}
else
{//用户要创建得文件已经存在
ﻩcout<<"\n该文件已经存在,创建另一个文件?
Y/N";
ﻩcharch;
ﻩcin>>ch;
ﻩswitch(ch)
ﻩﻩ{
ﻩcase 'Y':
ﻩcase'y':
cout<<"\n输入新文件名:
";
ﻩﻩcin>>buffer;
ﻩstrcat(buffer,"、txt");
ﻩfclose(fp);
if((fp=fopen(buffer,"w"))==NULL)
ﻩﻩ{
ﻩcout<<"\n创建文件失败!
";
ﻩﻩ//fclose(fp);
return;
ﻩﻩ}
fclose(fp);
ﻩﻩbreak;
ﻩdefault:
ﻩﻩfclose(fp);
ﻩﻩﻩreturn;
ﻩ}
}
strcpy(user,curuser->username);
ﻩstrcat(user,"、exe");
ﻩcurfile=getspace(UFD);
ﻩstrcpy(curfile->);//文件名
curfile->length=0;//该文件长度为零
ﻩcurfile->safecode=30;//设置该文件得默认权限
ﻩ //11 00,文件主有读与写权,其她用户没有读写权
if((fp=fopen(user,"ab"))==NULL)
{
cout<<"\n错误:
您可能不就是合法用户。
"<ﻩﻩgetch();
}
ﻩelse
ﻩ{
ﻩfwrite(cur(UFD),1,fp);//将该文件信息写入用户文件信息管理模块中
ﻩcout<<"\n文件"<<curfile-><<" 创建成功!
";
}
ﻩfclose(fp);
}
voidDeleteFile()//删除当前目录下一个文件得操作
{
charch;
FILE*infile,*outfile;
cout<<"\n确定要删除文件:
"<ﻩcin>>ch;//提示用户确认删除
switch(ch)
ﻩ{
case'Y':
case'y':
//更新用户文件信息管理模块,这里同样使用缓冲区模块来更新
ﻩﻩ//方法与上面将到得类似
ﻩﻩchar out[50],in[50];
ﻩstrcpy(out,"out");
ﻩﻩstrcpy(in,curuser->username);
ﻩﻩstrcat(in,"、exe");
ﻩif((in(in,"rb"))==NULL)//打开该用户得文件信息管理模块
ﻩﻩﻩ{
cout<<"\n保存错误。
";
ﻩ//fclose(infile);
ﻩﻩﻩreturn;
ﻩ}
else
ﻩ{
ﻩ ﻩif((out(out,"wb+"))==NULL)
ﻩﻩ{
ﻩ ﻩﻩcout<<"\n保存错误。
";//fclose(outfile);
ﻩ ﻩfclose(in;
ﻩ}
ﻩ else
ﻩﻩ{
ﻩ ﻩUFD*ufd= getspace(UFD);
ﻩ while(1)
ﻩﻩﻩ{
ﻩﻩ ﻩfread(ufd,sizeof(UFD),1,in从旧模块读出信息
ﻩ if(feof(infile))
ﻩﻩ break;
ﻩif((strcmp(ufd->))==0)//要进行更新得信息
ﻩﻩﻩﻩcontinue;
ﻩﻩ ﻩelse
ﻩﻩ ﻩfwrite(ufd,sizeof(UFD),1,out写入新模块
ﻩﻩﻩ}
fclose(in(outfile);
ﻩ ﻩremove(in);//在磁盘移除就模块
rename(out,in);//新模块命名为当前用户文件信息管理模块
ﻩﻩ}
}
remove(buffer);//从磁盘中删除该文件
ﻩbreak;
ﻩdefault:
ﻩbreak;
ﻩ}
}
void ListAllFile()//显示当前用户目录下得文件信息
{
DisplayUFD();
}
voidOpenFile()//在window模式下打开该文件
{
ﻩsystem(buffer);//buffer为文件名,如:
}
boolQueryModElse(bool BOOL,bool&flag)//查询其它用户目录下文件得文件
//当该文件得权限允许当前用户对其执行有关操作时,返回ture
{
FILE *fp;
charuser[50];
UFD*ufd=getspace(UFD);//elseuser表示除当前用户外得所有用户注册目录
ﻩstrcpy(user,elseuser->username);
strcat(user,"、exe");
ﻩif((fp=fopen(user,"rb"))==NULL){//打开一个其它得用户文件信息管理模块
ﻩ//fclose(fp);
cout<<"\n操作出现错误,对此我们表示歉意!
"