#include<iostream.h>
#include<malloc.h>
#include<string.h>
#include "process.h"
#define NULL 0
#define get(type) (type *)malloc(sizeof(type))
struct ufd //用户目录结构体
{
char filename[10]; //文件或文件夹名字
char symbol; //标志,0:文件;1:文件夹
int protect; //文件的读写保护位,0:只读;1:读写
int length; //文件长度
struct ufd *father; //文件或文件夹指向父节点的指针
struct ufd *child; //文件或文件夹指向子节点的指针
struct ufd *brother; //文件或文件夹指向兄弟节点的指针
};
typedef struct ufd UFD;
UFD *current,*root; //root:根目录指针;current指针:指向当前操作节点的父节点指针
void Insert(UFD *p) //节点插入函数
{
UFD *n;
p->father=current; //插入节点的父节点为当前current指针
if(current->child==NULL)//如果p是当前节点的第一个子节点则插入
{
current->child=p;
}
else //不是则插到兄弟节点链表的最后
{ n=current->child;
while(n->brother!=NULL)
n=n->brother;
n->brother=p;
}
}
void Creat() //文件(文件夹)建立函数
{
char c;
UFD *p;
if(current->symbol=='0')//如果是文件下建立文件或文件夹的话报错
{
cout<<"文件下不能创建文件或文件夹!\n\n";
}
else
{
cout<<"请选择创建类型:(0: 文件 ; 1: 文件夹 )";//选择类型
cin>>c;
p=get(UFD); //分配节点空间
p->symbol=c; //标志位
cout<<"名字:"; //输入文件(文件夹)名
cin>>p->filename;
p->father=NULL; //初始化节点p父节点,子节点和兄弟节点为空
p->child=NULL;
p->brother=NULL;
if(c!='1'&&c!='0') //输入类型判断
{
cout<<"\n所选类型错误!请重新选择\n";
free(p);
Creat();
}
else
{
if(c=='0') //如果是文件则需要输入文件的权限以及文件长度
{
cout<<"文件权限:(0: 只读 ; 1: 读写 )";
cin>>p->protect;
cout<<"文件长度:";
cin>>p->length;
}
else //文件夹则把权限以及长度设为空
{
p->protect=NULL;
p->length=NULL;
}
Insert(p); //把生成节点p插入到链表里面去
}
cout<<"操作完成........\n\n";
}
}
void Delete() //文件(文件夹)删除函数
{
char n[10];
UFD *p,*pre;
cout<<"请输入要删除文件名:"; //输入要删除的文件(文件夹)名
cin>>n;
p=current->child; //p指向当前目录下首个节点
while(p!=NULL)
{
if(strcmp(p->filename,n)==0) //顺序寻找文件名
{
if(p==current->child) //队首元素
{
cout<<"\n文件 "<<p->filename<<" 已经成功删除........\n\n";
current->child=p->brother;
free(p);
}
else
{
pre->brother=p->brother; //把前一个指针的NEXT指向当前指针的NEXT,删除p指向的文件
cout<<"\n文件 "<<p->filename<<" 已经成功删除........\n\n";
free(p); //free掉要删除的节点
}
break;
}
else //指针按顺序查找
{
pre=p;
p=p->brother;
}
}
if(p==NULL) //该文件不存在则报错
cout<<"\n\n没有文件存在........\n\n";
}
void Show() //文件(文件夹)显示函数
{
UFD *n;
int count=0;
n=current->child; //n指向当前目录下首个节点
while(n!=NULL) //如果不空,则输出节点的信息
{
count+=1;
cout<<"\n"<<n->filename<<"\t\t";
switch(n->symbol) //根据标志位判断是文件或是文件夹
{
case '0':cout<<"类型:文件\t权限:";//如果是文件则输出文件信息
if(n->protect==0)
cout<<"只读";
else cout<<"读写";
cout<<"\t文件长度:"<<n->length;
break;
case '1':cout<<"类型:文件夹";//如果是文件夹则输出文件夹信息
break;
}
n=n->brother; //按链表顺序查找
}
if(count==0) //该文件不存在
cout<<"没有文件或文件夹存在........\n\n";
cout<<"\n\n";
}
void Open() //文件(文件夹)打开函数
{
char n[10];
UFD *p;
cout<<"请输入要打开的文件或文件夹名:";//根据文件名查找
cin>>n;
p=current->child; //p指向当前目录下首个节点
while(p!=NULL) //p不空则顺序查找
{
if(strcmp(p->filename,n)==0)//找到想要打开的文件或是文件夹则输出
{
current=p; //当前指针指向新打开的文件或是文件夹
if(p->symbol=='0')
cout<<"文件 "<<p->filename<<" 已经打开........\n\n";
else
cout<<"文件夹 "<<p->filename<<" 已经打开........\n\n";
break;
}
else
p=p->brother;
}
if(p==NULL) //找不到报错
cout<<"\n\n没有文件存在!";
}
void Back() //文件(文件夹)指针返回函数
{
if(current->father==NULL)//如果当前指针已经指到了最外面一层则报错
{
cout<<"目录不能再返回了........\n\n";
}
else //不是最外一层则把current指针指向当前指针的父节点
{
current=current->father;
cout<<"文件目录已返回........\n\n";
}
}
void Display() //操作显示函数
{
char c;
//system("cls");
cout<<"\n\n\n\n\n\n请选择下面数字对应的操作:\n";
cout<<"=====================================================================\n";
cout<<"\t1:当前目录下创建文件或文件夹\n";
cout<<"\t2:当前目录下删除文件或文件夹\n";
cout<<"\t3:显示当前目录下所有文件和文件夹\n";
cout<<"\t4:打开文件或文件夹\n";
cout<<"\t5:返回(或关闭已经打开的文件)\n";
cout<<"\t0:退出\n";
cout<<"=====================================================================\n选择?";
cin>>c;
switch(c)
{
case '1':Creat();Display();break;
case '2':Delete();Display();break;
case '3':Show();Display();break;
case '4':Open();Display();break;
case '5':Back();Display();break;
case '0':break;;
default :Display();break;
}
}
void main() //主函数
{
root=get(UFD); //初始化根节点
root->child=NULL; //初始化根节点的父指针,子指针和兄弟指针都为空
root->father=NULL;
root->brother=NULL;
current=root; //当前指针指向根节点
Display(); //调用操作显示函数
}