操作系统实验报告四 设备管理 任务二

实验四 设备管理

任务二

一、实验名称

      文件系统之设计实验

二、实验目的

编写并调试文件系统模拟程序,掌握文件概念、文件目录和磁盘结构等,在实验中加深理解并运用之。

三、实验过程

1、设计一个树形目录结构地文件系统。其根目录为root,各分支可以是目录,也可以是文件,最后的叶子都是文件;为该文件系统设计2~3个文件操作命令,并加以实现,如显示树形目录的命令、移动读写指针的命令,改变文件属性命令、更换文件名命令、改变文件保护级别命令等。

1)描述系统模型、命令功能设计流程、定义数据结构。

系统模型:
主要包括数据结构:树;结点:文件;操作:显示树形目录、文件信息、存储文件。
命令功能设计流程:
先设计如何创建头节点,这是关键部分,因为没有头节点,就无法进行树形目录的创建;
接着设计插入函数,包括插入目录和插入文件,难点在于它们之间的层次关系;其次还有文件信息的录入;
然后实现层序遍历,这是为了打印路径的需要。
数据结构:

typedef struct node//结点
{
    char *data;   //文件名
    int dir_file;  //文件夹
    struct node *first_child,*next_sibling;//指针
} tree;//多叉树
typedef struct
{
    tree * data;
    int pre;
} Box;
typedef struct
{
    Box data[100];
    int front,rear;
} Queue;
2)运行的数据和结果如下图:

在这里插入图片描述
2、设计一个容纳n个用户的文件系统,每个用户可保存m个文件,用户在一次运行中只能打开一个文件、对文件必须设置保护措施,且至少有Create、delete、open、close、read、write命令。
1)描述系统模型、命令功能设计流程、定义数据结构。
2)运行的数据和结果。

四、实验总结

通过此次实验,我对文件系统有了新的认识与理解,对文件目录的结构、文件的相关操作也有了一些掌握……

五、代码

1、树形目录结构地文件系统
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;

using namespace std;

typedef struct node//结点
{
    char *data;   //文件名
    int dir_file;  //文件夹
    struct node *first_child,*next_sibling;//指针
} tree;//多叉树

typedef struct
{
    tree * data;
    int pre;
} Box;

typedef struct
{
    Box data[100];
    int front,rear;
} Queue;

Queue que;

void height(tree *t)    // 层序遍历
{
    tree *p = t,*q;
    que.data[0].data = p;
    que.data[0].pre = -1;
    que.front = -1;
    que.rear = 0;
    if(p->first_child == NULL)
        return ;
    while(que.front != que.rear)
    {
        que.front++;
        q = que.data[que.front].data->first_child;
        while(q != NULL)
        {
            que.rear++;
            que.data[que.rear].data = q;
            que.data[que.rear].pre = que.front;
            q = q->next_sibling;
        }
    }
}

tree *insertTree(char *ch, tree *parent, tree *pre_sibling,int judge)//插入
{
    tree *child = (tree *)malloc(sizeof(tree));
    child->data = ch;
    child->dir_file = judge;

    if (parent != NULL)
    {
        parent->first_child = child;
    }
    if (pre_sibling != NULL)
    {
        pre_sibling->next_sibling = child;
    }

    child->first_child = NULL;
    child->next_sibling = NULL;

    return child;
}

tree *create()  //创建头节点
{
    tree *root = (tree *)malloc(sizeof(tree));
    root->data = "root";
    root->dir_file = 1;
    root->first_child = NULL;
    root->next_sibling = NULL;
    return root;
}

void insert(Queue q,int index,int tj)  //插入函数
{
    char *name;
    name = new char [10];
    bool judge;
    if(q.data[index].data->dir_file == 0) //文本文件
    {
        cout<<"当前文件是:"<<q.data[index].data->data<<endl;
        cout<<"输入名字 :";
        cin>>name;
        cout<<"输入 \"0\":";
        cin>>judge;
        tree *node = insertTree(name,NULL,q.data[index].data,judge);
    }
    else if(q.data[index].data->dir_file == 1 && tj == 1)    //在同一目录下创建另一文件
    {
        cout<<"当前文件是:"<<q.data[index].data->data<<endl;
        cout<<"输入名字 :";
        cin>>name;
        cout<<"若是目录,输入\"1\",否则输入 \"0\":";
        cin>>judge;
        tree *node = insertTree(name,NULL,q.data[index].data,judge);
    }
    else//在某一目录下创建文件
    {
        cout<<"当前目录是 "<<q.data[index].data->data<<endl;
        cout<<"输入名字:";
        cin>>name;
        cout<<"若是目录,输入\"1\",否则输入 \"0\":";
        cin>>judge;
        tree *node = insertTree(name,q.data[index].data,NULL,judge);
    }

}

int main()
{
    int mark = 0;
    int num = 1;
    int tj = 0;
    int temp[100];
    tree *root = create();
    height(root);
    while(mark != -1)
    {
        cout<<"now is No."<<num<<",输入文件数量:";
        cin>>num;
        cout<<"是同一路径的吗? 1.是 2.否"<<endl;
        cin>>tj;
        if(tj == 1)
            tj = 1;
        else
            tj = 0;
        insert(que,num-1,tj);
        height(root);
        cout<<"退出请输 -1 ,继续请输 1 :";
        cin>>mark;
    }
    for(int i = 1; i<=que.rear; i++)      //打印路径
    {
        int k = que.data[i].pre;
        int j = 0;
        while(k != -1)
        {
            temp[j] = k;
            j++;
            k = que.data[k].pre;
        }
        while(j > 0)
        {
            j--;
            cout<<"/"<<que.data[temp[j]].data->data;
        }
        cout<<"/"<<que.data[i].data->data<<endl;
    }
}
2、设计一个容纳n个用户的文件系统
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define getpch(type) (type*)malloc(sizeof(type))
int userNum=0;
struct mdf
{
    char userName[20];
    struct UFD* p;
} mdf[20];

struct ufd
{
    char fileName[20];
    char File[50];
    struct ufd * next;
}*fp,*tp,*p,*begin;

typedef struct  ufd UFD ;
void show(struct UFD *f)
{
    begin=f;
    if(begin->next==NULL)  printf("该用户名下尚无文件!\n");
    else
    {
        printf("该用户名下所有文件:\n");
        begin=begin->next;
        while(begin!=NULL)
        {
            printf("%s: %s\n",begin->fileName,begin->File);
            begin=begin->next;
        }
    }
}
void Operation(struct UFD *f)
{
    int i;
    char filename[20],file[50];
    begin=f;
label:
    printf("请选择操作:\n 1:create; 2:delete; 3:read;  4:write; 5:open;\n 6:lose; 7:Chang File's Name; 8:Show All The File\n");
    scanf("%d",&i);
    if(i==1)
    {
        tp=getpch(UFD);
        printf("请输入文件名:");
        scanf("%s",filename);
        printf("\n请输入文件内容:");
        scanf("%s",file);
        strcpy(tp->fileName,filename);
        strcpy(tp->File,file);
        tp->next=NULL;
        p=begin;
        p->next=tp;
        printf("\n文件创建完毕!\n");
        goto label;
    }
    else if(i==2)
    {
        printf("请输入文件名:");
        scanf("%s",filename);
        p=begin->next;
        while(strcmp(p->fileName,filename)!=0&&p!=NULL)             p=p->next;
        if(p==NULL)              printf("文件不存在!\n");
        else
        {
            tp=begin;
            while(tp->next!=p)                 tp=tp->next;
            tp->next=p->next;
            free(p);
            printf("文件已删除!\n");
        }
        goto label;
    }
    else if(i==3)
    {
        printf("请输入文件名:");
        scanf("%s",filename);
        p=begin->next;
        while(strcmp(p->fileName,filename)!=0&&p!=NULL)             p=p->next;
        if(p==NULL)              printf("文件不存在!\n");
        else
        {
            printf("%s: %s\n",p->fileName,p->File);
        }
        goto label;
    }
    else if(i==4)
    {
        printf("请输入文件名:");
        scanf("%s",filename);
        printf("\n请输入文件内容:");
        scanf("%s",file);
        p=begin->next;
        while(p!=NULL)
        {
            if(!(strcmp(p->fileName,filename)))
            {
                strcpy(p->File,file);
                printf("\n替换了以%s为名的文件!\n",filename);
                goto label;
            }
            p=p->next;
        }
        tp=getpch(UFD);
        strcpy(tp->fileName,filename);
        strcpy(tp->File,file);
        tp->next=NULL;
        p=begin;
        p->next=tp;
        printf("\n创建了以%s为名的文件!\n",filename);
        goto label;
    }
    else if(i==5)
    {
        goto label;
    }
    else if(i==6)
    {
        printf("功能被关闭,无法操作了\n");
        Select();
    }
    else if(i==7)
    {
        printf("请输入要改名的文件名:");
        scanf("%s",filename);
        while(p!=NULL)
        {
            if(!(strcmp(p->fileName,filename)))
            {
                printf("\n请输入新的文件名:");
                scanf("%s",filename);
                strcpy(p->fileName,filename);
                printf("\n文件名已更改!\n");
                goto label;
            }
            p=p->next;
        }
        printf("文件不存在!\n");
        goto label;
    }
    else if(i==8)
    {
        show(f);
        goto label;
    }
    else
    {
        goto label;
    }
}
void Select()
{
    char username[20];
    int i;
    printf("请输入用户名:\n");
    scanf("%s",username);
    for(i=0; i<userNum; i++)
    {
        if(!strcmp(mdf[i].userName,username))
        {
            fp= mdf[i].p;
            if(fp!=NULL)
            {
                printf("该用户已创建文件:\n");
                while(fp!=NULL)
                {
                    fp=fp->next;
                    printf("%s\n",fp->fileName);
                }
            }
            else
            {
                printf("该用户尚未创建任何文件!\n");
            }
            fp= mdf[i].p;
            Operation(fp);
        }
    }
    if(i>=userNum)
    {
        printf("该用户不存在,创建新用户?\n   1:是  2:否\n");
        scanf("%d",&i);
        if(i==1)
        {
            strcpy(mdf[userNum++].userName,username);
            printf("已创建用户!\n");
            i=userNum-1;
            fp= mdf[i].p;
            Operation(fp);
        }
        else
        {
            printf("查询其它?\n 1:是  2:否\n");
            scanf("%d",&i);
            if(i==1)
            {
                Select();
            }
            else
            {
                printf("谢谢使用!\n");
                return;
            }
        }
    }
}
int main()
{
    int i;
    for(i=0; i<20; i++)
    {
        tp=getpch(UFD);
        tp->next=NULL;
        mdf[i].p=tp;
    }
    Select();
    return 0;
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

少年李富贵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值