170 likes | 304 Views
模拟文件管理系统. 操作系统课程设计汇报二 计科 31 第二组. 流程图. 开始. 初始化 读取用户目录. 菜单选择. 创建文件. 删除文件. 退出. 创建目录. 显示目录. 改变目录. 保存用户目录. 结束. 主要数据结构. 文件控制块 typedef struct FCB { string name; // 文件名 int type; // 标致: 0 表示目录, 1 表示文件 int size; // 如果是文件则表示文件大小 struct FCB *firstchild; // 指向第一个孩子结点
E N D
模拟文件管理系统 操作系统课程设计汇报二 计科31第二组
流程图 开始 初始化 读取用户目录 菜单选择 创建文件 删除文件 退出 创建目录 显示目录 改变目录 保存用户目录 结束
主要数据结构 • 文件控制块 • typedef struct FCB { • string name; //文件名 • int type; //标致:0表示目录,1表示文件 • int size; //如果是文件则表示文件大小 • struct FCB *firstchild; //指向第一个孩子结点 • struct FCB *nextsibling; //指向下一个兄弟结点 • struct FCB *parent; //指向父结点 • }FCB, *FCBnode;
用户当前数据结构 • typedef struct USER { • string username; //用户名 • FCBnode workdir; //当前工作目录或文件指针 • string path; //当前路径 • }USER, *USERnode;
主要算法 • 邢自成:创建文件、删除文件 • 叶林:显示目录、改变目录 • 张鹰:创建目录
保存读取目录树 • //-----------将目录树保存到文件------------ • void SaveTree(FCBnode root,FILE *fp) { • if (root) { • fwrite(root,sizeof(struct FCB),1,fp); • SaveTree(root->firstchild,fp); • SaveTree(root->nextsibling,fp); • } • } • void Save(FCB *root) { • FILE *fp; • if((fp=fopen("user","wb+"))==NULL) { • cout<<"Cannot open file"; • } • SaveTree(root,fp); • fclose(fp); • }
//------------将目录树从文件中读出来--------------//------------将目录树从文件中读出来-------------- • void LoadTree(FCBnode p,FILE *fp) { • FCB q; • if (p->firstchild) { • fread(&q,sizeof(struct FCB),1,fp); • p->firstchild=&q; • LoadTree(&q,fp); • } • if (p->nextsibling) { • fread(&q,sizeof(struct FCB),1,fp); • p->nextsibling=&q; • LoadTree(&q,fp); • } • } • void Load() { • FILE *fp; • FCB p; • if((fp=fopen("user","rb+"))==NULL) { • cout<<"Cannot open file"; • } • fread(&p,sizeof(struct FCB),1,fp); //读用户根目录 • show(&p); • LoadTree(root,fp); • fclose(fp); • }
主要完成部分: 创建文件算法 create(string name){} 删除文件算法 deletefile(string name) {}
create(string name)是创建文件函数,在DOS界面下输入create “文件名”,如果当前目录树的第一个孩子节点为空,就把“文件名”赋给这个孩子节点,输出“文件创建成功”提示信息。如果孩子节点的名字和要创建的文件名相同,就输出“文件已经存在!创建失败!”如果这个孩子节点不空且与要创建的名字不同,就检查下一个节点,如果为空,则创建成功。
deletefile(string name)是删除文件函数,在DOS界面下输入deletefile “文件名”,如果当前目录孩子节点为空,说明该目录下没有文件,则输出“无此文件!”。如果找到匹配的文件,则执行删除。
创建目录 • 创建目录的流程如下: • 先创建一个FCB,并且将文件连接到目录树上 • 指针指向目录树的第一个孩子结点 • 当目录命不存在时,创建成功 • 当创建失败后指针指向兄弟结点 • 当目录命不存在时,创建成功
流程图 建立一个FCB 连接到目录树 指向 当目录名存在时 第一个孩子结点 目录命存在时 指向兄弟结点 目录名不存在时 建立目录 结束
开始 列出文件目录 指向第一个孩子结点 判断结点指针是否为空 否 判断结点类型 是 P=0 P=1 显示当前目录下的目录名 指向下一个兄弟结点 显示文件名 结束
cd(string name) 改变当前目录的函数,当前目录的第一个结点是否与需要改变目录的名字“name”相同,如果结点为空,则输出“目录不存在!”,跳出;如果结点的名字与需要改变的名字相同,则进入\ “name”这个目录下面,则输出“目录已经改变!”;如果不同,则指针指向当前目录的下一结点,然后判断是否需要改变目录的名字“name”相同,重复以上步骤。
进展情况 • 完成DOS下的程序。如图: