操作系统文件系统设计实验报告
Posted Henry Zheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统文件系统设计实验报告相关的知识,希望对你有一定的参考价值。
操作系统报告
文件系统设计
姓名: 郑兆涵
专业: 计算机科学与技术(嵌入式方向)
计算机与控制工程学院
2016年6月1日
目录:
一、设计目的、意义
二、设计分析
三、方案分析
四、功能模块实现
五、最终结果分析
六、设计体会
七、附录
一、设计目的、意义
本课程设计的目的是设计一个简单多用户文件系统,切身体验理解文件体统的内部构造,实现对文件,目录的操作,运用链表模拟实现各种功能,同时实现一级索引,二级索引等完成对空间的分配操作。
通过本课程设计理解文件系统的内部功能及内部实现,完善课本上各种文件系统的操作与认识。
二、设计分析
(1)可以实现下列几条命令(至少4条);
login 用户登陆
dir 列文件目录
create 创建文件
delete 删除文件
open 打开文件
close 关闭文件
read 读文件
write 写文件
(2)列目录时要列出文件名、物理地址、保护码和文件长度;
(3)源文件可以进行读写保护。
(4)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
(5)用户创建的文件,可以编号存储于磁盘上。如file0,file1,file2...并以编号作为物理地址,在目录中进行登记。
三、方案分析
四、功能模块实现
主要数据结构
typedef struct UFD //存储文件信息
{
char name[10]; //文件名
int attribute; //属性
int length; //长度
int a[10]; //为文件本身分配10个空间
int *p1; //一级索引,100个空间
int (*p2)[100]; //二级索引,100*100个空间
struct UFD *next;
}UFD;
typedef struct DIR //存储目录信息
{
DIR* above; //上一结点
char name[10];
int length;
DIR *next; //下一结点
UFD *File_head; //此目录下的文件指针
DIR *Dir_head; //此目录下目录链表指针
}DIR;
class Cuse //定义管理用户目录的类
{
DIR *now; //当前目录
UFD *Fhead; //文件的头结点
DIR *Dhead; //根目录的目录链头结点
char code[10]; //密码
char name[10]; //用户名
int length; //用户空间大小
int status; //是否获得空间
public:
void set_status(int);
int dele_user();
int dis_file(); //显示文件所占外存块号
int dis_dir(DIR *d);//当前路径
int get_length();
char const *get_name();
char const *get_code();
int get_status();
int set_user(char *,char *);//设置用户名与密码
DIR *get_now();
int dele_file(UFD *f); //删除文件
int dele_dir(DIR*); //删除目录
Cuse(); //构造
~Cuse(); //析构
int goback(); //返回上级
int dis_now(); //显示当前目录
int new_file();
int new_dir();
int open_dir();
int open_file();
int first_dele_file(); //删除文件的前部分工作
int first_dele_dir(); //删除目录的前部分工作
int set_code();
};
class Cdisk{ //用户类
public:
Cuse user[5]; //用户个数最多为5
char code[10];
int dis_disk();
int first_dele_user();
int dele_user(int);
int new_user(); //查看当前用户与外存空间使用情况,后创建新用户
int set_code(); //设置新密码
int login(char); //登陆
Cdisk();
virtual~Cdisk(); //虚函数,析构
};
功能模块:
①.创建文件
②.删除文件
③.创建目录
④.删除目录
⑤.打开目录
⑥.返回上一层目录
⑦.查看当前目录
⑧.修改密码
⑨.查看文件
显示当前目录时,查看当前的目录链
if(f==0)
cout<<"当前目录下没有文件"<<endl;
else
{
cout<<"当前目录下包含如下文件:"<<endl;
cout<<setw(14)<<"文件名称"<<setw(14)<<"文件大小"<<setw(14)<<"文件属性"<<endl;
while(f!=0)
{
cout<<setw(14)<<f->name<<setw(14)<<f->length<<setw(14)<<f->attribute<<endl;
f=f->next;
}
}
五、最终结果分析
六、设计体会
在这次设计中,我对于文件属性,文件命名,文件操作,文件存取方式有了更加深刻的理解,其中令我印象最为深刻的是文件目录的管理。其中的文件控制块跟索引节点起到了非常重要的作用。文件控制块中包含了有关文件存取控制的信息,文件结构的信息,文件使用的信息,文件管理的信息。查找文件时,根据文件名找到文件控制块,再通过控制块获得相应的信息。
为了减少检索文件访问的物理快熟,文件系统把文件目录项中的文件名和其他管理信息分开。后者单独组成定长的一个数据结构,称为索引节点。
把文件控制块的内容与索引节点分开,不仅加快了目录检索速度,而且,便于实现文件共享,有利于系统的控制和管理。
七、附录
#include<string.h>
#include<stdlib.h>
#include<iostream.h>
#include<iomanip.h>
#if _MSC_VER>1000
#pragma once
#endif //_MSC_VER>1000
extern int disk_block[10000];
extern int disk_empty;
typedef struct UFD //存储文件信息
{
char name[10]; //文件名
int attribute; //属性
int length; //长度
int a[10]; //为文件本身分配10个空间
int *p1; //一级索引,100个空间
int (*p2)[100]; //二级索引,100*100个空间
struct UFD *next;
}UFD;
typedef struct DIR //存储目录信息
{
DIR* above; //上一结点
char name[10];
int length;
DIR *next; //下一结点
UFD *File_head; //此目录下的文件指针
DIR *Dir_head; //此目录下目录链表指针
}DIR;
class Cuse //定义管理用户目录的类
{
DIR *now; //当前目录
UFD *Fhead; //文件的头结点
DIR *Dhead; //根目录的目录链头结点
char code[10]; //密码
char name[10]; //用户名
int length; //用户空间大小
int status; //是否获得空间
public:
void set_status(int);
int dele_user();
int dis_file(); //显示文件所占外存块号
int dis_dir(DIR *d);//当前路径
int get_length();
char const *get_name();
char const *get_code();
int get_status();
int set_user(char *,char *);//设置用户名与密码
DIR *get_now();
int dele_file(UFD *f); //删除文件
int dele_dir(DIR*); //删除目录
Cuse(); //构造
~Cuse(); //析构
int goback(); //返回上级
int dis_now(); //显示当前目录
int new_file();
int new_dir();
int open_dir();
int open_file();
int first_dele_file(); //删除文件的前部分工作
int first_dele_dir(); //删除目录的前部分工作
int set_code();
};
class Cdisk{ //用户类
public:
Cuse user[5]; //用户个数最多为5
char code[10];
int dis_disk();
int first_dele_user();
int dele_user(int);
int new_user(); //查看当前用户与外存空间使用情况,后创建新用户
int set_code(); //设置新密码
int login(char); //登陆
Cdisk();
virtual~Cdisk(); //虚函数,析构
};
int disk_block[10000];
int disk_empty;
Cdisk::Cdisk() //管理磁盘的类,构造函数
{
int i=0;
char code[10]="123456";
for(i=0;i<10000;i++) //初始化所有磁盘块为空闲
disk_block[i]=0;
//this->user[0].set_user("student","123");//默认一个用户
disk_empty=10000;
cout.setf(ios::left); //设置输出方式
}
Cdisk::~Cdisk() //析构
{
}
int Cdisk::dele_user(int i) //Cdisk类dele_user的构造
{
Cuse C;
C=user[i];
user[i].dele_user(); //调用Cuse类的成员函数 int dele_user()
return 1;
}
int Cdisk::dis_disk() //检查磁盘信息
{
int i=0;
cout<<setw(14)<<"用户名"<<setw(14)<<"占用空间大小"<<endl;
for(i=0;i<5;i++)
if(user[i].get_status()==1) //存在的用户的信息
cout<<setw(14)<<user[i].get_name()<<setw(14)<<user[i].get_length()<<endl;
cout<<"已用空间:"<<10000-disk_empty<<endl<<"剩余空间:"<<disk_empty<<endl;
return 1;
}
int Cdisk::login(char b) //登陆
{
char n[10],c[10];
int i;
if(b=='1')
{
cout<<"用户:管理员"<<endl;
cout<<"密码:默认\\n"<<endl;
system("pause");
return 1;
}
else
{
if(!user[0].get_status()) //当前不存在用户
{
i=0;
cout<<"当前用户为空,欢迎注册!"<<endl;
user[i].set_status(1); //为新用户分配权利
cout<<"请输入用户名:"<<endl;
cin>>n;
cout<<"请输入密码:"<<endl;
cin>>c;
user[i].set_user(n,c); //调用Cuse的成员函数,传递用户名与密码
cout<<"恭喜,创建用户成功!"<<endl;
return i;
}
else
{
cout<<"用户名:";
cin>>n;
cout<<"密码:";
cin>>c;
cout<<endl;
for(i=0;i<5;i++) //查找是否存在此用户
{
if(user[i].get_status()) //存在方比较
if(!strcmp(n,user[i].get_name())) //相等时为0,此判断为匹配
if(!strcmp(c,user[i].get_code())) //密码匹配
{
cout<<"登陆成功!"<<endl;
cout<<"欢迎"<<user[i].get_name()<<"登陆"<<endl;
return i;
}
else
{
cout<<"密码错误"<<endl;
return -1;
}
}
cout<<"此用户不存在!"<<endl;
return -1;
}
}
}
int Cdisk::set_code() //设置新密码
{
char temp1[10],temp2[10];
cout<<"请输入原密码"<<endl;
cin>>temp1;
if(strcmp(temp1,code)) //无疑是针对当前用户进行操作,故直接code
{
cout<<"原密码错误!"<<endl;
return 0;
}
while(1)
{
cout<<"请输入新密码:"<<endl;
cin>>temp1;
cout<<"请再次输入新密码:"<<endl;
cin>>temp2;
if(strcmp(temp1,temp2))
{
cout<<"两次密码不相同,请重输!"<<endl;
break;
}
cout<<"密码设置成功!"<<endl;
strcpy(code,temp1); //保存新密码
break;
}
return 1;
}
int Cdisk::new_user() //准备创建新用户
{
char n[10],c[10];
int i=0,j;
for(i=0;i<5;i++)
if(user[i].get_status()==0) //是否有此用户,此尚未存在
break;
if(i==5)
{
cout<<"已经达到最大用户5个,不能再创建!"<<endl;
return 0;
}
user[i].set_status(1); //为新用户分配权利
cout<<"请输入用户名:"<<endl;
cin>>n;
if(i>0) //已有其它用户存在
{
for(j=0;j<i-1;j++)
if(!strcmp(user[j].get_name(),n))
{
cout<<"此用户名已存在!"<<endl;
return 0;
}
}
cout<<"请输入密码:"<<endl;
cin>>c;
user[i].set_user(n,c); //调用Cuse的成员函数,传递用户名与密码
cout<<"恭喜,创建用户成功!"<<endl;
return 1;
}
int Cdisk::first_dele_user() //删除用户
{
char n[10],c;
int i;
cout<<"请输入你要删除的用户名"<<endl;
cin>>n;
for(i=0;i<5;i++) //在查找用户的同时,得到用户序号i
if(!strcmp(user[i].get_name(),n)&&user[i].get_status())
break; //找到,跳出
if(i==5)
{
cout<<"出错啦,此用户不存在!"<<endl;
return 0;
}
cout<<"确认删除此用户?确认Y,取消任意键"<<endl;
cin>>c;
if(c!='Y'&&c!='y')
{
cout<<"已经取消删除!"<<endl;
return 0;
}
this->dele_user(i);
cout<<"用户删除成功"<<endl;
return 1;
}
Cuse::Cuse() //构造函数,初始化成员
{
status=0; //用户权利,即是否被创建标记
length=0; //空间
now=0; //当前目录
Fhead=0; //文件
Dhead=0; //目录
}
Cuse::~Cuse() //析构,清除程序占用的内存
{
disk_empty+=length;
length=0;
UFD *f=Fhead;
DIR *d=Dhead;
while(f!=0) //文件
{
if(f->next==0)
{
this->dele_file(f);
f=0;
break;
}
while(f->next->next!=0)
f=f->next;
this->dele_file(f->next);
f->next=0;
f=Fhead;
}
while(d!=0) //目录
{
if(d->next==0)
{
this->dele_dir(d);
d=0;
break;
}
while(d->next->next!=0)
d=d->next;
this->dele_dir(d->next);
d->next=0;
d=Dhead;
}
}
int Cuse::new_file() //建立新文件
{
int i=0,j=0;
UFD *f,*p=0;
DIR *D;
p=new UFD; //开辟一个新的文件结构体
if(p==0)
{
cout<<"无可用内存空间,创建文件失败!"<<endl;
return 1;
}
cout<<"请输入建立的文件名:";
cin>>p->name;
if(now==0) //根目录下的文件链
f=Fhead;
else //当前目录下的文件链
f=now->File_head;
while(f!=0) //检查是否文件重名
{
if(!strcmp(p->name,f->name))
{
cout<<"此文件已存在!"<<endl;
return 0; //退出
}
f=f->next;
}
cout<<"\\n"<<"长度:";
cin>>p->length;
cout<<"\\n"<<"属性(0:只读,1:读写):";
cin>>p->attribute;
cout<<endl;
if(p->length>disk_empty) //空间不足
{
cout<<"文件太大,空间不足,当前空间为:"<<disk_empty<<endl;
delete p;
return 0;
}
disk_empty=disk_empty-p->length; //剩余空闲盘块
//
for(i=0;i<p->length&&i<10;i++) //文件较小时,直接地址,文件数据盘块号
for(j;j<10000;j++) //位示图法
if(disk_block[j]==0) //空闲
{
p->a[i]=j; //得到此空间
disk_block[j]=1; //标记为已分配出去
j++;
break; //跳出寻找,为文件分配下一空间
}
p->p1=0; //一级索引
p->p2=0; //二级索引
if(p->length>10) //超过10,用一级索引
{
p->p1=new int[100]; //为一级索引分配100个空间
for(i=10;i<p->length&&i<110;i++)
for(j;j<10000;j++) //j,继续前面的值
if(disk_block[j]==0)
{
(p->p1)[i-10]=j;
disk_block[j]=1;
j++;
break;
}
if(p->length>110) //超过110,得用二级索引
{
p->p2=new int[100][100]; //在一级索引的基础上,2维
for(i=110;i<p->length;i++)
for(j;j<10000;j++) //j,继续前面的值
if(disk_block[j]==0)
{
int m=(i-110)/100; //行
int k=(i-110)%100; //列
p->p2[m][k]=j;
disk_block[j]=1;
j++;
break;
}
}
}
if(now==0) //根目录下的文件
{
p->next=Fhead; //后继结点指向头,即新指点在前
Fhead=p; //新结点在头
}
else
{
p->next=now->File_head;
now->File_head=p;
}
length+=p->length; //用户总空间大小增加
if(now!=0) //子目录下空间大小增加
{
now->length+=p->length;
D=now->above; //上一级目录
while(D!=0) //上级目录(根目录已实现)空间增加
{
D->length+=p->length;
D=D->above; //逐级向上
}
}
return 0;
}
int Cuse::new_dir() //建立新目录
{
DIR *p,*h;
cout<<"请输入新目录的名字:"<<endl;
p=new DIR;
cin>>p->name; //目录名
p->Dir_head=0; //目录下的目录链为空
p->length=0; //
p->File_head=0; //目录下的文件为空
if(now==0) //当前为主目录
h=Dhead; //第一次时,h=0;指向目录链
else
h=now->Dir_head;//当前的目录链
while(h!=0) //此目录下存在其它子目录
{
if(!strcmp(h->name,p->name))
{
cout<<"此目录已存在!"<<endl;
return 0;
}
h=h->next;
}
if(now==0) //当前为主目录
{
p->above=0; //主目录里目录的上一结点为0
p->next=Dhead; //把原目录接入新目录后面(Dhead初始为0)
Dhead=p; //Dhead始终指向最新目录结点
}
else
{
p->above=now; //当前目录为新目录的上一结点
p->next=now->Dir_head; //反序插入新目录
now->Dir_head=p; //更新目录链
}
cout<<"目录创建成功"<<endl;
return 1;
}
int Cuse::goback() //向上返回
{
if(now==0)
{
cout<<"已是主目录,不能向上!"<<endl;
return 0;
}
now=now->above; //上一结点
return 1;
}
int Cuse::open_dir() //打开目录
{
char name[10];
DIR *p;
if(now==0) //当前主目录
p=Dhead;
else
p=now->Dir_head; //p指向目录链
cout<<"请输入你要打开的目录名:"<<endl;
cin>>name;
//int flag=0;
while(p!=0)
{
if(strcmp(p->name,name)==0)
{
now=p; //找到目录,now标记
return 1;
}
p=p->next;
}
cout<<"当前没此目录"<<endl;
return 0;
}
int Cuse::first_dele_file() //删除文件的前面工作
{
char temp[10],a[5];
cout<<"你要删除的文件名:"<<endl;
cin>>temp;
UFD *f=Fhead; //数据文件头指针
UFD *above=0;
if(now!=0)
f=now->File_head; //当前目录下的数据文件
while(f!=0)
{
if(!strcmp(f->name,temp))
break; //找到,跳出
above=f; //标记第一个文件
f=f->next;
}
if(f==0)
{
cout<<"此文件不存在"<<endl;
return 0;
}
cout<<"确定删除"<<f->name<<"文件吗?按0确定,其他键取消"<<endl;
cin>>a;
if(a[0]!='0')
{
cout<<"已取消删除文件。"<<endl;
return 0;
}
disk_empty+=f->length; //回收此数据文件的空间大小
if(now==0) //根目录
{
if(f==Fhead)
Fhead=Fhead->next;
else
above->next=f->next;
}
else
{
DIR *d=now;
while(d!=0)
{
d->length=f->length;
d=d->above;
}
if(f==now->File_head)
now->File_head=now->File_head->next;
else
above->next=f->next;
}
length-=f->length;
this->dele_file(f);
cout<<"删除成功"<<endl;
return 1;
}
int Cuse::dele_file(UFD *f) //具体实现删除文件
{
int i=0,m;
for(i=0;i<10&&i<f->length;i++) //回收文件具体空间,重置空闲
{
m=f->a[i];
disk_block[m]=0;
}
if(f->p1!=0) //回收一级索引
{
for(i=10;i<110&&i<f->length;i++)
{
m=f->p1[i-10];
disk_block[m]=0;
}
delete[](f->p1);
}
if(f->p2!=0) //回收二级索引
{
for(i=110;i<f->length;i++)
{
m=(f->p2)[(i-110)/100][(i-110)%100];
disk_block[m]=0;
}
delete[](f->p2);
delete f;
}
f=0; //要删除的文件为空了
return 1;
}
int Cuse::first_dele_dir() //删除目录的前奏
{
char n[10];
char c;
DIR *p,*above=0;
p=Dhead; //指向根目录下的目录链
if(now!=0)
p=now->Dir_head; //指向当前目录下的目录链
cout<<"要删除的目录名:"<<endl;
cin>>n;
while(p!=0)
{
if(!strcmp(p->name,n))
break; //找到要删除的目录,跳出
above=p; //保存前一结点
p=p->next;
}
if(p==0)
{
cout<<"没有这个目录!"<<endl;
return 0;
}
cout<<"确定删除当前目录及此目标上的所有信息吗?按0确定,其他键取消"<<endl;
cin>>c;
if(c!='0')
return 0;
disk_empty+=p->length; //回收磁盘空间
if(now==0)
{
if(p==Dhead) //如果是根目录下头结点,直接移动Dhead
Dhead=Dhead->next;
else
above->next=p->next;//中间抽掉目标
}
else
{
if(p==now->Dir_head)
now->Dir_head=now->Dir_head->next;
else
above->next=p->next;
above=now; //当前目录
while(above!=0)
{
above->length-=p->length;//用above标记当前目录,进行大小更新
above=above->above; //向上一级
}
}
length-=p->length; //根目录大小更新
this->dele_dir(p);
p=0;
cout<<"删除成功!"<<endl;
return 1;
}
int Cuse::dele_dir(DIR *p) //具体实现删除目录的工作
{
int flag=0;
DIR *d=p->Dir_head; //当前目录下的目录链表
UFD *f=p->File_head; //当前目录下的文件链
if(f!=0)
{
while(p->File_head->next!=0)//删除目录里的文件
{
f=p->File_head;
while(f->next->next!=0)
f=f->next;
this->dele_file(f->next);
f->next=0;
}
if(p->File_head->next==0)
{
this->dele_file(p->File_head);//删除头文件
p->File_head=0;
}
}
if(d!=0) //删除目录下的目录
{
while(p->Dir_head->next!=0)
{
d=p->Dir_head;
while(d->next->next!=0)
d=d->next;
this->dele_dir(d->next);
d->next=0;
}
if(p->Dir_head->next==0)
{
this->dele_dir(p->Dir_head);//删除目录链头结点
p->Dir_head=0;
}
}
delete p; //释放p占用的内存
p=0; //置0
return 1;
}
int Cuse::dis_now() //显示当前目录
{
DIR *d=Dhead;
UFD *f=Fhead;
if(now!=0)
{
d=now->Dir_head; //当前目录下的目录链
f=now->File_head;
}
if(d==0&&f==0)
{
cout<<"当前目录为空"<<endl;
return 0;
}
cout<<"当前目录大小:";
if(now==0)
cout<<length;
else
cout<<now->length;
cout<<endl;
if(d==0)
cout<<"当前目录下没有目录"<<endl;
else
{
cout<<"当前目录下包含如下目录:"<<endl;
cout<<setw(14)<<"目录名称"<<setw(14)<<"目录大小"<<endl;
while(d!=0)
{
cout<<setw(14)<<d->name<<setw(14)<<d->length<<endl;
d=d->next;
}
}
if(f==0)
cout<<"当前目录下没有文件"<<endl;
else
{
cout<<"当前目录下包含如下文件:"<<endl;
cout<<setw(14)<<"文件名称"<<setw(14)<<"文件大小"<<setw(14)<<"文件属性"<<endl;
while(f!=0)
{
cout<<setw(14)<<f->name<<setw(14)<<f->length<<setw(14)<<f->attribute<<endl;
f=f->next;
}
}
return 1;
}
int Cuse::open_file() //打开文件
{
char n[10];
cout<<"请输入要打开的文件名"<<endl;
cin>>n;
UFD *f=Fhead; //文件头指针
if(now!=0)
f=now->File_head; //指向文件
while(f!=0)
{
if(!strcmp(f->name,n))
{
cout<<"文件打开成功"<<endl;
return 1;
}
f=f->next;
}
cout<<"当前目录无此文件"<<endl;
return 0;
}
int Cuse::set_code() //设置密码
{
char a1[10],a2[10];
cout<<"请输入原密码"<<endl;
cin>>a1;
if(strcmp(a1,code))
{
cout<<"密码错误"<<endl;
return 0;
}
while(1)
{
cout<<"请输入新密码:"<<endl;
cin>>a1;
cout<<"再次输入新密码:"<<endl;
cin>>a2;
if(strcmp(a1,a2))
cout<<"两次输入密码不同,请重输!"<<endl;
else
{
strcpy(code,a1);
cout<<"密码修改成功!"<<endl;
break;
}
}
return 1;
}
DIR *Cuse::get_now() //得到当前目录路径
{
return now;
}
int Cuse::set_user(char *n,char *c)//建立用户与密码
{
strcpy(name,n);
strcpy(code,c);
status=1;
return 1;
}
void Cuse::set_status(int b)//标记分配
{
status=b;
}
int Cuse::get_status()//探取是否分配
{
return status;
}
const char* Cuse::get_code()//得到密码
{
return code;
}
const char* Cuse::get_name()//得到名字
{
return name;
}
int Cuse::get_length()//得到长度
{
return length;
}
int Cuse::dis_dir(DIR *d)//显示目录
{
if(d==0)
return 0;
if(d->above!=0)
this->dis_dir(d->above);//递归调用此功能
cout<<" "<<d->name<<'\\n';
return 0;
}
int Cuse::dis_file()//查看文件
{
int i;
char n[10];
UFD *f=Fhead;
if(now!=0)
f=now->File_head;
cout<<"请输入要查看的文件名:"<<endl;
cin>>n;
while(f!=0)
{
if(!strcmp(n,f->name)) //找到此文件,跳出
break;
f=f->next;
}
if(f==0)
{
cout<<"当前目录下没此文件"<<endl;
return 0;
}
if(f->attribute==0)
cout<<"此为只读文件,";
else
cout<<"此为读写文件,";
cout<<"占用硬盘块号如下:"<<endl;
for(i=0;i<f->length&&i<10;i++) //直接存放的
{
cout<<setw(6)<<f->a[i];
if((i+1)%10==0)
cout<<endl;
}
for(i=10;i<f->length&&i<110;i++) //一级索引存放的
{
cout<<setw(6)<<f->p1[i-10];
if((i+1)%10==0)
cout<<endl;
}
for(i=110;i<f->length;i++) //二级索引存放的
{
cout<<setw(6)<<f->p2[(i-110)/100][(i-110)%100];
if((i+1)%10==0)
cout<<endl;
}
cout<<endl;
return 1;
}
int Cuse::dele_user()//删除用户
{
length=0; //用户空间置0
Fhead=0;
Dhead=0;
now=0;
status=0;
return 1;
}
void main()
{
char c;
Cdisk D; //管理员类的对象
int i=1,n,flag=1,t=0;
while(flag)
{
cout<<"*******************欢迎使用文件系统**************************"<<endl;
cout<<endl;
cout<<"*** 1.管理员登陆"<<endl;
cout<<"*** 2.用户登陆"<<endl;
cout<<"*** 3.退出系统"<<endl;
cout<<endl;
cout<<"*************************************************************"<<endl;
cout<<"\\n请输入选择:";
cin>>c;
switch(c)
{
case '1':
n=D.login(c);
flag=1;
system("cls");
cout<<"管理员登陆成功!"<<endl;
while(flag)
{
cout<<"*************************************************************"<<endl;
cout<<"***1.创建用户"<<endl;
cout<<"***2.删除用户"<<endl;
cout<<"***3.查看当前用户"<<endl;
cout<<"***4.修改密码"<<endl;
cout<<"***5.返回登陆窗口"<<endl;
cout<<"*************************************************************"<<endl;
cout<<"请选择:";
cin>>c;
cout<<endl;
switch(c){
case '1':
D.new_user();
break;
case '2':
D.first_dele_user();
break;
case '3':
D.dis_disk();
break;
case '4':
{
if(t==0) //t作标记,防止重复设置密码出错
strcpy(D.code,"123");
D.set_code();
t++;
break;
}
case '5':
{
flag=0;
system("cls");
}
break;
default:
cout<<"请输入1-5!"<<endl;
}
}
flag=1;
break;
case '2':
n=D.login(c);
if(n==-1)
break;
while(flag)
{
cout<<"*************************************************************"<<endl;
cout<<"***1.创建文件"<<endl;
cout<<"***2.删除文件"<<endl;
cout<<"***3.创建目录"<<endl;
cout<<"***4.删除目录"<<endl;
cout<<"***5.打开目录"<<endl;
cout<<"***6.返回上一层目录"<<endl;
cout<<"***7.查看当前目录"<<endl;
cout<<"***8.修改密码"<<endl;
cout<<"***9.查看文件"<<endl;
cout<<"***0.安全退出"<<endl;
cout<<"*************************************************************"<<endl;
cout<<"用户:"<<D.user[n].get_name()<<'\\n'<<"目录为:\\n root\\n";
D.user[n].dis_dir(D.user[n].get_now());
cout<<endl;
cout<<"请输入选择:";
cin>>c;
cout<<endl;
switch(c)
{
case '1':
D.user[n].new_file();
break;
case '2':
D.user[n].first_dele_file();
break;
case '3':
D.user[n].new_dir();
break;
case '4':
D.user[n].first_dele_dir();
break;
case '5':
D.user[n].open_dir();
break;
case '6':
D.user[n].goback();
break;
case '7':
D.user[n].dis_now();
break;
case '8':
D.user[n].set_code();
break;
case '9':
D.user[n].dis_file();
break;
case '0':
{
flag=0;
system("cls");
}
break;
default:
cout<<"请输入0-9"<<endl;
}
}
flag=1;
break;
case '3':
flag=0;
break;
default:
cout<<"请输入1-3!"<<endl;
}
}
}
以上是关于操作系统文件系统设计实验报告的主要内容,如果未能解决你的问题,请参考以下文章