操作系统实习写的模拟操作系统文件系统程序,觉得写的不错,放到这保存一下.
#include
"
disk.h
"
#include < string .h >
#include < iostream.h >
#include < iomanip.h >
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("jun","123");
disk_empty=10000;
cout.setf(ios::left);
}
Cdisk:: ~ Cdisk()
... {
}
int Cdisk::dele_user( int i)
... {
Cuse C;
C=user[i];
user[i].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 n[10],c[10];
int i;
cout<<"请输入用户名与密码,中间用空格隔开"<<endl;
cin>>n>>c;
for(i=0;i<5;i++)
...{
if(user[i].get_status())
if(!strcmp(n,user[i].get_name()))
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))
...{
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);
}
return 1;
}
int Cdisk::new_user()
... {
char n[10],c[10];
int i=0;
for(i=0;i<5;i++)
if(user[i].get_status()==0)
break;
if(i==5)
...{
cout<<"已经达到最大用户个数,不能创建"<<endl;
return 0;
}
user[i].set_status(1);
cout<<"请输入用户名称"<<endl;
cin>>n;
cout<<"请输入密码"<<endl;
cin>>c;
user[i].set_user(n,c);
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++)
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')
...{
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 *p=0;
p=new UFD;
if(p==0)
...{
cout<<"无可用内存空间,创建文件失败"<<endl;
return 1;
}
cout<<"请输入建立的文件的名称,长度,属性(0:只读,1:读写"<<endl;
cin>>p->name>>p->length>>p->attribute;
if(p->length>disk_empty)
...{
cout<<"作业太大,当前硬盘可用空间为:"<<disk_empty<<endl;
delete p;
return 0;
}
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)//一级索引的实现
...{
p->p1=new int[100];
for(i=10;i<p->length&&i<110;i++)
for(j;j<10000;j++)
if(disk_block[j]==0)
...{
( p->p1)[i-10]=j;
disk_block[j]=1;
j++;
break;
}
if(p->length>110)//二级索引的实现
...{
p->p2=new int[100][100];
for(i=110;i<p->length;i++)
for(j;j<10000;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;
DIR *h=now;
while(h!=0)
...{
h->length+=p->length;
h=h->above;
}
}
cout<<"文件创建成功"<<endl;
disk_empty=disk_empty-p->length;
length+=p->length;
return 1;
}
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;
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;
p->next=Dhead;
Dhead=p;
}
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;
cout<<"请输入你要打开的目录名称"<<endl;
cin>>name;
int flag=0;
while(p!=0)
...{
if(strcmp(p->name,name)==0)
...{
now=p;
return 1;
}
p=p->next;
}
cout<<"当前目录没有这个目录"<<endl;
return 0;
}
int Cuse::first_dele_file()
... {
char temp[10];
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;
}
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->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;
}
}
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=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<<'/';
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;
}
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;
Fhead=0;
Dhead=0;
now=0;
status=0;
return 1;
}
#include " disk.h "
#include < string .h >
#include < iostream.h >
void main()
... {
char c;
Cdisk D;//声明管理员类的对象;
int i=1,n,flag=1;
cout<<"可使用用户名jun密码123登陆,也可使用管理员登陆后自行创建用户登陆"<<endl;
while(flag)
...{
cout<<"******************************"<<endl;
cout<<"***1.管理员登陆 ****"<<endl;
cout<<"***2.用户登陆 ****"<<endl;
cout<<"***3.退出 ****"<<endl;
cout<<"******************************"<<endl;
cout<<"请输入选择:";
cin>>c;
switch(c)
...{
case'1':flag=1;
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;
switch(c)
...{
case '1':D.new_user();
break;
case '2':D.first_dele_user();
break;
case '3':D.dis_disk();
break;
case '4':D.set_code();
break;
case '5':flag=0;
break;
default:cout<<"请输入1-5"<<endl;
}
}
flag=1;
break;
case'2':n=D.login();
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()<<'/';
D.user[n].dis_dir(D.user[n].get_now());
cout<<endl;
cout<<"请输入选择:";
cin>>c;
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;
break;
default: cout<<"请输入0-9"<<endl;
}
}
flag=1;
break;
case'3':flag=0;
break;
default:cout<<"请输入1-3"<<endl;
}
}
}
#include < string .h >
#include < iostream.h >
#include < iomanip.h >
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("jun","123");
disk_empty=10000;
cout.setf(ios::left);
}
Cdisk:: ~ Cdisk()
... {
}
int Cdisk::dele_user( int i)
... {
Cuse C;
C=user[i];
user[i].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 n[10],c[10];
int i;
cout<<"请输入用户名与密码,中间用空格隔开"<<endl;
cin>>n>>c;
for(i=0;i<5;i++)
...{
if(user[i].get_status())
if(!strcmp(n,user[i].get_name()))
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))
...{
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);
}
return 1;
}
int Cdisk::new_user()
... {
char n[10],c[10];
int i=0;
for(i=0;i<5;i++)
if(user[i].get_status()==0)
break;
if(i==5)
...{
cout<<"已经达到最大用户个数,不能创建"<<endl;
return 0;
}
user[i].set_status(1);
cout<<"请输入用户名称"<<endl;
cin>>n;
cout<<"请输入密码"<<endl;
cin>>c;
user[i].set_user(n,c);
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++)
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')
...{
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 *p=0;
p=new UFD;
if(p==0)
...{
cout<<"无可用内存空间,创建文件失败"<<endl;
return 1;
}
cout<<"请输入建立的文件的名称,长度,属性(0:只读,1:读写"<<endl;
cin>>p->name>>p->length>>p->attribute;
if(p->length>disk_empty)
...{
cout<<"作业太大,当前硬盘可用空间为:"<<disk_empty<<endl;
delete p;
return 0;
}
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)//一级索引的实现
...{
p->p1=new int[100];
for(i=10;i<p->length&&i<110;i++)
for(j;j<10000;j++)
if(disk_block[j]==0)
...{
( p->p1)[i-10]=j;
disk_block[j]=1;
j++;
break;
}
if(p->length>110)//二级索引的实现
...{
p->p2=new int[100][100];
for(i=110;i<p->length;i++)
for(j;j<10000;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;
DIR *h=now;
while(h!=0)
...{
h->length+=p->length;
h=h->above;
}
}
cout<<"文件创建成功"<<endl;
disk_empty=disk_empty-p->length;
length+=p->length;
return 1;
}
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;
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;
p->next=Dhead;
Dhead=p;
}
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;
cout<<"请输入你要打开的目录名称"<<endl;
cin>>name;
int flag=0;
while(p!=0)
...{
if(strcmp(p->name,name)==0)
...{
now=p;
return 1;
}
p=p->next;
}
cout<<"当前目录没有这个目录"<<endl;
return 0;
}
int Cuse::first_dele_file()
... {
char temp[10];
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;
}
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->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;
}
}
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=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<<'/';
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;
}
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;
Fhead=0;
Dhead=0;
now=0;
status=0;
return 1;
}
#include " disk.h "
#include < string .h >
#include < iostream.h >
void main()
... {
char c;
Cdisk D;//声明管理员类的对象;
int i=1,n,flag=1;
cout<<"可使用用户名jun密码123登陆,也可使用管理员登陆后自行创建用户登陆"<<endl;
while(flag)
...{
cout<<"******************************"<<endl;
cout<<"***1.管理员登陆 ****"<<endl;
cout<<"***2.用户登陆 ****"<<endl;
cout<<"***3.退出 ****"<<endl;
cout<<"******************************"<<endl;
cout<<"请输入选择:";
cin>>c;
switch(c)
...{
case'1':flag=1;
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;
switch(c)
...{
case '1':D.new_user();
break;
case '2':D.first_dele_user();
break;
case '3':D.dis_disk();
break;
case '4':D.set_code();
break;
case '5':flag=0;
break;
default:cout<<"请输入1-5"<<endl;
}
}
flag=1;
break;
case'2':n=D.login();
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()<<'/';
D.user[n].dis_dir(D.user[n].get_now());
cout<<endl;
cout<<"请输入选择:";
cin>>c;
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;
break;
default: cout<<"请输入0-9"<<endl;
}
}
flag=1;
break;
case'3':flag=0;
break;
default:cout<<"请输入1-3"<<endl;
}
}
}
使用混合索引分配方式来为存储文件所在外存的块号,以多级目录结构来组织目录,以位示图法对文件存储空间进行管理,
源代码
//
disk.h: interface for the Cdisk class.
//
/**/ //
#if !defined(AFX_DISK_H__1FAB24AE_C718_49FF_A915_94211192B8BC__INCLUDED_)
#define AFX_DISK_H__1FAB24AE_C718_49FF_A915_94211192B8BC__INCLUDED_
#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];
int *p1;//一级索引
int (*p2)[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];
char code[10];
int dis_disk();
int first_dele_user();
int dele_user(int);
int new_user();//查看当前用户信息与外存空间使用情况
int set_code();
int login();//用户登陆
Cdisk();
virtual ~Cdisk();
} ;
#endif // !defined(AFX_DISK_H__1FAB24AE_C718_49FF_A915_94211192B8BC__INCLUDED_)
//
/**/ //
#if !defined(AFX_DISK_H__1FAB24AE_C718_49FF_A915_94211192B8BC__INCLUDED_)
#define AFX_DISK_H__1FAB24AE_C718_49FF_A915_94211192B8BC__INCLUDED_
#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];
int *p1;//一级索引
int (*p2)[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];
char code[10];
int dis_disk();
int first_dele_user();
int dele_user(int);
int new_user();//查看当前用户信息与外存空间使用情况
int set_code();
int login();//用户登陆
Cdisk();
virtual ~Cdisk();
} ;
#endif // !defined(AFX_DISK_H__1FAB24AE_C718_49FF_A915_94211192B8BC__INCLUDED_)