用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

c++模拟操作系统文件管理(cd create del lsall md rd)

2013-03-09 作者: 小蜜锋举报

[c++]代码库

#include<stdio.h>
#include<string.h>
#include<iostream.h>
#include<math.h>
#include<stdlib.h>
#include<iomanip.h>
 
// ******************目录和文件的结构定义******
typedef struct node
{
    char name[50]; /*目录或文件的名字*/
    int type; /*0代表目录,1代表普通文件*/
    struct node *next; /*指向下一个兄弟结点的指针*/
    struct node *sub; /*指向第一个子结点的指针*/
    struct node *father; /*指向父结点的指针*/
 
    int size; /*如果是文件则表示文件的大小*/
 
} dirNode;
 
dirNode *workDir; //定义当前工作目录
dirNode root; //定义根目录
 
char path[100]; //定义路径信息
 
//初始化函数
void initial()
{
    strcpy ( root.name,"root" );
    root.type=0;
    root.next=NULL;
    root.sub=NULL;
    root.father=NULL;
    root.size=0;
 
    workDir=&root;
 
    strcpy ( path,"root" );
}
 
//初始化新结点函数
dirNode *init()
{
    dirNode *p;
 
    p=new dirNode;
 
    strcpy ( root.name,"" );
    root.type=0;
    root.next=NULL;
    root.sub=NULL;
    root.father=NULL;
    root.size=0;
 
    return p;
}
 
//1 改变目录
void CD ( char dirName[] )
{
    dirNode *p;
    int flag=0;
 
    p=workDir->sub;
    if ( p==NULL )
    {
        cout<<"错误,\""<<dirName<<"\"子目录不存在"<<endl;
    }
    else
    {
        while ( p )
        {
            if ( p->type==0 )
            {
                if ( !strcmp ( p->name,dirName ) )
                {
                    flag=1;
                    break;
                }
            }
            p=p->next;
        }
        if ( flag==1 )
        {
            workDir=p;
            strcat ( path,"\\ " );
            strcat ( path,p->name );
            cout<<"工作目录已进入\""<<dirName<<"\""<<endl;
        }
        else
        {
            cout<<"错误,\""<<dirName<<"\"子目录不存在"<<endl;
        }
    }
}
 
//2 创建文件
void CREATE ( char fileName[],int fileSize )
{
    int flag;
    dirNode *p,*q;
 
    q=new dirNode;
    strcpy ( q->name,fileName );
    q->sub=NULL;
    q->type=1;
    q->next=NULL;
    q->father=workDir;
    q->size=fileSize;
 
    p=workDir->sub;
 
    if ( p==NULL )
    {
        workDir->sub=q;
        cout<<"\""<<fileName<<"\"文件创建成功"<<endl;
    }
    else
    {
        flag=0;
        while ( p )
        {
            if ( p->type==1 )
            {
                if ( !strcmp ( p->name,fileName ) )
                {
                    flag=1;
                    cout<<"错误,\""<<fileName<<"\"文件已存在"<<endl;
                }
            }
            p=p->next;
        }
        if ( flag==0 )
        {
            p=workDir->sub;
            while ( p->next )
            {
                p=p->next;
            }
            p->next=q;
            cout<<"\""<<fileName<<"\"文件创建成功"<<endl;
        }
    }
}
 
//3 删除文件
void DEL ( char fileName[] )
{
    dirNode *p,*q;
    int flag=0;
 
    p=workDir->sub;
    if ( p==NULL )
    {
        cout<<"错误,\""<<fileName<<"\"文件不存在"<<endl;
    }
    else
    {
        while ( p )
        {
            if ( p->type==1 )
            {
                if ( !strcmp ( p->name,fileName ) )
                {
                    flag=1;
                    break;
                }
            }
            p=p->next;
        }
        if ( flag==1 )
        {
            if ( p==workDir->sub )
            {
                workDir->sub=p->next;
            }
            else
            {
                q=workDir->sub;
                while ( q->next!=p )
                {
                    q=q->next;
                }
                q->next=p->next;
                delete p;
            }
            cout<<"\""<<fileName<<"\"文件已删除"<<endl;
        }
        else
        {
            cout<<"错误,\""<<fileName<<"\"文件不存在"<<endl;
        }
    }
 
}
 
//4 显示所有目录
 
//显示本目录下所有兄弟目录和文件
void dir ( dirNode *p )
{
    while ( p )
    {
        if ( p->type==0 )
        {
            cout.setf ( 2 );
            cout<<setw ( 14 ) <<p->name<<setw ( 12 ) <<"<DIR>"<<endl;
        }
        else
        {
            cout.setf ( 2 );
            cout<<setw ( 14 ) <<p->name<<setw ( 12 ) <<"<FILE>"<<setw ( 10 ) <<p->size<<endl;
        }
        p=p->next;
    }
}
//
void dirs ( dirNode *p,char str[] )
{
    char newstr[100];
    dirNode *q;
    cout<<str<<"下子目录及文件:"<<endl;
    dir ( p );
 
    q=p;
    if ( q->sub )
    {
        strcpy ( newstr,"" );
        strcat ( newstr,str );
        strcat ( newstr,"\\" );
        strcat ( newstr,q->name );
 
        dirs ( q->sub,newstr );
    }
    q=p;
    while ( q->next )
    {
        if ( q->next->sub )
        {
            strcpy ( newstr,"" );
            strcat ( newstr,str );
            strcat ( newstr," \\" );
            strcat ( newstr,q->next->name );
 
            dirs ( q->next->sub,newstr );
        }
        q=q->next;
    }
}
 
// 显示所有目录
void LSALL()
{
    dirNode *p;
 
    cout<<"显示所有目录结构"<<endl<<"--------------------------------------------"<<endl;
 
    p=root.sub;
 
    dirs ( p,"root" );
 
 
}
//5 创建目录
void MD ( char dirName[] )
{
    int flag;
    dirNode *p,*q;
 
    q=new dirNode;
    strcpy ( q->name,dirName );
    q->sub=NULL;
    q->type=0;
    q->next=NULL;
    q->father=workDir;
    q->size=0;
 
    p=workDir->sub;
 
    if ( p==NULL )
    {
        workDir->sub=q;
        cout<<"\""<<dirName<<"\"子目录创建成功"<<endl;
    }
    else
    {
        flag=0;
        while ( p )
        {
            if ( p->type==0 )
            {
                if ( !strcmp ( p->name,dirName ) )
                {
                    flag=1;
                    cout<<"错误,\""<<dirName<<"\"子目录已存在"<<endl;
                }
            }
            p=p->next;
        }
        if ( flag==0 )
        {
            p=workDir->sub;
            while ( p->next )
            {
                p=p->next;
            }
            p->next=q;
            cout<<"\""<<dirName<<"\"子目录创建成功"<<endl;
        }
    }
}
 
//6 删除目录
void RD ( char dirName[] )
{
    /*
    删除当前目录下的指定目录,如果该目录为空,则可删除,否则应提示是否
    作删除,删除操作将该目录下的全部文件和子目录都删除
 
    这题目有点问题,因为CD只要求完成改变到当前目录的某一个子目录
    下的功能,不要求实现相对目录以及绝对目录。所以不进入子目录是不可能在子目录下再建子目录或文件的。
    因此只要实现删除工作目录的子目录就可以了,不要去管“如果该目录为空,则可删除,否则应提示是否
    作删除,删除操作将该目录下的全部文件和子目录都删除”。
    */
    dirNode *p,*q;
    int flag=0;
 
    p=workDir->sub;
    if ( p==NULL )
    {
        cout<<"错误,\""<<dirName<<"\"子目录不存在"<<endl;
    }
    else
    {
        while ( p )
        {
            if ( p->type==0 )
            {
                if ( !strcmp ( p->name,dirName ) )
                {
                    flag=1;
                    break;
                }
            }
            p=p->next;
        }
        if ( flag==1 )
        {
            if ( p==workDir->sub )
            {
                workDir->sub=p->next;
            }
            else
            {
                q=workDir->sub;
                while ( q->next!=p )
                {
                    q=q->next;
                }
                q->next=p->next;
                delete p;
            }
            cout<<"\""<<dirName<<"\"子目录已删除"<<endl;
        }
        else
        {
            cout<<"错误,\""<<dirName<<"\"子目录不存在"<<endl;
        }
    }
 
 
}
 
//显示版权信息函数
void version()
{
    cout<<endl<<endl;
 
    cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;
    cout<<" ┃     模拟文件管理模拟系统        ┃"<<endl;
    cout<<" ┠───────────────────────┨"<<endl;
    cout<<" ┃   (c)All Right Reserved Neo       ┃"<<endl;
    cout<<" ┃      sony006@163.com          ┃"<<endl;
    cout<<" ┃     version 2004 build 1122      ┃"<<endl;
    cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;
 
    cout<<endl<<endl;
}
 
void main()
{
    int len,fileSize,flag,comm;
 
    char string[50];
    char command[10];
    char name[40];
    char *s,*s1;
 
    version();
 
    initial();
 
 
    flag=1;
    while ( flag )
    {
        cout<<endl<<" 模拟文件管理模拟系统"<<endl;
        cout<<endl<<"CD 改变目录 CREATE 创建文件 DEL 删除文件 "<<endl<<"LSALL 显示目录 MD 创建目录 RD 删除目录"<<endl<<"exit 退出"<<endl;
        cout<<endl<<"-----------------------------------------------"<<endl;
        printf ( "%s:>#",path );
 
        gets ( string );
        len=strlen ( string );
 
        if ( len==0 )
        {
            strcpy ( command,"errer" );
        }
        else
        {
//获得命令
            s=NULL;
            s=strchr ( string,' ' );
            if ( s!=NULL )
            {
                *s='\0';
            }
            strcpy ( command,string );
 
//测试命令类型
            if ( ( !strcmp ( command,"CD" ) ) ||!strcmp ( command,"cd" ) )
            {
                comm=1;
            }
            else
            {
                if ( ( !strcmp ( command,"CREATE" ) ) ||!strcmp ( command,"create" ) )
                {
                    comm=2;
                }
                else
                {
                    if ( ( !strcmp ( command,"DEL" ) ) ||!strcmp ( command,"del" ) )
                    {
                        comm=3;
                    }
                    else
                    {
                        if ( ( !strcmp ( command,"LSALL" ) ) ||!strcmp ( command,"lsall" ) )
                        {
                            comm=4;
                        }
                        else
                        {
                            if ( ( !strcmp ( command,"MD" ) ) ||!strcmp ( command,"md" ) )
                            {
                                comm=5;
                            }
                            else
                            {
                                if ( ( !strcmp ( command,"RD" ) ) ||!strcmp ( command,"rd" ) )
                                {
                                    comm=6;
                                }
                                else
                                {
                                    if ( ( !strcmp ( command,"EXIT" ) ) ||!strcmp ( command,"exit" ) )
                                    {
                                        comm=0;
                                    }
                                    else
                                    {
                                        comm=100;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            switch ( comm )
            {
            case 1:
//1 改变目录
                strcpy ( name,s+1 );
                CD ( name );
                break;
            case 2:
//2 创建文件
                s1=strchr ( s+1,' ' );
                *s1='\0';
                strcpy ( name,s+1 );
                fileSize=atoi ( s1+1 );
                CREATE ( name,fileSize );
                break;
            case 3:
//3 删除文件
                strcpy ( name,s+1 );
                DEL ( name );
                break;
            case 4:
//4 显示目录
                LSALL();
                break;
            case 5:
//5 创建目录
                strcpy ( name,s+1 );
                MD ( name );
                break;
            case 6:
//6 删除目录
                strcpy ( name,s+1 );
                RD ( name );
                break;
            case 0:
//0 退出系统
                flag=0;
                break;
            default:
                cout<<"命令错误"<<endl;
            }
        }
    }
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...