模拟操作系统文件系统

      操作系统实习写的模拟操作系统文件系统程序,觉得写的不错,放到这保存一下.

#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;
        }

    }

}

   


  使用混合索引分配方式来为存储文件所在外存的块号,以多级目录结构来组织目录,以位示图法对文件存储空间进行管理, 

       源代码

//  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 // 存储文件信息
... 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_)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值