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

📄 main.c

📁 是对文件管理的一种模拟演示
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <Stdio.h>
#include <Conio.h>
#include <stdlib.h>
#include <string.h>
struct usernode{                  /*用户结点定义*/
    int  struction;                  /*1为管理员,0为普通用户*/
    char name[20];
    struct usernode *next;
}*head=NULL,*p,*w;
typedef struct usernode Usernode;


struct catalog{                      /*文件目录结点定义*/
    char name[20];
    char creator[20];
    int  struction;                        /*当为目录时为1,当为文件时为0*/
    struct catalog *parent,*leftchild,*rightsibling;
        /*定义父亲结点、最左子树、右兄弟*/
}*root=NULL,*q;

typedef struct catalog Catalog;
 
void choose();
void creatcatalog();
void deletecatalog();
void opencatalog();
void creatfile();
void renamefile();
void checkfile();
void movefile();
void deletefile();
void login();
void land();
void deleteuser();
void returncatalog();
void print(Catalog *now);


/**********************************************************************************/

void creatcatalog()          /*创建目录函数*/
{
    int z,c=0,d=1;
    char named[20];
    Catalog *t,*newcatalog;
    newcatalog=(Catalog*)malloc(sizeof(Catalog));
    printf("\n当前的目录为%s,输入新建子目录名:",q->name);
    scanf("%s",named);
    if(q->leftchild!=NULL)                 /*如果当前目录的最左子树不为空*/
    {
        t=q->leftchild;
        while(t!=NULL && d==1)             /*查询是否存在相同命名的目录*/
        {
            d=0;
            for(z=0;(z<=19 && named[z]!='\0') || (t->name[z]!='\0' && z<=19);z++)
                if(named[z]!=t->name[z])
                    d=1;
            if(d==1)
                t=t->rightsibling;
        }
        if(t!=NULL && t->struction==1)      /*存在相同命名时*/
        {
            printf("\n此目录已存在!");
            c=1;
        }
        else
            for(z=0;z<=19;z++)               /*对新目录名赋值*/
                newcatalog->name[z]=named[z];
    }
    if(c==0)
    {
        if(q->leftchild==NULL)              /*当当前目录的最左子树为空时,直接赋值*/
        {
            q->leftchild=newcatalog;
            for(z=0;z<=19;z++)
                newcatalog->name[z]=named[z];
        }
        else
        {                                     /*当最左子树不为空时*/
            t=q->leftchild;
            while(t->rightsibling!=NULL)     /*将新建目录插入到当前目录的最右子树中*/
                t=t->rightsibling;
            t->rightsibling=newcatalog;
        }
        for(z=0;z<=19;z++)
            newcatalog->creator[z]=p->name[z];  /*对新建目录的其它属性赋值*/
        newcatalog->parent=q;
        newcatalog->leftchild=NULL;
        newcatalog->rightsibling=NULL;
        newcatalog->struction=1;
        print(q);
    }
}

/**********************************************************************************/

void deletecatalog()                       /*删除目录函数*/
{
    int z,b=0,d=1;
    Catalog *k=q->leftchild,*l=q;
    char named[20];
    print(q);
    if(q->leftchild==NULL)                 /*当最左子树为空*/
        printf("\n没有可以删除的目录");
    else
    {
        while(k!=NULL && k->struction==0)  /*查询当最左子树不为空时,是否存在子目录*/
        k=k->rightsibling;
        if(k==NULL)
            printf("\n没有可以删除的目录");
        else
        {                                /*当存在子目录时*/
            printf("\n输入要删除的目录名:");
            scanf("%s",named);
            while(k!=NULL && d==1)                        /*查询是否有匹配的子目录名*/
            {
                d=0;
                for(z=0;(z<=19 && named[z]!='\0') || (k->name[z]!='\0' && z<=19);z++)
                    if(named[z]!=k->name[z])
                        d=1;
                if(d==1)
                {
                    l=k;
                    k=k->rightsibling;
                }
            }
            if(k==NULL)
                printf("\n不存在此目录!");
            else
            {                                      /*找到匹配子目录时*/
                for(z=0;z<=19;z++)
                {
                    if(k->creator[z]!=p->name[z]) /*查询此子目录的创建者是否为当前用户*/
                        b=1;
                }
                if(b==1)                           /*当当前用户不为创建者*/
                    printf("\n你不能删除此目录!");
                else
                {
                    if(l==q)                       /*删除目录*/
                        q->leftchild=k->rightsibling;
                    else
                        l->rightsibling=k->rightsibling;
                    printf("\n删除目录成功!");
                    print(q);
                }
            }
        }
    }
}

/**********************************************************************************/

void opencatalog()                           /*打开目录函数*/
{
    int d=1,z;
    Catalog *t;
    char named[20];
    t=q;
    print(q);
    if(q->leftchild==NULL)                    /*当最左子树为空*/
    printf("没有可以打开的目录!");
    else
    {
        q=q->leftchild;
        while(q!=NULL && q->struction==0) /*查询当最左子树不为空时,是否存在子目录*/
            q=q->rightsibling;
        if(q==NULL)                      /*不存在子目录*/
        {
            printf("\n没有可以打开的目录!");
            q=t;
        }
        else
        {
            printf("\n输入要打开的目录:");
            scanf("%s",named);
            while(q!=NULL && d==1)         /*查询是否存在要打开的目录名*/
            {
                d=0;
                for(z=0;(z<=19 && named[z]!='\0') || (q->name[z]!='\0' && z<=19);z++)
                    if(named[z]!=q->name[z])
                d=1;
                if(d==1)
                    q=q->rightsibling;   /*当找到要打开的目录或者不存在此目录时停止循环*/
            }
            if(q==NULL)
            {
                printf("\n不存在此目录!");
                q=t;
            }
        }
        print(q);                                     /*输出当前目录状态*/
    }
}

/**********************************************************************************/

void creatfile()                                  /*创建文件函数*/
{
    int z,c=0,d=1;
    char named[20];
    Catalog *t,*newfile;
    newfile=(Catalog*)malloc(sizeof(Catalog));
    printf("\n当前的目录为%s,输入新建文件名:",q->name);
    scanf("%s",named);
    if(q->leftchild!=NULL)         /*如果当前目录的最左子树不为空*/
    {
        t=q->leftchild;
        while(t!=NULL && d==1)    /*查询是否存在相同命名的文件*/
        {
            d=0;
            for(z=0;(z<=19 && named[z]!='\0') || (t->name[z]!='\0' && z<=19);z++)
                if(named[z]!=t->name[z])
                    d=1;
            if(d==1)
                t=t->rightsibling;
        }
        if(t!=NULL && t->struction==0)       /*存在相同命名时*/
        {
            printf("\n此文件已存在!");
            c=1;
        }
        else
            for(z=0;z<=19;z++)                  /*对新文件名赋值*/
                newfile->name[z]=named[z];
    }
    if(c==0)
    {
        if(q->leftchild==NULL)           /*当当前目录的最左子树为空时,直接赋值*/
        {
            q->leftchild=newfile;
            for(z=0;z<=19;z++)
                newfile->name[z]=named[z];
        }
        else
        {                                       /*当最左子树不为空时*/
            t=q->leftchild;
            while(t->rightsibling!=NULL)  /*将新建文件插入到当前目录的最右子树中*/
                t=t->rightsibling;
            t->rightsibling=newfile;
        }
        for(z=0;z<=19;z++)                 /*对新建文件的其它属性赋值*/
            newfile->creator[z]=p->name[z];
        newfile->parent=q;
        newfile->leftchild=NULL;
        newfile->rightsibling=NULL;
        newfile->struction=0;
        print(q);
    }
}

/**************************************************************************/

void renamefile()                             /*文件重命名函数*/
{
    Catalog *k=q->leftchild,*t=q;
    int z,d=1;
    char named[20];
    char namedn[20];
    print(q);
    if(q->leftchild==NULL)                         /*当最左子树为空*/
        printf("\n没有可以重命名的文件");
    else
    {
        while(k!=NULL && k->struction==1) /*查询当最左子树不为空时,是否存在文件*/
            k=k->rightsibling;
        if(k==NULL)
            printf("\n没有可以重命名的文件");
        else
        {
            printf("\n输入要重命名的文件名:");
            scanf("%s",named);
            while(k!=NULL && d==1)       /*查询是否有符合命名的文件*/
            {
                d=0;
                for(z=0;(z<=19 && named[z]!='\0') || (k->name[z]!='\0' && z<=19);z++)
                    if(named[z]!=k->name[z])
                        d=1;
                if(d==1)
                k=k->rightsibling;
            }
            if(k==NULL)
                printf("\n不存在此文件!");
            else
            {
                d=1;
                for(z=0;z<=19;z++)     /*查询当前用户是否为文件创建者*/
                {
                    if(k->creator[z]!=p->name[z])
                        d=0;
                }
                if(d==0)                              /*如果不是文件创建者*/
                    printf("\n你没有权限重命名此文件!");
                else
                {
                    printf("\n输入新的文件名:");
                    scanf("%s",namedn);
                    k=q->leftchild;
                    d=1;
                    while(k!=NULL && d==1)    /*查询新文件名是否已存在*/
                    {
                        d=0;
                        for(z=0;(z<=19&&namedn[z]!='\0')||(k->name[z]!='\0'&& z<=19);z++)
                            if(namedn[z]!=k->name[z])
                                d=1;
                        if(d==1)
                            k=k->rightsibling;
                    }
                    if(k!=NULL)
                        printf("\n已存在此文件名!");

                    else
                    {
                        k=q->leftchild;
                        while(k!=NULL && d==1)  /*找到要重命名的文件*/
                        {
                            d=0;
                            for(z=0;(z<=19 && named[z]!='\0') || (k->name[z]!='\0' && z<=19);z++)
                                if(named[z]!=k->name[z])
                                    d=1;
                            if(d==1)
                            {
                                t=k;
                                k=k->rightsibling;
                            }
                        }
                        if(t==q)                  /*重命名操作*/
                            q->leftchild=k->rightsibling;
                        else
                            t->rightsibling=k->rightsibling;
                        k=(Catalog*)malloc(sizeof(Catalog));
                        for(z=0;z<=19;z++)
                            k->name[z]=namedn[z];
                        if(q->leftchild==NULL)
                            q->leftchild=k;
                        else
                        {
                            t=q->leftchild;
                            while(t->rightsibling!=NULL)
                                t=t->rightsibling;
                            t->rightsibling=k;
                        }
                        for(z=0;z<=19;z++)
                            k->creator[z]=p->name[z];
                        k->parent=q;
                        k->leftchild=NULL;
                        k->rightsibling=NULL;
                        k->struction=0;
                        printf("\n操作成功!");
                    }
                }
            }
        }
    }
    print(q);
}

/**********************************************************************************/

void checkfile()                 /*查看文件信息函数*/
{
    Catalog *k=q->leftchild;
    int z,d=1;
    char named[20];
    char namedn[20];
    print(q);
    if(q->leftchild==NULL)                         /*当最左子树为空*/
        printf("\n没有可以查看的文件");
    else
    {
        while(k!=NULL && k->struction==1)/*查询当最左子树不为空时,是否存在文件*/
            k=k->rightsibling;
        if(k==NULL)
            printf("\n没有可以查看的文件");
        else
        {
            printf("\n输入要查看的文件名:");
            scanf("%s",named);
            while(k!=NULL && d==1)     /*查询是否有符合命名的文件*/
            {
                d=0;
                for(z=0;(z<=19 && named[z]!='\0') || (k->name[z]!='\0' && z<=19);z++)
                    if(named[z]!=k->name[z])
                        d=1;
                if(d==1)
                    k=k->rightsibling;
            }
            if(k==NULL)
                printf("\n不存在此文件!");
            else
                printf("文件名:%s \n文件创建者:%s\n",k->name,k->creator);
        }
    }
}

/**********************************************************************************/

void movefile()                                    /*移动文件函数*/
{
    Catalog *k=q->leftchild,*t=q,*s,*b;
    int z,e=0,d=1;
    char named[20];
    print(q);
    if(q->leftchild==NULL)                        /*最左子树为空*/
        printf("\n没有可以移动的文件");
    else
    {
        while(k!=NULL && k->struction==1) /*当最左子树不为空时*/
            k=k->rightsibling;            /*当前目录是否存在文件*/
        if(k==NULL)
            printf("\n没有可以移动的文件");
        else
        {
            k=q->leftchild;
            printf("\n输入要移动的文件名:");
            scanf("%s",named);
            while(k!=NULL && d==1)              /*查询是否存在此文件*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -