操作系统 文件与磁盘管理 C语言(模拟文件目录)

1、利用内存或外存存储结构实现文件系统的树型目录结构,并通过交互式命令完成文件与目录管理。
2、至少提供如下命令(大小写都能识别):MD(创建空目录)、CD(切换当前目录)、RD(删除空目录)、MK(创建文件)、DEL(删除文件)和 DIR(列出目录信息)
3、目录结构必须使用 FCB 或 i-node 格式(可适当增减具体项目),目录项至少包括文件或目录名称、类型(文件或目录)、创建日期、大小。

#include <stdio.h>
#include <stdlib.h>

#include<time.h>
#include <string.h>
typedef struct FCB{ //文件或目录控制块
    char name[10];//文件或目录名
    int size;//文件或目录大小,目录大小可设置为 0
    char type;//类型,1 为文件,2 为目录
    int first;//外存起始位置  -1被占 -2未被占
    char datetime[128]; //日期时间,格式为 yyyymmdd hhmmss
    struct FCB *next;//下一个兄弟节点
    struct FCB *child;//第一个孩子节点
    struct FCB *parent;

}F;
typedef struct list{
    char name[10];
    struct node *next;
}node;
F *p  = NULL;//指向当前目录
int b[100][100];//位视图
int FAT[100];
node *head = NULL;
void getTime(F *f)
{
    time_t  t;
	char  buf[128];
	memset(buf,0,sizeof(buf));
	struct tm *tmp;
	t = time(NULL);
	tmp = localtime(&t);
	strftime(buf,sizeof(buf),"%Y-%m-%d %H:%M:%S",tmp);
	for(int i = 0;i<128 ; i++)
    {
        f->datetime[i] = buf[i];
    }
}
void byteCreat()
{
    srand((unsigned)time(NULL));
    for(int i = 0;i<8;i++)
    {
        for(int j = 0;j<8;j++)
        {
            b[i][j]=rand()%2;
            printf("%d ",b[i][j]);
            if(b[i][j]==0)
            {
                FAT[i*8+j] = -2;//未被占;
            }else if(b[i][j]==1)
            {
                FAT[i*8+j] = -1;//-1:被占
            }

        }
        printf("\n");
    }
}
void byteShow()
{
    for(int i = 0;i<8;i++)
    {
        for(int j = 0;j<8;j++)
        {
            printf("%d ",b[i][j]);
        }
        printf("\n");
    }
}
void fatShow()
{
    int count = 0;
    for(int i = 0; i<64;i++)
    {
        if(FAT[i]!=-2&&FAT[i]!=-1)
        {
            count++;
            printf("%d->%d\n",i,FAT[i]);
            if(count==2)
            {
                printf("***\n");
                count=0;
            }
        }
    }
}
int findNULL()
{
    int x,y,z;
    int a = 0;
    for(int i = 0;i<8;i++)
    {
        for(int j = 0;j<8;j++)
        {
            if(b[i][j] == 0)
            {
                x = i*8+j;
                b[i][j] = 1;
                a = 1;
                break;
            }
        }
        if(a==1) break;
    }
    a = 0;
    for(int i = 0;i<8;i++)
    {
        for(int j = 0;j<8;j++)
        {
            if(b[i][j] == 0)
            {
                y = i*8+j;
                b[i][j] = 1;
                a = 1;
                break;
            }
        }
        if(a==1) break;
    }
    a = 0;
    for(int i = 0;i<8;i++)
    {
        for(int j = 0;j<8;j++)
        {
            if(b[i][j] == 0)
            {
                z = i*8+j;
                b[i][j] = 1;
                a = 1;
                break;
            }
        }
        if(a==1) break;
    }
    FAT[x] = y;
    FAT[y] = z;
    FAT[z] = -1;
    return x;
}
void makedir(int a)
{

    char name[10];
    F *np = p;
    //printf("请输入目录或文件的名字\n");
    scanf(" %s",name);
    F *f = (F *)malloc(sizeof(F));//新建空白目录
    strcpy(f->name,name);
    if(a==1)
    {
        f->type = 1;
        f->first = findNULL();
    }
    if(a==2)
    {
        f->type = 2;
        f->first = -2;
    }
    f->size = 0;
    getTime(f);
    f->child = NULL;
    f->next = NULL;
    f->parent = np;
    if(np->child==NULL)
    {
        np->child = f;
    }else//进入当前子目录
    {
        np = np->child;//指向第一个目录或文件
        if(a==2)
        {
            if(np->type==2)
            {
                while(np->next!=NULL)
                {
                    if(np->type==2&&np->next->type == 1)//新建在目录和文件中间
                    {
                        break;
                    }
                    np = np->next;
                }
                f->next = np->next;
                np->next = f;
            }
        }else if(a==1)
        {
            while(np->next!=NULL)
            {
                np = np->next;
            }
            f->next = np->next;
            np->next = f;
        }

    }
}
void cdir(char *name)
{
    F* np = p;
    np = np->child;
    if(strcmp(np->name,name)==0)
    {
        p = np;//找到并进入
    }else
    {
        while(strcmp(np->name,name)!=0)
        {
            np = np->next;
            if(strcmp(np->name,name)==0)
            {
                p = np;//找到并进入
                break;
            }
            if(np==NULL)
            {
                printf("未找到此目录");
                break;
            }
        }
    }

}
void printNow()
{
    F *np = p;
    if(p->child==NULL)
    {
        printf("当前文件夹为空\n");
    }else
    {
        np = np->child;
        printf("%s    <DIR>      .\n",np->parent->datetime);
        printf("%s    <DIR>      ..\n",np->parent->datetime);
        while(np!=NULL)
        {
            printf("%s 类型:%d 名字:%s\n",np->datetime,np->type,np->name);
            np = np->next;
        }
    }
}
void delDir(char *name)
{
    int flag = 0;
    F *np = p;
    if(np->child==NULL)
        printf("无此目录\n");
    else
    {
        np = np->child;
        if(strcmp(np->name,name)==0&&np->child==NULL)//为第一个
        {
            p->child=np->next;
            free(np);
            printf("成功删除此目录\n");
            flag = 1;
        }
        else
        {
            while(np->next!=NULL)
            {
                if(strcmp(np->next->name,name)==0&&np->next->child==NULL)
                {
                    np->next = np->next->next;
                    flag = 1;
                    printf("成功删除此目录\n");
                    break;
                }
                np = np->next;
            }
        }
        if(flag==0)
        {
            printf("删除失败!无当前目录或当前目录不为空\n");
        }
    }
}
void delFile(char *name)
{
    int flag = 0;
    F *np = p;
    if(np->child==NULL)
        printf("无此文件\n");
    else
    {
        np = np->child;
        if(strcmp(np->name,name)==0)//为第一个
        {
            p->child=np->next;
            printf("成功删除此文件\n");
            updateTable(np->first);//更新fat表
            flag = 1;
        }
        else
        {
            while(np->next!=NULL)
            {
                if(strcmp(np->next->name,name)==0)
                {
                    updateTable(np->next->first);//更新fat表
                    np->next = np->next->next;
                    flag = 1;
                    printf("成功删除此文件\n");
                    break;
                }
                np = np->next;
            }
        }
        if(flag==0)
        {
            printf("删除失败!无当前目录或当前目录不为空\n");
        }
    }
}
void updateTable(int first)
{
    int next = first;//4
    int next1 = FAT[next];//7
    int next2 = FAT[next1];//11
    FAT[next] = -2;//修改FAT表
    FAT[next1] = -2;
    FAT[next2] = -2;
    b[next/8][next%8] = 0;//修改位视图表
    b[next1/8][next1%8] = 0;
    b[next2/8][next2%8] = 0;
}
void updatelujing()//更新当前所在位置
{
    F *np = p;
    F a[100];
    int count = 0;
    while(np->parent!=NULL)
    {
        a[count] = *np;
        np = np->parent;
        count++;
    }
    for(int i = count-1;i>0;i--)
    {
        printf("%s\\",a[i].name);
    }
    printf("%s\\",p->name);
    printf(">");
}
int main()
{
    char a[6];
    char f_name[10];
    int flag = 1;
    F *f = (F *)malloc(sizeof(F));
    strcpy(f->name,"root");
    f->type = 2;
    f->size = 0;
    getTime(f);
    f->child = NULL;
    f->next = NULL;
    f->parent = NULL;
    f->first = -2;
    p = f;//p指向当前目录
    byteCreat();
    head = (node *)malloc(sizeof(node));
    head->next = NULL;
    while(flag)
    {
        do{
            updatelujing();
            scanf(" %s",a);
            if(strcmp(a,"md")==0)//创建空目录
            {
                makedir(2);
            }else if(strcmp(a,"cd")==0)
            {
                //printf("请输入目录名\n");
                scanf(" %s",f_name);
                cdir(f_name);
            }else if(strcmp(a,"rd")==0)//删除空目录
            {
                //printf("请输入需要删除的目录名\n");
                scanf(" %s",f_name);
                delDir(f_name);
            }else if(strcmp(a,"mk")==0)//创建文件
            {
                makedir(1);
            }else if(strcmp(a,"del")==0)//删除文件
            {
                //printf("请输入需要删除的文件名\n");
                scanf(" %s",f_name);
                delFile(f_name);
            }else if(strcmp(a,"dir")==0)//列出目录信息
            {
                printNow();
            }else if(strcmp(a,"q")==0)
            {
                flag = 0;
            }else if(strcmp(a,"show") == 0)//展示位示图
            {
                byteShow();
            }else if(strcmp(a,"fat") == 0)//展示fat表
            {
                fatShow();
            }else if(strcmp(a,"cd..") == 0)//返回上一级目录
            {
                p = p->parent;
            }
        }while(flag==1);
    }
    return 0;
}

运行截图

在根目录创建两个文件夹运行截图
前8行为位示图
在第一个文件夹创建文件运行截图
删除此文件运行截图
删除第二个目录运行截图

  • 13
    点赞
  • 133
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木子Link

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值