多级文件系统

1,模拟多级文件系统
2,利用最佳匹配算法进行空间的管理
3,实现了文件的创建,删除,查询,写入,读取,修改,共享等功能
4,可以用户登录
代码不是整洁,请见谅

#define  _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<time.h>


#define Free 0 //空闲状态
#define Busy 1 //已用状态
#define OK 1    //完成
#define ERROR -1 //出错
#define MAX_length 64 //最大内存空间为25KB,一个物理块为1kb
#define MaxHang 8 //二维位图的最大值
#define MaxLie 8 //二维位图的最大值
typedef struct freearea//定义一个空闲区说明表结构
{
    long size;   //分区大小
    long address; //分区地址
    int state;   //状态
}ElemType;

//----------  线性表的双向链表存储结构  ------------
typedef struct DuLNode //double linked list
{
    ElemType data;
    struct DuLNode *prior; //前趋指针
    struct DuLNode *next;  //后继指针
}DuLNode, *DuLinkList;

DuLinkList block_first; //头结点
DuLinkList block_last;  //尾结点

int alloc(int);//内存分配
int free_niecun(int); //内存回收
int Best_fit(int); //最佳适应算法


//用于获取时间的公共变量
time_t rawtime;
struct  tm* timeinfo;

int MaxMap[MaxHang][MaxLie] = { 0 }; //用于简单模拟位标志,此处一共可以存放25个文件,文件编号和行列的数字也有关系,如MaxMap[1][2]存放的文件编号是1*8+2
typedef struct filestruct
{
    int fileido;        //文件编号
    char filename[15];   //文件名
    char createtime[25];   //文件创建时间
    int isopen;         //文件状态 0 关闭  1打开
    int filemodeit;     //文件的权限  0,不可操作,1只读,2读写  默认是读写权限
    int filetype;       //文件的类型 1文件夹 2文本文件
    int size;           //文件的大小
    struct filestruct *liftbrother;//左同级的文件
    struct filestruct *rightbrother;//右同级的文件
    struct filestruct *child;      //本目录下级的文件
    struct filestruct *parents;    //所属的上级文件
    char *text;                   //用于文本文件写入
    int isshared;                  //用与判断是否共享 默认是0不共享,1可共享

}FileStruct;
typedef struct Userstruct
{
    char *username;           //用户的名字
    char *uaercreatetime;
    struct Userstruct* liftbrother; //同级用户链接
    struct Userstruct* rightbrother; //同级用户链接
    struct filestruct *child;    //用户下的文件链接

}UserStruct;
FileStruct *filehead = NULL;
UserStruct *userhead = NULL;
UserStruct *pwd = NULL;


int Initblock()//开创带头结点的内存空间链表
{
    block_first = (DuLinkList)malloc(sizeof(DuLNode));
    block_last = (DuLinkList)malloc(sizeof(DuLNode));
    block_first->prior = NULL;
    block_first->next = block_last;
    block_first->data.state = 3;
    block_first->data.size = 0;
    block_last->prior = block_first;
    block_last->next = NULL;
    block_last->data.address = 0;
    block_last->data.size = MAX_length;
    block_last->data.state = Free;
    return OK;
}


//--------------------  最佳适应算法  ------------------------
int Best_fit(int request)
{
    //请在此处添加为作业申请新空间且初始化的代码
    DuLinkList block = (DuLinkList)malloc(sizeof(DuLNode));
    memset(block, 0, sizeof(DuLNode));
    block->data.size = request;
    block->data.state = Busy;
    DuLNode *p = block_first->next;
    DuLNode *q = NULL; //记录最佳插入位置
    int i = 0;
    int num = 0;
    DuLNode *q1 = NULL;

    while (p)
    {

        if (p->data.state == Free && p->data.size >= request)
        {
            if (num == 0)
            {
                q = p;
                i = q->data.size - request;

            }
            else if (p->data.size - request < i)
            {
                q = p;
                i = q->data.size - request;
            }
            num++;

        }

        p = p->next;
    }

    //请在此处完成最佳适应算法的代码,重点:要查找到最小剩余空间的分区,即最佳插入位置

    if (q == NULL)//没有找到空闲块 
        return ERROR;
    else
    {
        //请插入找到了最佳位置并实现内存分配的代码!
        if ((q->data.size - request) >= 1)
        {

            block->data.address = q->data.address;
            q->data.address = q->data.address + request;
            q->data.size = q->data.size - request;

            block->next = q;
            block->prior = q->prior;
            q->prior->next = block;
            q->prior = block;
            return (block->data.address);
        }
        else
        {
            q->data.state = Busy;
            free(block);
            return (q->data.address);
        }
    }
}

//-----------------------   主 存 回 收   --------------------
int free_niecun(int ID)
{
    DuLNode *p = block_first->next;
    DuLNode *p1 = NULL;
    while (p)
    {
        if (p->data.address== ID)
        {
            p->data.state = Free;
            //cout << "内存块找到,准备回收!" << endl;
            if (p->next == NULL){
                if ((p->prior->data.state == Free) && (p->prior->data.address + p->prior->data.size == p->data.address))
                {
                    p->prior->data.size += p->data.size;
                    p->prior->next = NULL;
                    free(p);
                }
                //cout << "内存块为最后一块!" << endl;
                break;
            }
            //请在此处添加其他情况的回收的代码,主要包括要回收的分区与前面的空闲块相连或与后面的空闲块相连,或者与前后空闲块相连等。
            if ((p->next->next == NULL) && (p->next->data.state == Free) && (p->data.address + p->data.size == p->next->data.address))
            {
                p->data.size += p->next->data.size;
                free(p->next);
                p->next = NULL;
                if ((p->prior->data.state == Free) && (p->prior->data.address + p->prior->data.size == p->data.address))
                {
                    p->prior->data.size += p->data.size;
                    p->prior->next = NULL;
                    free(p);

                }
                break;

            }
            else if ((p->prior->data.state == Free) && (p->prior->data.address + p->prior->data.size == p->data.address))
            {

                if (p->next->data.state == Free && (p->data.address + p->data.size == p->next->data.address))
                {
                    p1 = p->next;
                    p->data.size += p->next->data.size;
                    p->next->next->prior = p;

                    p->next = p->next->next;
                    free(p1);

                }
                p->prior->data.size += p->data.size;
                p->prior->next = p->next;
                p->next->prior = p->prior;
                free(p);
                break;
            }
            else if ((p->next->data.state == Free) && (p->data.address + p->data.size == p->next->data.address))
            {
                p1 = p->next;
                p->data.size += p->next->data.size;
                p->next = p->next->next;
                p->next->prior = p;
                free(p1);
                break;
            }
            break;
        }
        p = p->next;
    }
    //cout << "回收成功!" << endl;
    return OK;
}

//初始化位图
void InitMap()
{
    int i = 0;
    int j = 0;
    for (i; i < MaxHang; i++)
    {
        for(j; j < MaxLie; j++)
        {
            MaxMap[i][j] = 0;
        }
    }
    return;
}
//初始化 
int Init(UserStruct **userhead) //初始化空的头文件
{
    int ret = 0;
    *userhead = (UserStruct*)malloc(sizeof(UserStruct));
    if (*userhead == NULL)
    {
        ret = -1;
        return ret;
    }
    memset(*userhead, 0, sizeof(UserStruct));
    (*userhead)->liftbrother = NULL;
    (*userhead)->rightbrother = NULL;
    (*userhead)->child = NULL;
    return ret;
}

//初始化一个默认用户root
int InitRoot(UserStruct **userhead) //初始化root用户
{
    int ret = 0;
    time(&rawtime);
    timeinfo = localtime(&rawtime);
    char *time = asctime(timeinfo);
    //printf("time = %s", time);
    //printf("leng = %d\n", strlen(time));
    (*userhead)->liftbrother = (UserStruct*)malloc(sizeof(UserStruct));
    if ((*userhead)->liftbrother == NULL)
    {
        ret = -1;
        return ret;
    }
    memset((*userhead)->liftbrother, 0, sizeof(UserStruct));
    ((*userhead)->liftbrother)->username = (char*)malloc(5);
    memset(((*userhead)->liftbrother)->username, 0, 5);
    strcpy(((*userhead)->liftbrother)->username, "root");
    ((*userhead)->liftbrother)->uaercreatetime = (char*)malloc(strlen(time));
    memset(((*userhead)->liftbrother)->uaercreatetime, 0, strlen(time));
    strcpy(((*userhead)->liftbrother)->uaercreatetime, time);
    ((*userhead)->liftbrother)->liftbrother = NULL;
    ((*userhead)->liftbrother)->rightbrother = *userhead;
    return ret;
}
//用户登录只验证用户名没有验证密码
UserStruct * Login(UserStruct *userhead)
{
    char uasename[15];
    printf("%s\n", "请输入用户名");
    scanf("%s", uasename);
    UserStruct * p = userhead->liftbrother;
    while (p)
    {
        if (strcmp(p->username, uasename) == 0)
        {

            return p;
        }
        p = p->liftbrother;
    }
    return NULL;
}

//创建新用户
int CreateUser(UserStruct *userhead)
{
    UserStruct * p = userhead->liftbrother;
    UserStruct * tmp = NULL;
    time(&rawtime);
    timeinfo = localtime(&rawtime);
    char *time = asctime(timeinfo);
    int ret = 0;
    char username[20];
    printf("%s\n", "请输入用户名");
    scanf("%s", username);
    tmp = (UserStruct *)malloc(sizeof(UserStruct));
    if (tmp == NULL)
    {
        ret = -1;
        return ret;
    }
    memset(tmp, 0, sizeof(UserStruct));
    tmp->username = (char*)malloc(strlen(username));
    memset(tmp->username, 0, strlen(username));
    strcpy(tmp->username, username);
    tmp->uaercreatetime = (char*)malloc(strlen(time));
    memset(tmp->uaercreatetime, 0, strlen(time));
    strcpy(tmp->uaercreatetime, time);
    tmp->liftbrother = NULL;
    tmp->rightbrother = NULL;
    while (p->liftbrother != NULL)
    {
        p = p->liftbrother;
    }
    p->liftbrother = tmp;
    tmp->rightbrother = p;
    return ret;
}

//查找目录
FileStruct * SelectPath(FileStruct * path,char *pathname)
{
    FileStruct * p = path;
    while (p)
    {
        //要满足名字相同,文件类型是文件夹以及权限是可以操作的  才可以在此目录下创建文件
        if ((strcmp(p->filename, pathname) == 0))
        {
            if (p->filemodeit == 0)
            {
                printf("此文件夹没有执行权限\n");
                return NULL;
            }
            else if (p->filetype == 2)
            {
                printf("此是文本文件无法创建子文件\n");
                return NULL;
            }
            return p;
        }
        p = p->liftbrother;
    }
    return NULL;
}
//寻找删除文件的路劲
FileStruct * SelectPath1(FileStruct * path, char *pathname)
{
    FileStruct * p = path;
    while (p)
    {
        //要满足名字相同,文件类型以及权限是可以操作的  才可以在此目录下创建文件
        if ((strcmp(p->filename, pathname) == 0) && (p->filemodeit != 0))
        {
            return p;
        }
        p = p->liftbrother;
    }
    return NULL;
}
//设置已占位位图
void SetMap(int dress, int size)
{
    int i = dress / MaxHang;
    int j = dress%MaxHang;
    int sum = 0;
    for (i; i < MaxHang; i++)
    {
        for (j; j < MaxLie; j++)
        {
            MaxMap[i][j] = 1;
            sum++;
            if (sum == size)
                return ;
        }
        j = 0;
    }
    return;
}
//设置未占位位图
void SetMap1(int dress, int size)
{
    int i = dress / MaxHang;
    int j = dress%MaxHang;
    int sum = 0;
    for (i; i < MaxHang; i++)
    {
        for (j; j < MaxLie; j++)
        {
            MaxMap[i][j] = 0;
            sum++;
            if (sum == size)
                return;
        }
        j = 0;
    }
    return;
}
//创建文件
int CreateFile(UserStruct *pwd)
{
    int ret = 0;
    FileStruct *tmp = NULL;
    FileStruct *pathtmp = NULL;
    char path[20];
    char filename[25];
    int size = 0;
    int filemodeit = 2;
    int filetype =0 ;
    filehead  = pwd->child;
    printf("%s\n", "请输入文件的保存路径,如要保存在根目录下a文件夹下的b文件夹下  就请输入a/b  在根目录下就输入\n");
    scanf("%s", path);
    printf("请输入文件名\n");
    scanf("%s", filename);
    while(1)
    {
        printf("请输入文件大小,最大为64,注意最大是64\n");
        scanf("%d", &size);
        if (size <= 64 || size>0)
            break;
        printf("输入有误,重新输入\n");
    }
    while (1)
    {
        printf("请输入文件的权限  0,不可操作,1只读,2读写\n");
        scanf("%d", &filemodeit);
        if (filemodeit == 0 || filemodeit == 1 || filemodeit == 2)
            break;
        printf("输入有误,重新输入\n");
    }
    while (1)
    {
        printf("请输入文件的类型  2文本文件 1文件夹 \n");
        scanf("%d", &filetype);
        if ( filetype == 1 || filetype == 2)
            break;
        printf("输入有误,重新输入\n");
    }
    if (strcmp(path,"/") == 0)
    {
        while (filehead)
        {
            if (strcmp(filehead->filename, filename) == 0)
            {
                printf("此文件已经存在\n");
                return 0;
            }
            filehead = filehead->liftbrother;
        }
        ret = Best_fit(size);//利用最佳适应发分配空间
        if (ret == -1)
        {
            printf("没有足够的空间的\n");
            return ERROR;
        }
        else
        {
            printf("ok\n");
        }
        tmp = (FileStruct *)malloc(sizeof(FileStruct));
        if (tmp == NULL)
        {
            return ERROR;
        }
        memset(tmp, 0, sizeof(FileStruct));
        tmp->fileido = ret;
        /*tmp->filename = NULL;
        tmp->filename = (char*)malloc(strlen(filename)+1);
        if (tmp->filename == NULL)
        {
            printf("filename内存开辟失败\n");
            return ERROR;
        }
        memset(tmp->filename, 0, strlen(filename)+1);*/
        strcpy(tmp->filename, filename);
        //获取创建时间
        time(&rawtime);
        timeinfo = localtime(&rawtime);
        char *time = asctime(timeinfo);
    /*  tmp->createtime = NULL;
        tmp->createtime = (char*)malloc(strlen(time)+1);
        if (tmp->createtime == NULL)
        {
            printf("createtime内存开辟失败\n");
            return ERROR;
        }
        memset(tmp->createtime, 0, strlen(time)+1);*/
        strcpy(tmp->createtime, time);
        tmp->filemodeit = filemodeit;
        tmp->filetype = filetype;
        tmp->isopen = 0;
        tmp->isshared = 0;
        tmp->size = size;
        tmp->child = NULL;
        if (pwd->child == NULL)
        {
            pwd->child = tmp;
            tmp->parents = NULL;
            tmp->liftbrother = NULL;
            tmp->rightbrother = NULL;
            SetMap(ret, size);
        }
        else
        {
            tmp->liftbrother = pwd->child;
            pwd->child->rightbrother = tmp;
            pwd->child = tmp;
            tmp->parents = NULL;
            tmp->rightbrother = NULL;
            SetMap(ret, size);
        }



    }
    else
    {

        char*pathname = NULL;
        char d[] = "/";
        pathname = strtok(path, d);
        while (pathname != NULL)
        {
            pathtmp =SelectPath(filehead, pathname);
            if (pathtmp == NULL)
            {
                printf("此路径无效\n");
                return ERROR;
            }
            filehead = pathtmp->child;
            pathname = strtok(NULL, d);
            printf("此路径ok\n");
        }
        while (filehead)
        {
            if (strcmp(filehead->filename, filename) == 0)
            {
                printf("此文件已经存在\n");
                return 0;
            }
            filehead = filehead->liftbrother;
        }
        ret = Best_fit(size);//利用最佳适应发分配空间
        if (ret == -1)
        {
            printf("没有足够的空间的\n");
            return ERROR;
        }
        tmp = (FileStruct *)malloc(sizeof(FileStruct));
        if (tmp == NULL)
        {
            return ERROR;
        }
        memset(tmp, 0, sizeof(FileStruct));
        tmp->fileido = ret;
        /*  tmp->filename = NULL;
        tmp->filename = (char*)malloc(strlen(filename));
        if (tmp->filename == NULL)
        {
        printf("filename内存开辟失败\n");
        return ERROR;
        }
        memset(tmp->filename, 0, strlen(filename));*/
        strcpy(tmp->filename, filename);
        //获取创建时间
        time(&rawtime);
        timeinfo = localtime(&rawtime);
        char *time = asctime(timeinfo);
        /*tmp->createtime = NULL;
        tmp->createtime = (char*)malloc(strlen(time));
        if (tmp->createtime == NULL)
        {
        printf("createtime内存开辟失败\n");
        return ERROR;
        }
        memset(tmp->createtime, 0, strlen(time));*/
        strcpy(tmp->createtime, time);
        tmp->filemodeit = filemodeit;
        tmp->filetype = filetype;
        tmp->isopen = 0;
        tmp->isshared = 0;
        tmp->size = size;
        tmp->child = NULL;
        if (pathtmp->child == NULL)
        {
            pathtmp->child = tmp;
            tmp->parents = pathtmp;
            tmp->liftbrother = NULL;
            tmp->rightbrother = NULL;
            SetMap(ret, size);
        }
        else
        {
            tmp->liftbrother = pathtmp->child;
            pathtmp->child->rightbrother = tmp;
            pathtmp->child = tmp;
            tmp->rightbrother = NULL;
            tmp->parents = pathtmp;
            SetMap(ret, size);
        }
    }

    return OK;
}

//删除函数
FileStruct * Delete(FileStruct *tmp)
{
    FileStruct * par = tmp->parents;
    if (tmp->child != NULL)
        Delete(tmp->child);
    if (tmp->liftbrother !=NULL)
        Delete(tmp->liftbrother);
    //free(tmp->filename);
    //free(tmp->createtime);
    if(tmp->text != NULL)
        free(tmp->text);
    free_niecun(tmp->fileido);
    SetMap1(tmp->fileido, tmp->size);
    if (tmp->rightbrother != NULL)
    {
        par = tmp->rightbrother;

    }
    free(tmp);

    return par;
}

//删除文件
int DeleteFile(UserStruct *pwd)
{
    int ret = 0;
    FileStruct *tmp = NULL;
    FileStruct *tmp1 = NULL;
    FileStruct *pathtmp = NULL;
    char path[15];
    char filename[20];
    filehead = pwd->child;
    printf("%s\n", "请输入要删除文件的路径,如要是在根目录下a文件夹下的b文件夹下c 文件路径请输入/a/b  名字输入c 在根目录下就输入 /  \n");
    scanf("%s", path);
    printf("请输入文件名\n");
    scanf("%s", filename);
    if (strcmp(path, "/") == 0)
    {
        //删除根目录下全部的文件
        if (strcmp(filename, "/") == 0)
        {
            tmp1 = filehead;
            tmp1->rightbrother = NULL;
            pwd->child = NULL;

        }
        //指定删除根目录中的文件
        else
        {

            pathtmp = SelectPath1(filehead, filename);
            if (pathtmp == NULL)
            {
                printf("删除失败\n");
                return ERROR;
            }
            else if (pathtmp->filemodeit !=0) //处理文本文件
            {
                tmp1 = pathtmp;
                if (pathtmp->rightbrother == NULL)
                {
                    pwd->child = pathtmp->liftbrother;
                    if (pathtmp->liftbrother != NULL)
                    pathtmp->liftbrother->rightbrother = NULL;
                    pathtmp->liftbrother = NULL;
                }
                else if (pathtmp->liftbrother == NULL)
                {
                    pathtmp->rightbrother->liftbrother = NULL;
                    pathtmp->rightbrother = NULL;
                }
                else
                {
                    pathtmp->rightbrother->liftbrother = pathtmp->liftbrother;
                    pathtmp->liftbrother->rightbrother = pathtmp->rightbrother;
                    pathtmp->liftbrother = NULL;
                    pathtmp->rightbrother = NULL;
                }
        }

        }
        tmp1 = Delete(tmp1);
        if (tmp1 == NULL)
        {
            printf("删除成功\n");
        }

    }
    else
    {
        char*pathname = NULL;
        char d[] = "/";
        pathname = strtok(path, d);
        while (pathname != NULL)
        {
            pathtmp = SelectPath1(filehead, pathname);
            if (pathtmp == NULL)
            {
                printf("此路径无效\n");
                return ERROR;
            }
            filehead = pathtmp->child;
            pathname = strtok(NULL, d);
        }
        if (strcmp(filename, "/") == 0)
        {

            if (pathtmp->filemodeit != 0)
            {
                tmp1 = pathtmp;
                if (pathtmp->rightbrother == NULL)
                {
                    pathtmp->parents->child = pathtmp->liftbrother;
                    if (pathtmp->liftbrother != NULL)
                    {
                        pathtmp->liftbrother->parents = pathtmp->parents;
                        pathtmp->liftbrother->rightbrother = NULL;
                    }

                    pathtmp->parents = NULL;
                    pathtmp->liftbrother = NULL;
                }
                else if (pathtmp->liftbrother == NULL)
                {
                    pathtmp->rightbrother->liftbrother = NULL;
                    pathtmp->rightbrother = NULL;
                    pathtmp->parents = NULL;

                }
                else
                {
                    pathtmp->rightbrother->liftbrother = pathtmp->liftbrother;
                    pathtmp->liftbrother->rightbrother = pathtmp->rightbrother;
                    pathtmp->liftbrother = NULL;
                    pathtmp->rightbrother = NULL;
                }
                tmp1 = Delete(tmp1);
                if (tmp1 == NULL)
                {
                    printf("删除成功\n");
                }
            }
        }
        else
        {
            pathtmp = SelectPath1(filehead, filename);
            if (pathtmp->filemodeit != 0)
            {
                tmp1 = pathtmp;
                if (pathtmp->rightbrother == NULL)
                {
                    pathtmp->parents->child = pathtmp->liftbrother;
                    if (pathtmp->liftbrother != NULL)
                    {       
                    pathtmp->liftbrother->parents = pathtmp->parents;
                    pathtmp->liftbrother->rightbrother = NULL;
                    }
                    pathtmp->parents = NULL;
                    pathtmp->liftbrother = NULL;

                }
                else if (pathtmp->liftbrother == NULL)
                {
                    pathtmp->rightbrother->liftbrother = NULL;
                    pathtmp->rightbrother = NULL;
                    pathtmp->parents = NULL;

                }
                else
                {
                    pathtmp->rightbrother->liftbrother = pathtmp->liftbrother;
                    pathtmp->liftbrother->rightbrother = pathtmp->rightbrother;
                    pathtmp->liftbrother = NULL;
                    pathtmp->rightbrother = NULL;
                }
                tmp1 = Delete(tmp1);
                if (tmp1 == NULL)
                {
                    printf("删除成功\n");
                }
            }
        }



    }
    return OK;
}

//遍历文件(只能显示可执行并且同级下的文件)
void List(UserStruct *pwd)
{
    int ret = 0;
    FileStruct *tmp = NULL;
    FileStruct *tmp1 = NULL;
    FileStruct *pathtmp = NULL;
    char path[30];
//  char filename[20];
    int size = 0;
    int filemodeit = 2;
    int filetype = 0;
    filehead = pwd->child;
    printf("%s\n", "请输入要显示文件的路径,如要是显示在根目录下a文件夹下的b文件夹下,就请输入/a/b 在根目录下就输入/  \n");
    scanf("%s", path);
    if (filehead == NULL)
    {
        printf("此用户还没有文件可看\n");
        return ;
    }
    else if (strcmp(path, "/") == 0)
    {
        tmp1 = filehead;
        printf("此路径有一下文件可看\n");
        printf("%s ,%3s,%2s,%2s,%10s\n", "名字",  "状态 ", "类型", "是否共享", "创建/修改时间");
        while (tmp1)
        {

            if (tmp1->filemodeit != 0)
            {

                printf("%s", tmp1->filename);
                printf("%1s", ((tmp1->isopen) == 0) ? "关闭" : "打开");
                printf("%1s", ((tmp1->filetype) == 1) ? "文件夹" : "文本文件");
                printf("%1s\n", ((tmp1->isshared) == 1) ? "共享" : "不共享");
                printf("%s\n", tmp1->createtime);
            }
            tmp1 = tmp1->liftbrother;
        }
        printf("\n");
    }
    else
    {
        char*pathname = NULL;
        char d[] = "/";
        pathname = strtok(path, d);
        while (pathname != NULL)
        {
            pathtmp = SelectPath1(filehead, pathname);
            if (pathtmp == NULL)
            {
                printf("此路径无效\n");
                return;
            }
            filehead = pathtmp->child;
            pathname = strtok(NULL, d);
        }

        if (pathtmp->child == NULL)
        {
            printf("此路径还没有文件可看\n");
            return;
        }
        else
        {
            tmp1 = pathtmp->child;
            printf("此路径有一下文件可看\n");
            printf("%s   ,%12s,%20s,%25s\n","名字" ,"创建/修改时间" ,"状态 "  ,"类型");
            while (tmp1)
            {

                if (tmp1->filemodeit != 0)
                {
                    printf("%s", tmp1->filename);
                    printf("%12s", tmp1->createtime);
                    printf("%20s", (tmp1->isopen==0) ? "关闭":"打开");
                    printf("%25s\n", ((tmp1->filetype) == 1) ? "文件夹" : "文本文件");
                }

                tmp1 = tmp1->liftbrother;
            }
            printf("\n");
        }
    }




    return ;
}
//打开文件
int OpenFile(UserStruct *pwd,char *path1,char*filename1)
{
    char path[15];
    char filename[10];
    FileStruct *pathtmp = NULL;
    filehead = pwd->child;
    if (strcmp(path1, "@") == 0 && strcmp(filename1, "@")==0)
    {

        printf("请输入关闭文件所在的路径\n");
        scanf("%s", path);
        printf("请输入要关闭文件的名称\n");
        scanf("%s", filename);
    }
    else
    {
        strcpy(path, path1);
        strcpy(filename, filename1);
    }
    if (strcmp(path, "/") == 0)
    {
        while (filehead)
        {
            if (strcmp(filehead->filename, filename) == 0)
            {
                if (filehead->filemodeit != 0)
                {


                time(&rawtime);
                timeinfo = localtime(&rawtime);
                char *time = asctime(timeinfo);
                strcpy(filehead->createtime, time);
                filehead->isopen = 1;
                printf("文件以打开\n");
                printf("%d\n", filehead->isopen);
                return 1;
                }
                else
                {
                    printf("文件没有执行权限,打开失败\n");
                    return -1;
                }
            }
            filehead = filehead->liftbrother;
        }
        printf("没有此文件\n");
        return -1;
    }
    else
    {
        char*pathname = NULL;
        char d[] = "/";
        pathname = strtok(path, d);
        while (pathname != NULL)
        {
            pathtmp = SelectPath1(filehead, pathname);
            if (pathtmp == NULL)
            {
                printf("此路径无效\n");
                return ERROR;
            }
            filehead = pathtmp->child;
            pathname = strtok(NULL, d);
        }
        pathtmp = SelectPath1(filehead, filename);
        if (pathtmp == NULL)
        {
            printf("没有此文件\n");
            return -1;
        }
        if (pathtmp->filemodeit != 0)
        {


            time(&rawtime);
            timeinfo = localtime(&rawtime);
            char *time = asctime(timeinfo);
            strcpy(pathtmp->createtime, time);
            pathtmp->isopen = 1;
            printf("文件以打开\n");
            printf("%d\n", pathtmp->isopen);
            return 1;
        }
        else
        {
            printf("文件没有执行权限,打开失败\n");
            return -1;
        }

    }
}

//关闭文件
int CloseFile(UserStruct *pwd,char* path1,char* filename1)
{
    char path[15];
    char filename[10];
    FileStruct *pathtmp = NULL;
    filehead = pwd->child;
    if (strcmp(path1,"@") == 0 && strcmp(filename1,"@") == 0)
    {

    printf("请输入关闭文件所在的路径\n");
    scanf("%s", path);
    printf("请输入要关闭文件的名称\n");
    scanf("%s", filename);
    }
    else
    {
        strcpy(path, path1);
        strcpy(filename, filename1);
    }
    if (strcmp(path, "/") == 0)
    {
        while (filehead)
        {
            if (strcmp(filehead->filename, filename) == 0)
            {
                if (filehead->isopen == 1)
                {


                    time(&rawtime);
                    timeinfo = localtime(&rawtime);
                    char *time = asctime(timeinfo);
                    strcpy(filehead->createtime, time);
                    filehead->isopen = 0;
                    printf("文件以关闭\n");
                    printf("%d\n", filehead->isopen);
                    return 1;
                }
                else
                {
                    printf("文件是关闭的\n");
                    return 1;
                }
            }
            filehead = filehead->liftbrother;
        }
        printf("没有此文件\n");
        return -1;
    }
    else
    {
        char*pathname = NULL;
        char d[] = "/";
        pathname = strtok(path, d);
        while (pathname != NULL)
        {
            pathtmp = SelectPath1(filehead, pathname);
            if (pathtmp == NULL)
            {
                printf("此路径无效\n");
                return ERROR;
            }
            filehead = pathtmp->child;
            pathname = strtok(NULL, d);
        }
        pathtmp = SelectPath1(filehead, filename);
        if (pathtmp == NULL)
        {
            printf("没有此文件\n");
            return -1;
        }
        if (pathtmp->isopen == 1)
        {


            time(&rawtime);
            timeinfo = localtime(&rawtime);
            char *time = asctime(timeinfo);
            strcpy(pathtmp->createtime, time);
            pathtmp->isopen = 0;
            printf("文件已关闭\n");
            printf("%d\n", pathtmp->isopen);
            return 1;
        }
        else
        {
            printf("文件是关闭的\n");
            return 1;
        }

    }
}
//文件重命名
int ResetName(UserStruct *pwd)
{

    char path[15];
    char filename[10];
    char newfilename[10];
    FileStruct *pathtmp = NULL;
    FileStruct *pathtmp1 = NULL;
    filehead = pwd->child;
    pathtmp1 = pwd->child;
    printf("请输入要进行重命名文件所在的路径 根目录是/ \n");
    scanf("%s", path);
    printf("请输入要进行重命名文件的名称\n");
    scanf("%s", filename);
    printf("请输入要进行重命名文件的新名称\n");
    scanf("%s", newfilename);
    if (strcmp(path, "/") == 0)
    {
        while (pathtmp1)
        {
            if (strcmp(pathtmp1->filename, newfilename) == 0)
            {
                printf("有重名文件,重命名失败\n");
                return -1;
            }
            pathtmp1 = pathtmp1->liftbrother;
        }
        while (filehead)
        {
            if (strcmp(filehead->filename, filename) == 0)
            {
                if (filehead->filemodeit==0)
                {
                    printf("重命名失败,没有执行权限\n");
                    return -1;

                }
                else if (filehead->isopen == 1)
                {
                    printf("重命名失败,文件是打开状态\n");
                    return -1;
                }
                else
                {
                    strcpy(filehead->filename, newfilename);
                    time(&rawtime);
                    timeinfo = localtime(&rawtime);
                    char *time = asctime(timeinfo);
                    strcpy(filehead->createtime, time);
                    printf("文件名称修改完毕\n");
                    return 1;
                }
            }
            filehead = filehead->liftbrother;
        }
        printf("没有此文件\n");
        return -1;
    }
    else
    {
        char*pathname = NULL;
        char d[] = "/";
        pathname = strtok(path, d);
        while (pathname != NULL)
        {
            pathtmp = SelectPath1(filehead, pathname);
            if (pathtmp == NULL)
            {
                printf("此路径无效\n");
                return ERROR;
            }
            filehead = pathtmp->child;
            pathtmp1 = pathtmp->child;
            pathname = strtok(NULL, d);
        }
        pathtmp1 = SelectPath1(pathtmp1, newfilename);
        if (pathtmp1 != NULL)
        {
            printf("有重名文件,重命名失败\n");
            return -1;
        }
        pathtmp = SelectPath1(filehead, filename);
        if (pathtmp == NULL)
        {
            printf("没有此文件\n");
            return -1;
        }
        if (pathtmp->filemodeit == 0)
        {
            printf("重命名失败,没有执行权限\n");
            return -1;

        }
        else if (pathtmp->isopen == 1)
        {
            printf("重命名失败,文件是打开状态\n");
            return -1;
        }
        else
        {
            strcpy(pathtmp->filename, newfilename);
            time(&rawtime);
            timeinfo = localtime(&rawtime);
            char *time = asctime(timeinfo);
            strcpy(pathtmp->createtime, time);
            printf("文件名称修改完毕\n");
            return 1;
        }

    }
}
//读文件
int WriteFile(UserStruct *pwd)
{
    int ret = 0;
    char path[15];
    char filename[10];
    char text[250];
    FileStruct *pathtmp = NULL;
    filehead = pwd->child;
    printf("请输入要读文件所在的路径\n");
    scanf("%s", path);
    printf("请输入要读文件的名称\n");
    scanf("%s", filename);
    if (strcmp(path, "/") == 0)
    {
        while (filehead)
        {
            if (strcmp(filehead->filename, filename) == 0)
            {
                if (filehead->filemodeit != 2)
                {
                    printf("写入失败,没有执行写权限\n");
                    return -1;

                }
                else if (filehead->filetype!=2)
                {
                    printf("写入失败,文件不是文本文件\n");
                    return -1;
                }
                else
                {
                    ret = OpenFile(pwd, path, filename);
                    if (ret == -1)
                    {
                        printf("文件打开失败无法写入\n");
                        return -1;
                    }
                    printf("请输入要输入的字符\n");
                    scanf("%s", text);
                    filehead->text = (char*)malloc(250);
                    memset(filehead->text, 0, 250);

                    time(&rawtime);
                    timeinfo = localtime(&rawtime);
                    char *time = asctime(timeinfo);
                    strcpy(filehead->createtime, time);
                    strcpy(filehead->text, text);
                    ret = CloseFile(pwd, path, filename);
                    if (ret == -1)
                    {
                        printf("文件关闭失败无法写入\n");
                        free(filehead->text);
                        return -1;
                    }
                    printf("写入完毕\n");
                    return 1;
                }
            }
            filehead = filehead->liftbrother;
        }
        printf("没有此文件\n");
        return -1;
    }
    else
    {
        char*pathname = NULL;
        char d[] = "/";
        pathname = strtok(path, d);
        while (pathname != NULL)
        {
            pathtmp = SelectPath1(filehead, pathname);
            if (pathtmp == NULL)
            {
                printf("此路径无效\n");
                return ERROR;
            }
            filehead = pathtmp->child;
            pathname = strtok(NULL, d);
        }
        pathtmp = SelectPath1(filehead, filename);
        if (pathtmp == NULL)
        {
            printf("没有此文件\n");
            return -1;
        }
        if (pathtmp->filemodeit !=2)
        {
            printf("写入失败,没有执行写权限\n");
            return -1;

        }
        else if (pathtmp->filetype!=2)
        {
            printf("写入失败,文件不是文本文件\n");
            return -1;
        }
        else
        {
            ret = OpenFile(pwd, path, filename);
            if (ret == -1)
            {
                printf("文件打开失败无法写入\n");
                return -1;
            }
            printf("请输入要输入的字符\n");
            scanf("%s", text);
            filehead->text = (char*)malloc(250);
            memset(filehead->text, 0, 250);

            time(&rawtime);
            timeinfo = localtime(&rawtime);
            char *time = asctime(timeinfo);
            strcpy(pathtmp->createtime, time);
            strcpy(filehead->text, text);
            ret = CloseFile(pwd, path, filename);
            if (ret == -1)
            {
                printf("文件关闭失败无法写入\n");
                free(filehead->text);
                return -1;
            }
            printf("写入完毕\n");
            return 1;
        }

    }
}
//写文件
int ReadFile(UserStruct *pwd)
{
    int ret = 0;
    char path[15];
    char filename[10];
    char text[250];
    FileStruct *pathtmp = NULL;
    filehead = pwd->child;
    printf("请输入要读文件所在的路径\n");
    scanf("%s", path);
    printf("请输入要读文件的名称\n");
    scanf("%s", filename);
    if (strcmp(path, "/") == 0)
    {
        while (filehead)
        {
            if (strcmp(filehead->filename, filename) == 0)
            {
                if (filehead->filemodeit==0)
                {
                    printf("读失败,没有执行读权限\n");
                    return -1;

                }
                else if (filehead->filetype != 2)
                {
                    printf("读失败,文件不是文本文件\n");
                    return -1;
                }
                else
                {
                    ret = OpenFile(pwd, path, filename);
                    if (ret == -1)
                    {
                        printf("文件打开失败无法读出\n");
                        return -1;
                    }
                    printf("读取的内容是\n");
                    printf("%s\n", filehead->text);
                    ret = CloseFile(pwd, path, filename);
                    if (ret == -1)
                    {
                        printf("文件关闭失败\n");
                        return -1;
                    }
                    return 1;
                }
            }
            filehead = filehead->liftbrother;
        }
        printf("没有此文件\n");
        return -1;
    }
    else
    {
        char*pathname = NULL;
        char d[] = "/";
        pathname = strtok(path, d);
        while (pathname != NULL)
        {
            pathtmp = SelectPath1(filehead, pathname);
            if (pathtmp == NULL)
            {
                printf("此路径无效\n");
                return ERROR;
            }
            filehead = pathtmp->child;
            pathname = strtok(NULL, d);
        }
        pathtmp = SelectPath1(filehead, filename);
        if (pathtmp == NULL)
        {
            printf("没有此文件\n");
            return -1;
        }
        if (pathtmp->filemodeit == 0)
        {
            printf("读取失败,没有执行读权限\n");
            return -1;

        }
        else if (pathtmp->filetype != 2)
        {
            printf("写入失败,文件不是文本文件\n");
            return -1;
        }
        else
        {
            ret = OpenFile(pwd, path, filename);
            if (ret == -1)
            {
                printf("文件打开失败无法读取\n");
                return -1;
            }
            printf("读取的内容是\n");
            printf("%s\n", filehead->text);
            ret = CloseFile(pwd, path, filename);
            if (ret == -1)
            {
                printf("文件关闭失败\n");

                return -1;
            }
            printf("写入完毕\n");
            return 1;
        }

    }
}
//设置共享文件
int SetShared(UserStruct *pwd)
{
    char path[15];
    int shad = 0;
    int mode = 0;
    char filename[10];
    FileStruct *pathtmp = NULL;
    filehead = pwd->child;
    printf("请输入要进行修改文件所在的路径 根目录是/ \n");
    scanf("%s", path);
    printf("请输入要进行修改文件的名称\n");
    scanf("%s", filename);
    while (1)
    {

        printf("请输是否要共享  0不共享 1共享\n");
        scanf("%d", &shad);
        if (shad == 0 || shad == 1)
            break;
        else
        {
            printf("只能输入 0或1");
        }
    }
    while (1)
    {
        printf("请输入权限 1:只读  2:读写\n");
        scanf("%d", &mode);
        if (mode == 1 || mode == 2)
            break;
        else
        {
            printf("只能输入1或2\n");
        }
    }
    if (strcmp(path, "/") == 0)
    {
        while (filehead)
        {
            if (strcmp(filehead->filename, filename) == 0)
            {
                if (filehead->filemodeit == 0)
                {
                    printf("修改失败,没有执行权限\n");
                    return -1;

                }
                else
                {

                    time(&rawtime);
                    timeinfo = localtime(&rawtime);
                    char *time = asctime(timeinfo);
                    strcpy(filehead->createtime, time);
                    filehead->isshared = shad;
                    filehead->filemodeit = mode;
                    printf("文件修改完毕\n");
                    return 1;
                }
            }
            filehead = filehead->liftbrother;
        }
        printf("没有此文件\n");
        return -1;
    }
    else
    {
        char*pathname = NULL;
        char d[] = "/";
        pathname = strtok(path, d);
        while (pathname != NULL)
        {
            pathtmp = SelectPath1(filehead, pathname);
            if (pathtmp == NULL)
            {
                printf("此路径无效\n");
                return ERROR;
            }
            filehead = pathtmp->child;
            pathname = strtok(NULL, d);
        }
        pathtmp = SelectPath1(filehead, filename);
        if (pathtmp == NULL)
        {
            printf("没有此文件\n");
            return -1;
        }
        if (pathtmp->filemodeit == 0)
        {
            printf("修改失败,没有执行权限\n");
            return -1;

        }
        else
        {

            time(&rawtime);
            timeinfo = localtime(&rawtime);
            char *time = asctime(timeinfo);
            strcpy(pathtmp->createtime, time);
            pathtmp->isshared = shad;
            pathtmp->filemodeit = mode;
            printf("文件修改完毕\n");
            return 1;
        }

    }
}
int user()
{
    int ret = 0;
    int type = 0;
    while (1)
    {
        printf("-----------------------------------------------------------\n");
        printf("------1:是登陆(默认用户 root)        2:创建用户------------\n");
        printf("------0:退出-----------------------------------------------\n");
        printf("-----------------------------------------------------------\n");
        printf("-----------------------------------------------------------\n");


        printf("请选择\n");
        scanf("%d", &type);
        if (type != 1 && type != 2 && type != 0)
            continue;
        switch (type)
        {
        case 1:
            pwd = Login(userhead);
            if (pwd == NULL)
            {
                printf("登陆失败\n");
            }
            else if (pwd != NULL)
            {
                printf("登陆成功\n");
                return 1;
            }
            break;
            case 2:
            ret = CreateUser(userhead);
            if (ret == 0)
            {
                printf("创建用户成功\n");
            }
            break;
        case 0:
            return 0;
        default:
            printf("输入有误\n");
            break;

        }
    }
}
void Run()
{
    int type = 0;
    int ret = 0;
    while (1)
    {
        printf("-----------------------------------------------------------\n");
        printf("------1:创建文件                     2:删除文件------------\n");
        printf("------3:显示文件                     4:重命名--------------\n");
        printf("------5读文件                        6:写文件--------------\n");
        printf("------7打开文件                      8:关闭文件------------\n");
        printf("------0:退出                        9:设置共享属性--------\n");
        printf("-----------------------------------------------------------\n");


        printf("请选择\n");
        scanf("%d", &type);

        if (type !=1 && type != 2 && type !=3 && type != 4 && type != 0 && type !=5 && type !=6 && type !=7 && type != 8 && type != 9)
            continue;
        switch (type)
        {
        case 1:
            ret = CreateFile(pwd);
            if (ret==-1)
            {
                printf("创建失败\n");
            }
            else if (ret == 1)
            {
                printf("创建成功\n");
                printf("位图使用 0未使用 1已使用\n");
                int i = 0;
                int j = 0;
                for (i; i < MaxHang; i++)
                {
                    for (j=0; j < MaxLie; j++)
                    {
                        printf("%d ", MaxMap[i][j]);
                    }
                    printf("\n");
                }
            }

            break;
        case 2:
            ret = DeleteFile(pwd);
            if (ret == -1)
            {
                printf("删除失败\n");
            }
            else if (ret == 1)
            {
                printf("删除成功\n");
                printf("位图使用 0未使用 1已使用\n");
                int i = 0;
                int j = 0;
                for (i; i < MaxHang; i++)
                {
                    for (j=0; j < MaxLie; j++)
                    {
                        printf("%d ", MaxMap[i][j]);
                    }
                    printf("\n");
                }
            }
            break;
        case 3:
            List(pwd);
            break;
        case 4:
            ret = ResetName(pwd);
            break;
        case 5:
            ReadFile(pwd);
            break;
        case 6:
            WriteFile(pwd);
                break;
        case 7:
            ret = OpenFile(pwd,"@","@");
                break;
        case 8:
            ret = CloseFile(pwd,"@","@");
            break;
        case 9:
            ret = SetShared(pwd);
            break;
        case 0:
            return ;

        default:
            printf("输入有误\n");
            break;
        }
    }
}

//打开文件

int main(void)
{
    int ret = 0;
    int i = 0;
    int j = 0;

    ret = Init(&userhead);
    ret = InitRoot(&userhead);
    ret = user();
    if (ret == 1)
    {
        ret = Initblock();
        InitMap();
        printf("位图使用 0未使用 1已使用\n");
        for (i; i < 8; i++)
        {
            for (j = 0; j < 8; j++)
            {
                printf("%d ", MaxMap[i][j]);
            }
            printf("\n");
        }
        Run();
    }


    system("pause");
    return 0;
}

初次写,高手飘过。

1 概述 文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。 本次实验我们实现了多级目录下的文件管理系统,具备文件系统的文件创建、删除、读写以及目录的创建、删除等操作,并在内存中开辟一块空间,模拟虚拟磁盘,成功地展示出文件系统的功能和属性。 2 课程设计的任务和要求 2.1 设计任务 在下列内容中任选其一: 1、多用户、多级目录结构文件系统的设计与实现; 2、WDM驱动程序开发; 3、存储管理系统的实现,主要包括虚拟存储管理调页、缺页统计等; 4、进程管理系统的实现,包括进程的创建、调度、通信、撤消等功能; 5、自选一个感兴趣的与操作系统有关的问题加以实现,要求难度相当。 2.2 设计要求 1、在深入理解操作系统基本原理的基础上,对于选定的题目,以小组为单位,先确定设计方案; 2、设计系统的数据结构和程序结构,设计每个模块的处理流程。要求设计合理; 3、编程序实现系统,要求实现可视化的运行界面,界面应清楚地反映出系统的运行结果; 4、确定测试方案,选择测试用例,对系统进行测试; 5、运行系统并要通过验收,讲解运行结果,说明系统的特色和创新之处,并回答指导教师的提问; 6、提交课程设计报告。 集体要求: 1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。 2.文件物理结构可采用显式链接或其他方法。 3.磁盘空闲空间的管理可选择位示图或其他方法。如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。 4.文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。目录组织方式可以不使用索引结点的方式,但使用索引结点,则难度系数为1.2。 5.设计一个较实用的用户界面,方便用户使用。要求提供以下相关文件操作: (1)具有login (用户登录) (2)系统初始化(建文件卷、提供登录模块) (3)文件的创建: create (4)文件的打开:open (5)文件的读:read (6)文件的写:write (7)文件关闭:close (8)删除文件:delete (9)创建目录(建立子目录):mkdir (10)改变当前目录:cd (11)列出文件目录:dir (12)退出:logout ................................................
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值