⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 disk.cpp

📁 一个模拟操作系统的文件操作系统
💻 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 + -