操作系统实验三 文件管理

#include "尝试1.h"


//int flag = 0;



/*********************************************************************************************************************************/
//磁盘初始化
void i_disc()
{
    for (int i = 0; i < discnumber; i++)
    {
        dnum[i].disc_f = 0;
        for (int j = 0; j < 10; j++)
        {
            dnum[i].file_include[j] = { 0 };
            dnum[i].file_name[j] = { 0 };
        }


        for (int j = 0; j < 16; j++)
        {
            dnum[i].root_user_name[j] = { 0 };
        }

        for (int j = 0; j < 8; j++)
        {
            dnum[i].root_user_hank[j] = { 0 };
        }

        dnum[i].next = NULL;
        for (int j = 0; j < discnumber; j++)
        {
            dnum[i].file_table[j] = NULL;
        }

        dnum[i].root_exist = 0;
    }
}

void disc_manage()
{
    printf("位图:\n");
    printf(" ");
    for (int i = 0; i < discnumber; i++)
    {
        printf("%d ", dnum[i].disc_f);
        if ((i + 1) % 10 == 0 && i != 0)
        {
            printf("\n");
            printf(" ");
        }
    }
    printf("\n");
}


/*********************************************************************************************************************************/
//注册
int input()//将用户注册的节点连上
{
    Users* ptr;
    p = getpch(Users);
    p->hank = NULL;
    p->num = 0;
    p->flag = 0;
    printf("请输入用户名:");
    scanf("%s", p->name);
    if (ready != NULL)
    {
        Users* pr = ready;
        do
        {
            pr = pr->link;
            if (strcmp(pr->name, p->name) == 0)
            {
                free(p);
                return 0;
            }
        } while (pr->link != NULL);
    }
    printf("请输入密码:");
    scanf("%s", p->password);
    p->link = NULL;
    if (ready == NULL)
    {
       ptr = getpch(Users);//创立头结点
       ready = ptr;
       first = ptr;
       for (int i = 0; i < 16; i++)
       {
           ready->name[i] = { 0 };
           ready->password[i] = { 0 };
       }

    }
    first->link = p;
    first = p;
    first->link = NULL;
    first->num = n;
    n++;
    return 1;
}

void registers()//注册 
{
    if (input() == 0)
    {
        printf("用户已存在!\n");
    }
    else
    {
        printf("用户名:%s\n", first->name);
        printf("密码:%s\n", first->password);
        printf("注册成功!\n");
    }
}

/**********************************************************************************************************************/
//磁盘创建
int creat_hank(int m)
{
    Hank* ptr = h[m];
    if (last[m] == h[m])//建立磁盘
    {
        printf("当前未建立磁盘,请输入磁盘名称建立新磁盘:");
    }
    else
    {
        printf("请输入新磁盘名称:");
    }
    q[m] = getpch(Hank);
    scanf("%s", q[m]->nameh);

    while (ptr->link != NULL)
    {
       ptr = ptr->link;
       //printf("ptr->name = %s\n", ptr->nameh);
       if (strcmp(ptr->nameh, q[m]->nameh) == 0)
       {
          free(q[m]);
          return 0;
        }
    }
    last[m]->link = q[m];
    last[m] = q[m];
    last[m]->link = NULL;
    return 1;
}

void create_newhank(int m)//磁盘创建
{
    if (creat_hank(m) == 0)
    {
        printf("磁盘名称重复!\n");
    }
    else
    {
        printf("磁盘创建成功!\n");
        printf("新磁盘为:%s\n", q[m]->nameh);
    }
}

/*************************************************************************************************************************************/
//磁盘功能
void change_hank(int m)//更换磁盘
{
    int flag = 0;
    q[m] = h[m];
    char sname[8] = { 0 };
    printf("请输入盘符名称:");
    scanf("%s", sname);
    do
    {
        q[m] = q[m]->link;
        if (strcmp(q[m]->nameh, sname) == 0)
        {
            printf("更改成功,当前磁盘是:%s\n", q[m]);
            flag = 1;
            break;
        }
    } while (q[m]->link != NULL);
    if (flag == 0)
    {
        printf("未找到相应名称的磁盘!\n");
    }
}

void search_hank(int m)//磁盘查询
{
    Hank* k = q[m];
    q[m] = h[m];
    do
    {
        q[m] = q[m]->link;
        printf("磁盘名称:%s\n", q[m]->nameh);
    } while (q[m]->link != NULL);
    q[m] = k;
}


/***********************************************************************************************************************/
//文件功能
//在结构体数组里做表,表指向块首地址 块和块直接由下标链接;
int search_root_disc(int m)//查找用户磁盘块
{
    //printf("p->name = %s\n", p->name);
    for (int i = 0; i < discnumber; i++)
    {
        //printf("q[m]->namehe = %s\n", q[m]->nameh);
        //printf("dnum[i].root_user_hank = %s\n", dnum[i].root_user_hank);
        //printf("dnum[i].root_user_name = %s\n", dnum[i].root_user_hank);
        if (strcmp(p->name, dnum[i].root_user_name) == 0 && strcmp(q[m]->nameh, dnum[i].root_user_hank) == 0)//是此用户的当前磁盘块
        {
            if (dnum[i].root_exist == 1)//根目录存在
            {
                //printf("i = %d\n", i);
                return i;
            } 
        }
    }
    return -1;
}

int search_null_disc()//查找空的磁盘块
{
    for (int i = 0; i < discnumber; i++)
    {
        if (dnum[i].disc_f == 0)
        {
            dnum[i].disc_f = 1;
            return i;
        }
    }
}

int link_disc(int m)
{
    int ptr = -1;
    //printf("1234567890 m = %d", m);
    ptr = search_root_disc(m);
    //printf("ptr = %d\n", ptr);
    if (ptr == -1)
    {
        ptr = 0;
        ptr = search_null_disc(); 
        dnum[ptr].root_exist = 1;
        strcpy(dnum[ptr].root_user_hank, q[m]->nameh);
        strcpy(dnum[ptr].root_user_name, p->name);
        q[m]->search = &dnum[ptr];//search是指针所以赋值只能是地址,单纯从语法上看如果没有取址符q[m]->search = dnum也可
        dnum[ptr].file_table[0] = &dnum[ptr];
    }
    //printf("dnum.[ptr].root_user_hank = %s\n", dnum[ptr].root_user_hank);
    //printf("dnum.[ptr].root_user_name = %s\n", dnum[ptr].root_user_name);
    //printf("dnum[ptr].root_exist = %d\n", dnum[ptr].root_exist);

    return ptr;
}

void write_include(Disc* d,char numb[], int length)
{
    if (length < 10)
    {
       strcpy(d->file_include, numb);
       //printf("<10 = %s\n", d->file_include);
    }
        //d->file_include[i] = numb[i + 10];
    if (length > 10)
    {
        for (int i = 0; i < 9; i++)
        {
            d->file_include[i] = numb[i];

           // printf("<10 = %c\n", d->file_include[i]);
        }
        d->next = &dnum[search_null_disc()];
        d = d->next;
        d->disc_f = 1;
        for (int i = 0; i < length - 9; i++)
        {
            d->file_include[i] = numb[i + 9];
            //printf("<20 = %c\n", d->file_include[i]);
        }
    }
    
}

int search_disc(int ptr, char temporary_name[])
{
    //printf("temporary_name = %s\n", temporary_name);
    for (int i = 0; i < discnumber && dnum[ptr].file_table[i] != NULL; i++)
    {
       //printf("dnum[ptr].file_table[i]->file_name = %s\n", dnum[ptr].file_table[i]->file_name);
       //printf("strcmp(dnum[ptr].file_table[i]->file_name, temporary_name) = %d\n", strcmp(dnum[ptr].file_table[i]->file_name, temporary_name));
        if (strcmp(dnum[ptr].file_table[i]->file_name, temporary_name) == 0)
        {
            return i;
        }
    }

    return -1;
   /* for (int i = 0; i < discnumber; i++)
    {
        if (strcmp(dnum[i].file_name, temporary_name) == 0)
        {
            return i;
        }
        
    }
    return -1;*/
}


int create_new_file(int ptr)
{
    Disc* d;

    int length = 0;
    //int z = 0;测试
    char temporary_name[10] = { 0 };
    char temporary_include[20] = { 0 };
    printf("请输入文件名称:");
    scanf("%s", temporary_name);
    printf("请输入文件内容:\n");
    scanf("%s", temporary_include);
    length = strlen(temporary_include);
    //printf("ptr = %d\n", ptr);
    //printf("dnum[ptr].root_exist = %d\n", dnum[ptr].root_exist);
    if (search_disc(ptr, temporary_name) != -1)
    {
        printf("名称重复!");
        return 0;
    }
    
    if (strlen(dnum[ptr].file_name) == 0 && dnum[ptr].root_exist == 1)//当前磁盘块没有存入
    {
        //printf("dnum[ptr].file_name = %s\n", dnum[ptr].file_name);
        strcpy(dnum[ptr].file_name, temporary_name);
        //printf("dnum[ptr].table[0]->file_name = %s\n", dnum[ptr].file_table[0]->file_name);
        //printf("142dnum[ptr].file_name = %s\n", dnum[ptr].file_name);
        if (length > 10)
        {
            /*strcpy(dnum[ptr].file_include, temporary_include);
            dnum[ptr].next = &dnum[search_null_disc()];
            d = dnum[ptr].next;
            length -= 10;*/
            d = &dnum[ptr];
            d->disc_f = 1;
            write_include(d, temporary_include, length);
        }
        else
        {
            d = &dnum[ptr];
            d->disc_f = 1;
            //strcpy(dnum[ptr].file_include, temporary_include);
            write_include(d, temporary_include, length);
            //printf("%s\n", dnum[ptr].file_include);
        }
    }
    else
    {
        int i;
        for (i = 0; i < discnumber; i++)
        {
            if (dnum[ptr].file_table[i] == NULL)
            {
                //z = i;
                break;
            }
        }
        dnum[ptr].file_table[i] = &dnum[search_null_disc()];
        d = dnum[ptr].file_table[i];
        strcpy(d->file_name, temporary_name);

       // printf("d->name = %s\n", d->file_name);
        //printf("dnum[ptr]->file_name = %s\n", dnum[ptr].file_table[z]->file_name);
        write_include(d, temporary_include, length);
    }
    return 1;
}


void read_file(int ptr)
{
    Disc* check;
    char temporary_name[10] = { 0 };
    printf("请输入文件名称:");
    scanf("%s", temporary_name);
    int i = search_disc(ptr, temporary_name);
    //printf("i = %d\n", i);
    if ( i != -1)
    {
        printf("文件查找成功!\n");
        printf("文件名称是:%s\n", dnum[ptr].file_table[i]->file_name);
        printf("文件内容是:");
        check = dnum[ptr].file_table[i];
        printf("%s", check->file_include);
         while (check->next != NULL)
        {
            check = check->next;
            printf("%s", check->file_include);
        }
         printf("\n");
    }
    else
    {
        printf("查找失败,请检查文件名是否正确!\n");
    }
}

void write_file(int ptr)
{
    Disc* check;
    char temporary_name[10] = { 0 };
    char temporary_include[19] = { 0 };//极端情况下假设file_inlcude存在且值为1
    printf("请输入文件名称:");
    scanf("%s", temporary_name);

    int i = search_disc(ptr, temporary_name);
    
    if (i != -1)
    {
        printf("请输入写入内容:\n");
        scanf("%s", temporary_include);
        int f = strlen(temporary_include);
        check = dnum[ptr].file_table[i];
        int w = strlen(check->file_include);
        if (w == 10)
        {
            check = check->next;

             w = strlen(check->file_include);
            if (w + f < 10)
            {
                for (int i = 0; w  + i < 10; i++)
                {
                    check->file_include[w + i] = temporary_include[i];
                }
            }
            else
            {
                printf("文件已满,无法写入\n");
            }
        }
        else if (w < 10)
        {
            if (f <= (19 - w))
            {

               for (int i = 0; w + i < 10; i++)
               {
                   //printf("check->file_include[w]  = %c\n", check->file_include[w]);
                   //printf("int i = %d\n", i);
                   //printf("w = %d\n", w);
                   check->file_include[w + i] = temporary_include[i];
                   //printf("after check->file_include[w]  = %c\n", check->file_include[w + i]);
               }
               //printf("check->file_clude = %s\n", check->file_include);
                if (w + f > 10)
                {
                    //printf("w + f = %d\n", (w + f));
                    Disc* m = check;
                    check->next = &dnum[search_null_disc()];
                    check = check->next;
                   // printf("check->file_include = %s\n", check->file_include);
                    for (int i = 0; i < (w + f - 10 + 1); i++)
                    {
                        
                        check->file_include[i] = temporary_include[(10 - w) + i];
                        /*printf("9 - w + i = %d", ((9 - w) + i));
                        printf("temporary_include[(9 - w) + i] = %c\n", temporary_include[(9 - w) + i]);
                        printf("check->file_include[i] = %c\n", check->file_include[i]);*/

                    }
                    //printf("after for check->file_include = %s\n", check->file_include);
                    //printf("sum = %s\n", m->file_include);
                }
            }
            else
            {
                printf("文件已满,无法写入\n");
            }

        }
    }
    else
    {
        printf("查找失败,请检查文件名是否正确!\n");
    }

}

void public_delete_disc(int ptr, char temporary_name[])
{
    Disc* del;
    int i = search_disc(ptr, temporary_name);
   // printf("temporary_name = %s\n", temporary_name);
    if (i == -1)
    {
        printf("查找失败,请检查文件名是否正确!\n");
    }
    else
    {
        del = dnum[ptr].file_table[i];
        printf("文件%s删除成功!\n", del->file_name);
        for (int i = 0; i < 10; i++)
        {
            del->file_include[i] = { 0 };
            del->file_name[i] = { 0 };
            del->disc_f = 0;
        }
        if (del->next != NULL)
        {
            Disc* reserve;
            reserve = del;
            del = del->next;
            for (int i = 0; i < 10; i++)
            {
                del->file_include[i] = { 0 };
                del->disc_f = 0;
            }
            reserve->next = NULL;
        }
        //printf("删除成功!\n");
    }
}

void del_disc(int ptr)
{
    char temporary_name[10] = { 0 };
    printf("请输入文件名称:");
    scanf("%s", temporary_name);
    public_delete_disc(ptr, temporary_name);
}

void population_disc(int m, int n)
{
    int ptr;
    ptr = link_disc(m);
    //printf("根目录 = %d\n", ptr);
    switch (n)
    {
    case 4: create_new_file(ptr); break;
    case 5: read_file(ptr); break;
    case 6: write_file(ptr); break;
    case 7: del_disc(ptr); break;    
    default:
        break;
    }
}

/*********************************************************************************************************************/
//操作表
int user_hank_list(int m)
{
    int n = 0;
    printf("******************************************\n");
    printf("**                磁盘                  **\n");
    printf("**        请输入相应指令进行操作        **\n");
    printf("**           1—新增磁盘                **\n");
    printf("**           2—更换磁盘                **\n");
    printf("**           3—磁盘查询                **\n");
    printf("**           4—文件添加                **\n");
    printf("**           5—文件读入                **\n");
    printf("**           6—文件写入                **\n");
    printf("**           7—文件删除                **\n");
    printf("**           8—磁盘管理                **\n");
    printf("**           9—退出                    **\n");
    printf("******************************************\n");
    printf("当前的磁盘是:%s\n", q[m]->nameh);
    printf("请输入指令:");
    scanf("%d", &n);
    switch (n)
    {
    case 1: create_newhank(m); return 1;
    case 2: change_hank(m); return 2;
    case 3: search_hank(m); return 3;   
    case 4: population_disc(m, n); return 4;
    case 5: population_disc(m, n); return 5;
    case 6: population_disc(m, n); return 6;
    case 7: population_disc(m, n); return 7;
    case 8: disc_manage(); return 8;
    case 9: return 9;
    default:
        printf("输入错误");
        return 9;
        break;
    }

}


/******************************************************************************************************************************************/
//用户与磁盘的链接
void user_hank(int m)//用户磁盘页面
{
    if (p->flag == 0)
    {
         creat_hank(m);//进入盘的创建
         p->flag = 1;
    }
    while (1)
    {
        if (user_hank_list(m) == 9)
        {
            break;
        }

    }
}


/******************************************************************************************************************************************/
//用户功能
int check(char strn[], char strp[])
{
    int f1 = 1;
    int f2 = 0;

    p = ready;//因为头结点缘故,p第一次在空的头结点处
    do
    {
        p = p->link;//先挪到下一个节点,再做比较 p是当前节点
        f1 = strcmp(p->name, strn);
        f2 = strcmp(p->password, strp);
        //printf("p->name = %s\n", p->name);
        if (f1 == 0 && f2  == 0)
        {
            printf("登陆成功!\n");
            return 1;
        }

    }while (p->link != NULL);
    
    if (f2 != 0)
    {
        if(f1 == 0)
        {
            printf("密码错误!\n");
        }
        else
        {
            printf("当前用户不存在!\n");
        }
    }
    return 0;
}

void login()//登录
{
    int m = 0;
    if (ready == NULL)
    {
        printf("用户不存在!\n");
        //system("pause");
        //system("cls");
    }
    else
    {
        char strn[16] ={ 0 }, strp[16] ={ 0 };
        printf("请输入用户名:");
        scanf("%s", strn);
        printf("请输入密码:");
        scanf("%s", strp);

        if (check(strn, strp) == 1)
        {
            m = p->num;
            //printf("m = p->num  = %d\n", m);
            if (h[m] == NULL)//创建盘符链表的头结点
            {
                q[m] = getpch(Hank);
                h[m] = q[m];
                last[m] = q[m];
                q[m]->link = NULL;
                p->hank = h[m];
            }
            user_hank(m);
        }
    }
}

void change_user()//更换用户
{
    login();
}

void search_user()//查询用户
{
    if (ready != NULL)
    {
        p = ready;//因为头结点缘故,p第一次在空的头结点处
        if (p->link != NULL)
        {
            do
            {
                p = p->link;//先挪到下一个节点,再做比较
                printf("用户%s的密码是:%s\n", p->name, p->password);
            } while (p->link != NULL);
        }
    }
    else
    {
        printf("当前无用户,请重新添加!\n");
    }

}

void del_user_node(Users* before)
{
    for (int i = 0; i < 16; i++)
    {
        p->name[i] = { 0 };
        p->password[i] = { 0 };
    }
    if (p == first)
    {
        first = before;
        first->link = NULL;
        free(p);
    }
    else
    {
        before->link = p->link;
        p->link = NULL;
        free(p);
    }
    if (first == ready)
    {
        free(ready);
        ready = NULL;
        first = NULL;
        p = NULL;
    }
}

void del_hank_disc(Hank* ptr, int m)
{
    
    int number = link_disc(m);
    //printf("m = %d\n", m);
    for (int i = 0; dnum[number].file_table[i] != NULL; i++)
    {
        //printf("number = %d\n",number);
        //printf("dnum[number].file_name = %s\n", dnum[number].file_name);
        //printf("dnum[number].file_table[i]->file_name = %s\n", dnum[number].file_table[i]->file_name);
        public_delete_disc(number, dnum[number].file_table[i]->file_name);
        dnum[number].file_table[i] = NULL;
        //printf("dnum[number].file_table[i] = %x", dnum[number].file_table[i]);
    }

    dnum[number].root_exist = 0;

    for (int i = 0; i < 16; i++)
    {
        if (i < 8)
        {
            dnum[number].root_user_hank[i] = { 0 };
        }
        dnum[number].root_user_name[i] = { 0 };
    }



}

void del_user_all()
{
    Users* before;
    Hank* ptr;
    int del_flag = 0;
    char temporary_root_usre_name[10] = { 0 };
    printf("请输入删除用户的名称:");
    scanf("%s", temporary_root_usre_name);
    p = ready;
    do
    {
        before = p;
        p = p->link;
        if (strcmp(p->name, temporary_root_usre_name) == 0)
        {
            del_flag = 1;
            break;
        }

    } while (p->link != NULL);
    if (del_flag != 1)
    {
        printf("用户名输入错误!\n");
    }
    else
    {
        int m;
        m = p->num;
        if (h[m] == NULL)
        {
            del_user_node(before);//没建立磁盘时
        }
        else///
        {
            while (last[m] != h[m])
            {
                q[m] = h[m];
                //printf("last[m]->name = %s\n", last[m]->nameh);
                if (q[m]->link != last[m])
                {
                    do
                    {
                        q[m] = q[m]->link;
                        //printf("q[m]->name = %s\n", q[m]->nameh);
                    } while (q[m]->link != last[m]);//找到前一个节点
                }
                ptr = q[m];
                q[m] = last[m];
                last[m] = ptr;
                ptr = q[m];
                //printf("0       q[m]->nameh = %s\n", q[m]->nameh);//q和last反了

                del_hank_disc(ptr, m);
                q[m]->search = NULL;
                free(q[m]);
            } 
            free(h[m]);
            p->hank = NULL;
            del_user_node(before);
        }
    }
    printf("删除成功!\n");
}

int list()
{
    int n = 0;
    printf("******************************************\n");
    printf("**         二级文件管理模拟系统         **\n");
    printf("**        请输入相应指令进行操作        **\n");
    printf("**           1—新用户注册              **\n");
    printf("**           2—用户登录                **\n");
    printf("**           3—更换用户                **\n");
    printf("**           4—查询用户                **\n");
    printf("**           5—删除用户                **\n");
    printf("**           6—退出                    **\n");
    printf("******************************************\n");
    printf("请输入指令:");
    scanf("%d", &n);
    switch (n)
    {
    case 1: registers(); return 1;
    case 2: login(); return 2;
    case 3: change_user(); return 3;
    case 4: search_user(); return 4;
    case 5: del_user_all(); return 5;
    case 6: return 6;
    default:
        printf("输入错误\n");
        return 6;
        break;
    }
}

/*void search_all()//测试函数
{
    printf("all\n");
    for (int i = 0; i < discnumber; i++)
    {
        printf("dnum[i].disc_f = %d\n", dnum[i].disc_f);
        printf("dnum[i].file_include = %s\n", dnum[i].file_include);
        printf("dnum[i].file_name = %s\n", dnum[i].file_name);
        printf("dnum[i].next = %x\n", dnum[i].next);
        printf("dnum[i].root_exis = %d\n", dnum[i].root_exist);
        printf("dnum[i].root_user_han = %s\n", dnum[i].root_user_hank);
        printf("dnum[i].root_user_name = %s\n", dnum[i].root_user_name);
    }
}*/

int main()
{
    i_disc();
    while (1)
    {
        if (list() == 6)
        {
            break;
        }
    }
    //search_all();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值