📄 disk.cpp
字号:
#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<<endl;
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -