实验四 设备管理
任务二
一、实验名称
文件系统之设计实验
二、实验目的
编写并调试文件系统模拟程序,掌握文件概念、文件目录和磁盘结构等,在实验中加深理解并运用之。
三、实验过程
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;
}