操作系统课程设计文件管理_操作系统课程设计文件
操作系统课程设计文件管理由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“操作系统课程设计文件”。
#include “stdio.h” #include “string.h” #include “malloc.h”
#include “stdlib.h”
#define MAX 1000 struct file/*普通文件的结构体*/ { //int type;//0无作用,当做一个空节点存在;1为记录型文件;2为执行文件
//前两个变量为文件的权限设置,1为允许操作,0为不允许操作
int write;//可写
int read;//可读
int length;//文件的长度
char ch[MAX];};typedef struct file File;
typedef struct ffile/*定义文件类型的结构体*/ { int type;//1为文件夹; 2为文件;
char name[20];//文件(夹)名字
int open;//文件打开标志,0为关,1为开
File iffile;//如果为文件时有的信息
struct ffile *parent;//指向上一级文件的指针
struct ffile *brother;//指向同级兄弟文件(夹)的指针
struct ffile *child;//指向下一级文件(夹)的指针 }Ffile;typedef Ffile *FFile;
/*typedef struct Open/*记录打开文件的结构体 { char name[20];//记录打开文件(夹)的名字
FFile* add;//记录打开文件上一级文件地址的指针 }Open;*/
//全局变量
FFile user1;//用户1 FFile user2;//用户2 FFile copyf;//记录被复制文件(夹)的上一级文件地址 //Open openf[20];//记录打开文件的队列
FFile init(void)/*初始化,创建根结点*/ { FFile c;c=(Ffile*)malloc(sizeof(Ffile));
c->type=2;c->open=0;//c->iffile.type=2;c->iffile.write=1;c->iffile.read=1;c->iffile.length=0;strcpy(c->name,“file1”);c->parent=NULL;c->child=NULL;c->brother=NULL;strcpy(c->iffile.ch,“NULL”);return(c);}
/*void initopen(){ int a,b;a=20;for(b=1;b
openf[b].add=NULL;} }*/
//传递要显示文件的parent的地址
void show(FFile user)/*显示当前界面存在的文件*/ { user=user->child;if(user==NULL){
printf(“该文件内没有任何文件(夹)。n”);return;} printf(“n”);for(;user!=NULL;){ printf(“<%s”,user->name);if(user->type==2){
/*if(user->iffile.type==1)
printf(“/记录型文件/”);
else
printf(“/执行文件/”);*/
printf(“/%dk”,user->iffile.length);} else {
printf(“/文件夹”);
}
printf(“>n”);
user=user->brother;} }
void creatf(FFile user)/*创建文件 || 文件夹*/ { FFile parent;char ch[20];//FFile user0;//parent=(Ffile*)malloc(sizeof(Ffile));parent=user;printf(“输入要创建文件(夹)的名字:n”);
scanf(“%s”,ch);if(user->child==NULL){
user->child=(Ffile*)malloc(sizeof(Ffile));
user=user->child;}else {
user=user->child;
for(;;)
{
if(user->type==0)//开端的空结点,用新结点覆盖
break;
if(!strcmp(user->name,ch))
{
printf(“错误:该文件名已经存在,文件(夹)创建失败!n”);
return;
}
if(user->brother==NULL)
{
user->brother=(Ffile*)malloc(sizeof(Ffile));
user=user->brother;
break;
}
user=user->brother;
}
} }
//设置新文件(夹)的信息 strcpy(user->name,ch);printf(“选择创建对象:1文件夹; 2文件;n”);scanf(“%d”,&user->type);user->open=0;if(user->type==2)//添加文件信息 {
//printf(“选择文件类型:1记录型文件;2执行文件;n”);//scanf(“%d”,&user->iffile.type);printf(“能否对文件进行读:0禁止;1允许;n”);scanf(“%d”,&user->iffile.read);printf(“能否对文件进行写:0禁止;1允许;n”);scanf(“%d”,&user->iffile.write);//printf(“设置文件大小(单位:K):n”);//scanf(“%d”,&user->iffile.length);user->iffile.length=0;strcpy(user->iffile.ch,“NULL”);} user->brother=NULL;user->child=NULL;user->parent=parent;printf(“文件创建成功!n”);void deletechildtree(FFile user)/*删除子树--结合deletefile();使用*/ { if(user->brother!=NULL)//从下到上,从右到左删除
{
deletechildtree(user->brother);} if(user->child!=NULL){
deletechildtree(user->child);} if(user!=NULL){
free(user);} }
void deletefile(FFile user,char ch[20])/*删除文件 || 文件夹*/ { FFile p,parent;
int a;parent=user;if(user->child==NULL){ printf(“错误:删除失败,该目录下没有可删除的文件(夹)!n”);return;} user=user->child;p=user;for(a=1;;a++)//找出要删除文件的所在位置 { if(!strcmp(user->name,ch))
break;if(user->brother==NULL){
printf(“错误:删除失败,当前位置没有该文件!n”);
return;}
if(a>1)
p=user;user=user->brother;} if(user->open==1)//判断文件的开关情况 {
} printf(“错误:删除失败,选择文件处于打开状态!n”);return;if(p==user)//被删文件在文件队列的开头 { if(user->brother==NULL)//该文件队列只有有一个文件
{
parent->child=NULL;
if(user->child!=NULL)//删除的是文件(夹)子树
{
deletechildtree(user);}else {
free(user);//删除的是文件(夹)结点
} printf(“删除成功!n”);return;} //文件队列有多个文件 p=user->brother;
} parent->child=p;p->parent=parent;if(user->child!=NULL){ deletechildtree(user);}else { free(user);} printf(“删除成功!n”);return;else//被删文件不在队列开头 {
if(user->brother==NULL)//被删文件在文件队列最末尾 { p->brother=NULL;if(user->child!=NULL){
deletechildtree(user);}else {
free(user);}
} printf(“删除成功!n”);return;
//被删文件在文件队列中间
p->brother=user->brother;
if(user->child!=NULL)
{
deletechildtree(user);
}
else
{
free(user);
} } printf(“删除成功!n”);}
FFile openfolder(FFile user)/*打开文件夹*/ {
} //int a,b;//a=0;/*if(user->child==NULL){ user->child=(Ffile*)malloc(sizeof(Ffile));user->child->type=0;user->child->brother=NULL;user->child->parent=user;user->child->child=NULL;
} /*for(b=1;b
a++;} if(a==20){ printf(“错误:打开列表溢出!”);return(user);} for(b=1;;b++){ if(openf[b].add==NULL)
break;}*/
user->open=1;//设置文件为打开 //strcpy(openf[b].name,user->name);//openf[b].add=user;printf(“文件夹打开成功。n”);return(user);//返回被打开的文件夹的地址
void openfile(FFile user)/*打开普通文件*/ { if(user->open==1){
printf(“错误:打开失败,此文件已经被打开!n”);
return;} user->open=1;printf(“普通文件打开成功!n”);}
FFile openff(FFile user)/*打开文件(夹)*/ {
char ch[20];FFile parent;
int a;printf(“选择要打开的文件名:n”);scanf(“%s”,ch);
parent=user;if(user->child==NULL){
printf(“错误:打开失败,该目录下没有可打开的文件(夹)!n”);return(parent);} user=user->child;for(a=1;;a++)//找出要打开文件的所在位置 { if(!strcmp(user->name,ch))
break;if(user->brother==NULL){
printf(“错误:打开失败,当前位置没有该文件!n”);
return(parent);}
user=user->brother;} if(user->type==1){
printf(“开始打开文件夹。。n”);user=openfolder(user);} else if(user->type==2){
printf(“开始打开普通文件。。n”);
openfile(user);
user=user->parent;} return(user);}
void closefile(FFile user)/*关闭普通文件*/ {
char ch[20];int a;printf(“选择要打开的文件名:n”);scanf(“%s”,ch);if(user->child==NULL){ printf(“错误:关闭失败,该目录下没有可关闭的文件!n”);return;} user=user->child;for(a=1;;a++)//找出要关闭文件的所在位置 { if(!strcmp(user->name,ch))
break;if(user->brother==NULL){
printf(“错误:关闭失败,当前位置没有该文件!n”);
return;}
user=user->brother;} if(user->open==0){
printf(“错误:关闭失败,该文件已经是关闭状态!n”);
return;} user->open=0;printf(“文件已经成功关闭!”);} /*没有文件夹关闭原因:
文件夹一打开就会跳向打开的新文件里 而文件夹关闭就会直接返回上一级的目录,若想整个文件夹都关闭,直接退出就可以了 因此不会直接关闭某个特定的文件*/
FFile backf(FFile user)/*返回上一层目录*/ { if(user->parent==NULL){
printf(“错误:返回失败,此处是最顶层目录!n”);
return(user);}
} user->open=0;user=user->parent;return(user);void readfile(FFile user)/*读文件*/ { char ch[20];int a;
printf(“选择要读取的文件名:n”);scanf(“%s”,ch);if(user->child==NULL){ printf(“错误:读取失败,该目录下没有可读取的文件!n”);return;} user=user->child;for(a=1;;a++)//找出要读取文件的所在位置 { if(!strcmp(user->name,ch))
break;if(user->brother==NULL){
printf(“错误:读取失败,当前位置没有该文件!n”);
return;}
user=user->brother;} if(user->open==0){ printf(“错误:文件读取失败,该文件处于关闭状态!n”);return;} else if(user->iffile.read==0){ printf(“错误:文件读取失败,该文件受保护,禁止读取!n”);return;} printf(“读操作,该文件中的内容:n”);if(!strcmp(user->iffile.ch,“NULL”)){ printf(“该文件内没有可读内容!n”);return;
} } printf(“%sn”,user->iffile.ch);printf(“文件读取成功!n”);void writefile(FFile user)/*写文件*/ { char ch[20];int a;
} printf(“选择要进行写操作的文件名:n”);scanf(“%s”,ch);if(user->child==NULL){ printf(“错误:写操作失败,该目录下没有可写的文件!n”);return;} user=user->child;for(a=1;;a++)//找出要读取文件的所在位置 { if(!strcmp(user->name,ch))
break;if(user->brother==NULL){
printf(“错误:写操作失败,当前位置没有该文件!n”);
return;}
user=user->brother;} if(user->open==0){ printf(“错误:文件写操作失败,该文件处于关闭状态!n”);return;} else if(user->iffile.write==0){ printf(“错误:文件写操作失败,该文件受保护,禁止写!n”);return;} printf(“写操作,输入内容:n”);scanf(“%s”,user->iffile.ch);user->iffile.length=strlen(user->iffile.ch);printf(“文件进行写操作成功!n”);
FFile copyfile(FFile user,FFile copyf)/*拷贝文件*/ { char ch[20];int a;printf(“选择要进行拷贝的文件(夹)名:n”);scanf(“%s”,ch);
if(user->child==NULL){
printf(“错误:拷贝失败,该目录下没有可拷贝的文件!n”);
return(NULL);} user=user->child;for(a=1;;a++)//找出要拷贝文件的所在位置,用user替代
{
if(!strcmp(user->name,ch))
break;
if(user->brother==NULL)
{
printf(“错误:拷贝失败,当前位置没有该文件!n”);
return(NULL);
}
user=user->brother;} copyf=user;
} printf(“拷贝成功!n”);return(copyf);FFile fenpei(FFile copyf,FFile user,FFile parent)/*粘贴时,给已拷贝项分配内存空间,以及给对应信息赋值*/ { user=(Ffile*)malloc(sizeof(Ffile));
//parent对child的连接,以及brother之间的连接已经完成if(copyf->brother==NULL && copyf->child==NULL){
user->parent=parent;
user->child=NULL;
user->brother=NULL;}
else{ if(copyf->brother!=NULL){
user->brother=fenpei(copyf->brother,user->brother,parent);//brother连接,兄弟节点有同一个父结点
user->brother->parent=user->parent;} else { user->brother=NULL;} if(copyf->child!=NULL){ //parent=p;user->child=fenpei(copyf->child,user->child,user);
user->child->parent=user;//完成child对parent的连接
//child连接,自己孩子的父结点就是自己
} else {
user->child=NULL;
user->child->parent=user;} }
//设置结点对应的信息
strcpy(user->name,copyf->name);user->open=copyf->open;user->type=copyf->type;if(user->type==2){
user->iffile.length=copyf->iffile.length;
user->iffile.read=copyf->iffile.read;
//user->iffile.type=copyf->iffile.type;
user->iffile.write=copyf->iffile.write;
strcpy(user->iffile.ch,copyf->iffile.ch);}
return(user);}
void prastefile(FFile user,FFile copyf)/*粘贴文件*/ //user是要粘贴的地方,copyf是要粘贴的内容,//有相同文件名的会判断会不会覆盖,或者是重命名 //在原树中进行新建操作 { int i,j;char ch[20];FFile p,user0,parent;parent=user;//记录父结点
user=user->child;
p=user;//记录当前结点的前一个brother结点 strcpy(ch,“NULL”);if(copyf==NULL)//判断有没有拷贝文件 {
printf(“错误:粘贴失败,还没有拷贝任何文件(夹)!n”);
return;}
//p=(Ffile*)malloc(sizeof(Ffile));//p->child=(Ffile*)malloc(sizeof(Ffile));//先给粘贴项分配内存空间
//p->child=fenpei(copyf,p->child,p);
if(user==NULL)//当前位置没有任何文件结点
{
} user=fenpei(copyf,user,parent);//是他自己要分配,不是孩子结点!!parent->child=user;user->brother=NULL;user->parent=parent;return;//该位置没有任何文件 for(j=1;;j++){ if(user->type==0)//开端的空结点,用新结点覆盖,即:当前位置没有文件结点
{
user=user->parent;
deletechildtree(p);
user=fenpei(copyf,user->child,user);//返还增加的结点
user->brother=NULL;
user->parent=parent;
parent->child=user;
} return;if(!strcmp(user->name,copyf->name)){
printf(“提示:该文件名已经存在!n”);
printf(“请重命名文件:n”);
printf(“输入新文件名:n”);
scanf(“%s”,ch);
} if(user->brother==NULL)//普通的退出条件
{
break;} p=user;user=user->brother;} user->brother=fenpei(copyf,user->brother,user->parent);user->brother->parent=user->parent;//若要更名,粘贴分配完内存空间返回时再改变
if(strcmp(ch,“NULL”))
strcpy(user->brother->name,ch);printf(“粘贴成功。n”);}
void showroute(FFile user)/*显示当前路径*/ { if(user->parent!=NULL){
showroute(user->parent);} printf(“%s/”,user->name);//路径中每个结点的输出项 }
void change(FFile user){ char ch[20];int a,b;
if(user->child==NULL)
{
} printf(“错误:属性修改失败,该目录下没有可修改的文件!n”);return;printf(“选择要进行属性修改的文件(夹)名:n”);scanf(“%s”,ch);user=user->child;for(a=1;;a++)//找出要拷贝文件的所在位置,用user替代 { if(!strcmp(user->name,ch))
break;if(user->brother==NULL){
printf(“错误:属性修改失败,当前位置没有该文件!n”);
return;}
user=user->brother;} if(user->type==1){ printf(“错误:文件夹不能进行属性修改!n”);return;} for(;;){
printf(“1.修改读权限;n”);printf(“2.修改写权限;n”);printf(“3.返回;n”);printf(“选择操作:n”);scanf(“%d”,&a);if(a==1){ printf(“0.禁止;
1.允许;n”);printf(“请选择:n”);scanf(“%d”,&b);user->iffile.read=b;printf(“修改成功!n”);} else if(a==2){ printf(“0.禁止;
1.允许;n”);printf(“请选择:n”);scanf(“%d”,&b);user->iffile.write=b;
}
} printf(“修改成功!n”);} else if(a==3){ return;} else { } printf(“错误:没有该操作!n”);void main()/*主函数*/ {
FFile d,e,f;//f记录当前显示界面父结点位置 int a,b,c;char ch[20];a=0;printf(“******************************目录******************************n”);printf(“
1.选择用户n”);printf(“
2.退出n”);
printf(“****************************************************************n”);for(;;){
printf(“选择操作:n”);scanf(“%d”,&a);if(a==1){ printf(“选择用户:n”);printf(“1.user1;n2.user2;n”);scanf(“%d”,&b);break;} else if(a==2){ printf(“欢迎使用。n”);exit(0);//系统退出的操作码 } else { printf(“错误:没有该操作!n”);
} } //初始化打开列表 //initopen();//初始化各个用户的信息
//copyf=(Ffile*)malloc(sizeof(Ffile));//copyf=NULL;copyf=NULL;user1=init();strcpy(user1->name,“user1”);user2=init();strcpy(user2->name,“user2”);d=init();e=init();user1->child=d;user2->child=e;d->parent=user1;e->parent=user2;printf(“%d”,user1->child->type);if(b==1){ printf(“已经进入user1系统n”);f=user1;show(user1);}else{
} printf(“已经进入user2系统n”);f=user2;show(user2);
for(;;){ printf(“****************************************************************n”);printf(“1.创建文件(夹)
5.读文件
9.显示当前路径
n”);printf(“2.删除文件(夹)
6.写文件
10.返回上一层目录
n”);printf(“3.打开文件(夹)
7.拷贝文件
11.改变普通文件属性n”);printf(“4.关闭普通文件
8.粘贴文件
12.退出n”);printf(“****************************************************************n”);printf(“选择操作:n”);scanf(“%d”,&c);if(c==12){
break;}else if(c==1){ creatf(f);} else if(c==2){
printf(“选择要删除的文件(夹)的名字:n”);scanf(“%s”,ch);deletefile(f,ch);} else if(c==3){ f=openff(f);} else if(c==4){ closefile(f);} else if(c==5){ readfile(f);} else if(c==6){ writefile(f);} else if(c==7){ copyf=copyfile(f,copyf);} else if(c==8){ prastefile(f,copyf);copyf=NULL;} else if(c==9){ printf(“路径为:n”);showroute(f);printf(“n”);} else if(c==10){
}
f=backf(f);
} else if(c==11){ change(f);} else { continue;} show(f);} printf(“欢迎使用!n”);