【精选】操作系统课程设计(文件系统管理)文件

合集下载

操作系统课程设计-文件系统目录管理

操作系统课程设计-文件系统目录管理

操作系统课程设计-文件系统目录管理目录第一章课程设计目的和要求 (1)1 课程设计目的 (1)2 课程设计要求 (1)2.1 课程设计思想原理 (1)2.2 课程题目 (1)2.3 提交课程设计报告 (2)第二章课程设计内容 (3)1 文件管理系统结构 (3)2 文件系统采用索引文件结构 (3)2.1 磁盘模拟 (3)2.2文件的逻辑结构 (3)2.3目录结构 (3)2.4用户接口 (5)第三章详细设计 (7)1 程序功能模块图 (7)2 实体关系图 (7)3 数据流图 (8)4 数据结构设计 (8)5 程序流程图 (11)5.1 建立文件目录(mkdir)程序流程图 (11)5.2 删除文件目录(rmdir)程序流程图 (12)第四章程序运行与测试 (13)1 程序运行主界面 (13)2 用mkdir [dirname] 命令创建子目录 (13)3用ls命令显示当前目录下信息 (13)4 用rmdir [dirname] 命令删除子目录 (14)5 用cd [dirname] 命令改名当前目录 (14)第五章课程设计总结 (16)附录Ⅰ参考文献 (17)附录Ⅱ程序清单 (18)第一章课程设计目的和要求1 课程设计目的操作系统课程主要讲述的内容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。

本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统开发的基本技能。

通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。

同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。

2 课程设计要求2.1 课程设计思想原理阅读操作系统方面的书籍,了解操作系统的文件系统原理。

结合分析课程设计要求,确定实体以及它们之间的关系。

操作系统课程设计-文件管理

操作系统课程设计-文件管理

目 录一、基本想 .............................................. - 0 -1.1编写目的 ................................................. - 1 -1.2简单描述 ................................................. - 1 -二、公共变量及数据结构 .................................. - 1 -2.1公共变量 ................................................. - 1 -2.2数据结构 ................................................. - 1 -三、主要函数的过程描述 .................................. - 2 -3.1 路径显示 ................................................. - 2 -3.2右键快捷菜单操作 ......................................... - 3 -3.3命令窗口 ................................................. - 3 -3.4创建文本文档 ............................................. - 4 -3.5创建可执行文件 ........................................... - 4 -3.5.1指令选择 ............................................... - 4 -3.5.2已选指令删除 ........................................... - 5 -3.5.3创建可执行文件 ......................................... - 5 - 四、运行截图 ............................................ - 6 -4.1主界面 ................................................... - 6 - 4.2树形结构及右键快捷菜单 ................................... - 6 - 4.3创建文本文档 ............................................. - 7 - 4.4创建可执行文件 ........................................... - 8 - 五、使用说明 ............................................ - 8 -5.1功能说明 ................................................. - 8 -5.2操作说明 ................................................. - 8 -5.2.1快捷菜单及命令窗口 ..................................... - 8 -5.2.2创建文本文档 ........................................... - 9 -5.2.3创建可执行文件 ......................................... - 9 -5.2.4删除文件 ............................................... - 9 -六、总结 ................................................ - 9 -一、基本思想装订线1.1编写目的通过课程设计,加深对操作系统各资源管理模块的理解,掌握操作系统的基本原理及功能,具有初步分析实际操作系统,设计、构造和开发现代操作系统的基本能力。

j操作系统文件课程设计

j操作系统文件课程设计

j操作系统文件课程设计一、课程目标知识目标:1. 理解操作系统的基本概念,掌握文件系统的组成和功能。

2. 学会使用操作系统提供的文件管理命令,对文件进行基本操作。

3. 掌握文件权限和文件属性的相关知识,了解文件安全性。

技能目标:1. 能够独立使用命令行对文件进行创建、删除、复制和移动等操作。

2. 学会运用文件权限设置,保障文件安全。

3. 能够对文件系统进行简单的问题排查和故障处理。

情感态度价值观目标:1. 培养学生的团队协作精神,学会在小组讨论中分享和倾听。

2. 增强学生的信息安全和隐私保护意识,养成良好的文件管理习惯。

3. 激发学生对计算机操作系统的兴趣,提高学习积极性。

分析课程性质、学生特点和教学要求,本课程目标旨在使学生在掌握操作系统文件管理知识的基础上,提高实际操作能力和问题解决能力。

通过课程学习,让学生能够更好地应对日常生活中的文件管理需求,同时培养良好的信息素养和团队协作精神。

后续教学设计和评估将围绕这些具体的学习成果展开。

二、教学内容1. 操作系统基本概念:介绍操作系统的定义、功能和分类,以课本第二章第一节为基础,让学生了解操作系统的基本知识。

2. 文件系统组成与功能:讲解文件系统的层次结构、存储设备和文件存储格式,对应课本第二章第二节内容。

3. 文件管理命令:教授常用的文件管理命令,如创建、删除、复制、移动、查看文件等,以课本第三章为基础,分课时逐一讲解。

4. 文件权限与属性:介绍文件权限的设置、修改和查看,以及文件属性的概念,结合课本第四章内容进行教学。

5. 文件安全与隐私保护:讲解文件权限在实际应用中的作用,如何保护文件安全,防止数据泄露,以课本第四章第三节为参考。

6. 文件系统问题排查与故障处理:教授如何识别和解决文件系统常见问题,如文件丢失、磁盘空间不足等,对应课本第五章内容。

教学内容安排和进度:第一课时:操作系统基本概念第二课时:文件系统组成与功能第三课时:文件管理命令(一)第四课时:文件管理命令(二)第五课时:文件权限与属性第六课时:文件安全与隐私保护第七课时:文件系统问题排查与故障处理教学内容确保科学性和系统性,以课本为基础,结合实际教学需求进行组织,旨在帮助学生扎实掌握操作系统文件管理的相关知识。

操作系统课程设计---文件管理

操作系统课程设计---文件管理
else {p=p3->headlink; i=1;
printf("| num | name | sex |\n");
printf("---------------------------------------\n");
struct linkr *headlink;
struct linkt *next;
};
struct linkf mfd[5];
struct links *ufd,*p2,*q2;
struct linkr *p,*q;
struct linkt *afd,*p3,*q3;
if(afd==NULL) afd=p3; else q3->next=p3;
strcpy(p3->filename,X);
p3->length=p2->length;
p3->headlink=p2->headlink;
q2=q2->next;
if(strcmp(q2->filename,X)==0)
{printf("File has already been created!\n");
return;
}
}
p2=(struct links *)malloc(sizeof(struct links));
scanf("%s",X);
p3=afd;
if(p3!=NULL)
{ while((strcmp(p3->filename,X)!=0)&&(p3->next!=NULL))
{ q3=p3;

操作系统课程设计-文件系统

操作系统课程设计-文件系统

操作系统课程设计-文件系统一、引言文件系统是操作系统中的重要组成部分,负责对计算机中的文件进行管理和组织。

在操作系统课程设计中,文件系统的设计和实现是一个重要的任务。

本文将介绍文件系统的设计原则、功能和实现过程。

二、设计原则1. 可靠性文件系统需要确保数据的可靠性,能够有效地进行错误检测和纠正。

它应该能够处理文件的损坏、删除或丢失等情况,并能够进行数据恢复。

2. 效率文件系统需要具备高效的存取和查找功能,能够在较短的时间内完成对文件的操作。

它应该对文件进行良好的组织和管理,以提高文件的读写速度。

3. 安全性文件系统要能够保护文件的机密性和完整性,确保只有授权用户才能访问文件,并防止数据被恶意篡改或破坏。

4. 可扩展性文件系统应该能够适应不同容量和规模的存储设备,并能够随着存储需求的增长而进行扩展。

三、功能1. 存储管理文件系统需要对存储设备进行管理,包括磁盘空间的分配、回收和整理等操作,确保文件能够高效地存储和读取。

2. 目录管理文件系统需要提供目录管理功能,能够对文件进行组织和分类。

用户可以根据目录结构查找和管理文件,方便文件的查找和访问。

3. 文件操作文件系统需要支持各种文件操作,包括创建、删除、打开、关闭、读取和写入等操作。

它应该提供一组接口供用户和应用程序使用。

4. 错误处理文件系统需要对各种错误情况进行处理,包括磁盘故障、读写错误和用户操作错误等。

它应该能够识别和纠正错误,并提供相应的错误提示和恢复机制。

四、实现过程1. 文件分配文件系统需要确定如何将磁盘空间分配给文件,以实现高效的存储和检索。

常见的文件分配方式包括连续分配、链式分配和索引分配等。

2. 目录结构文件系统需要设计合适的目录结构,以方便用户查找和管理文件。

常见的目录结构包括树状目录结构、索引节点和哈希表等。

3. 文件读写文件系统需要实现高效的文件读写功能,包括将文件从磁盘读入内存和将文件从内存写入磁盘。

它应该提供缓存机制来加速读写操作。

文件管理系统课程设计

文件管理系统课程设计

课程名称:操作系统实验题目:文件管理系统1、课程设计选题 (3)1.1主要设计内容 31.2主要设计思路 32、课程设计需求分析 33、概要设计 (4)3.1整体设计框架 43.2各模块的基本功能 44、系统实现 5 4.1原理 6 4.2各模块算法思想 6 4.3流程图描述 94.4代码描述 105、系统测试 115.1系统主界面 115.2子系统功能测试 116、总结 197、参考文献样式 191、课程设计选题1.1主要设计内容本课程设计主要是用C语言编写,设计的是一个模拟的多用户多级目录的文件管理系统。

通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。

1.2主要设计思路首先系统要完成初始化的任务,建立起整个系统,等待用户注册,注册成功后,用户登录模块,对用户的用户名进行验证,如果用户登录成功,则系统进入等待用户输入的状态,用户选择相应指令后,系统按照即定方式处理用户请求,用户退出后,系统转入登录模块,等待下一位用户的登录。

2、课程设计需求分析本系统为多用户多级目录的文件管理系统,用户可以根据所注册的用户名登陆来对文件或是文件进行操作。

多用户功能可以满足不同用户不同的需求,同时也起到了很好的保密作用。

文件系统为用户提供了按名存取的功能,以使得用户能透明地存储访问文件。

为了实现按名存取,文件需要对文件存储设备进行合理的组织,分配;对存储在文件存储设备上的文件进行保护,保密和提供共享的手段。

另外,文件系统还要提供检索文件或文件中记录的手段,文件系统就是完成上述功能的一组软件和数据结构的集合。

模拟一个文件管理系统,要完成对文件的基本操作,文件的基本操作有文件、文件夹的打开、新建、删除和读取写入文件,创建更改目录,列出目录内容等信息。

系统建立了文件目录树,存储文件系统中的所有文件。

对于用户名下的文件,用文件目录树的分枝来存贮。

采用命令行操作界面很直观,也方便用户进行操作,用户只要按照操作界面所显示的命令来操作就行了。

操作系统课程设计文件管理系统

操作系统课程设计文件管理系统

操作系统课程设计文件管理系统1. 引言文件管理是操作系统中的一个重要模块,负责对计算机中的文件进行管理和组织。

在操作系统课程设计中,设计一个文件管理系统是一个很有挑战性的任务,需要考虑到文件的创建、打开、读取、写入、删除等功能,并且要确保文件的安全性和可靠性。

本文将详细介绍文件管理系统的设计与实现。

2. 需求分析为了满足用户对文件管理的需要,我们需要对文件管理系统的需求进行分析。

在这个文件管理系统中,用户应该能够执行以下操作:•文件的创建和命名•文件的打开和关闭•文件的读取和写入•文件的删除和修改•文件的搜索和查找除此之外,还要考虑到对文件权限的管理,可以设置不同用户对文件的不同访问权限,以保障文件的安全性。

3. 概要设计概要设计是对文件管理系统的整体架构和功能进行规划和设计。

文件管理系统可以采用层次结构的设计方式,分为用户界面、文件管理模块和存储管理模块。

3.1 用户界面用户界面是用户与文件管理系统进行交互的接口,可以通过命令行或者图形界面来实现。

在用户界面中,用户可以输入相关指令来执行对文件的操作,如创建文件、打开文件、读取文件等。

3.2 文件管理模块文件管理模块是文件管理系统的核心模块,负责对文件进行创建、打开、读取、写入、删除等操作。

在文件管理模块中,需要维护一个文件目录表来记录文件的基本信息,如文件名、文件大小、文件权限等。

还需要考虑到文件的分配和回收,可以使用位示图等方式进行实现。

3.3 存储管理模块存储管理模块负责对文件进行存储和管理,包括磁盘空间的分配和回收。

在存储管理模块中,可以采用文件分配表或者索引节点进行存储方式的选择。

4. 详细设计在详细设计阶段,需要对概要设计中的每个模块进行详细设计,并确定各个模块之间的接口和数据结构。

4.1 用户界面设计用户界面设计可以采用命令行方式进行实现。

用户可以通过命令输入来执行相应的文件管理操作。

可以设计一系列命令,如create用于创建文件,open用于打开文件,read用于读取文件等。

操作系统课程设计-文件系统目录管理

操作系统课程设计-文件系统目录管理

文件管理系统——目录文件管理的设计目录第一章课程设计目的和要求 (1)1 课程设计目的 (1)2 课程设计要求 (1)2.1 课程设计思想原理 (1)2.2 课程题目 (1)2.3 提交课程设计报告 (2)第二章课程设计内容 (3)1 文件管理系统结构 (3)2 文件系统采用索引文件结构 (3)2.1 磁盘模拟 (3)2.2文件的逻辑结构 (3)2.3目录结构 (3)2.4用户接口 (5)第三章详细设计 (7)1 程序功能模块图 (7)2 实体关系图 (7)3 数据流图 (8)4 数据结构设计 (8)5 程序流程图 (11)5.1 建立文件目录(mkdir)程序流程图 (11)5.2 删除文件目录(rmdir)程序流程图 (12)第四章程序运行与测试 (13)1 程序运行主界面 (13)2 用mkdir [dirname] 命令创建子目录 (13)3用ls命令显示当前目录下信息 (13)4 用rmdir [dirname] 命令删除子目录 (14)5 用cd [dirname] 命令改名当前目录 (14)第五章课程设计总结 (16)附录Ⅰ参考文献 (17)附录Ⅱ程序清单 (18)第一章课程设计目的和要求1 课程设计目的操作系统课程主要讲述的内容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。

本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统开发的基本技能。

通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。

同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。

2 课程设计要求2.1 课程设计思想原理阅读操作系统方面的书籍,了解操作系统的文件系统原理。

结合分析课程设计要求,确定实体以及它们之间的关系。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

评定等级操作系统课程设计文件系统管理学院计算机学院专业计算机科学与技术班级姓名学号2013年1月8日广东工业大学计算机学院制文件系统管理一、实验目的模拟文件系统的实现的基本功能,了解文件系统的基本结构和文件系统的管理方法看,加深了解文件系统的内部功能的实现。

通过高级语言编写和实现一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作系统命令的实质内容和执行过程有比较深入的了解。

二、实验内容和要求编程模拟一个简单的文件系统,实现文件系统的管理和控制功能。

在用户程序中通过使用文件系统提供的create,open,read,write,close,delete 等文件命令,对文件进行操作。

以下报告主要包括:1.可行性分析2.需求分析3.概要设计4.详细设计5.测试6.总结三、可行性分析1、技术可行性对于图形编程还不了解,但是经过本学期的三次实验的练习,可以设计好命令操作界面。

利用大二期间学习的数据结构可以模拟出此课程设计的要求。

2、经济可行性课程设计作为本课程的练习及进一步加深理解。

与经济无关,可以不考虑。

(零花费,零收益)3.法律可行性自己编写的程序,仅为练习,不作其他用途,与外界没什么联系,可行。

四、需求分析编写程序实现文件系统,主要有以下几点要求:1、实现无穷级目录管理及文件管理基本操作2、实现共享“别名”3、加快了文件检索五、概要设计为了克服单级目录所存在的缺点,可以为每一位用户建立一个单独的用户文件目录UFD (User File Directory )。

这些文件目录可以具有相似的结构,它由用户所有文件的文件控制块组成。

此外,在系统中再建立一个主文件目录MFD (Master File Directory );在主文件目录中,每个用户目录文件都占有一个目录项,其目录项中包括用户名和指向该用户目录的指针。

本设计主要实现下面几个数据结构:M D F U F D A F D 用户名文件名打开文件名文件目录指针保护码打开保护码用户名文件长度读写指针文件目录指针文件名···总体的流程图如下:六、详细设计主要数据结构:1.MFD (Master File Directory ),主要用以存放用户,可以增加存放密码的字符数组,本设计没有保密安全方面的忧虑,为了使用时操作更简单省去密码。

所以,MFD 结构仅包括用户名和指向子目录的一个指针,以及指向下一用户的连接点,为线性结构。

struct MFD{char name[20]; //用户名UFD *bst_pointer; //文件目录指针MFD *link;};2. UFD (User File Directory ),用于存放文件的数据结构。

由于本设计为了加快检索速度,使用了二叉排序树的结构,所以UFD 结构中相应加入了用于树结构的parent,leftchild ,和rightchild 记录链接情况。

当本文件为普通文件时,为下级记录申请AFD (file ),folder 为空。

同样,当本文件为文件夹时,为它申请相应的空间,AFD 为空。

以此来达到无穷级别目录的存储。

struct UFD{UFD *parent;UFD *leftchild;UFD *rightchild;UFD *folder; //作为文件夹时指向下一层,文件时为空UFD *pre_folder; //指向上一层目录(文件夹时用到)AFD *file; //作文文件时文件的具体内容char name[30]; //文件(夹)名字int length; //作为文件时文件的长度,默认为0char rw; //读写标志r or wchar share; //共享标志y or nchar file_folder; //指示此文件是文件或文件夹, f 为文件,o 为文件夹};3.AFD ,存放文件的内容的结构,比较简单,文件内容用一个字符数组存储,为顺序结构,最多可存放99 个字符struct AFD{char afd_file[100];int read; //读指针int write; //写指针};4.RECstruct REC //UFD 的线性链,用于记录共享文件和已打开文件{UFD *file;REC *link;};关键函数说明:void Log_in(); //登陆void Init_user(); //创建用户void Check_user(); //查看用户以上三个函数为开始时管理用户创建和登陆的函数。

开始时没有用户,需要创建后才可登陆。

创建用户即自动分配一个存放用户文件的UFD ,此时的UFD 为空,需要后续的创建文件以及文件夹的分配。

UFD *operations(UFD *fileBST); //文件夹的操作调用用户登陆后即开始对该用户文件UFD 的操作,同时,若在文件夹中创建一个文件夹,它同样可以分配得到一个UFD ,对用户文件的操作可以重复调用,以此来达到无穷级目录的操作。

在里层文件的操作和外层的是一样的,但若要退回外层文件夹就需要逐层返回,不能立即跳到某一层某地址。

操作完毕后返回改变后的文件存储状态。

void fcreate(UFD *fileBST); //对文件夹的六个基本操作UFD *fdelete(UFD *fileBST);void fopen(UFD *fileBST);void fclose(UFD *fileBST);void fread_write(UFD *fileBST,char f); //读写操作。

按选择f=5 为读6 为写以上五个函数为对文件的六个基本操作,其中读文件和写文件部分代码相同,所以由一个函数完成。

在create五个函数中,分别对文件夹fileBST 做了相应的处理,由于删除文件的函数可能会删除到头结点,所以需要一个返回值。

void insertBST(UFD *fileBST,UFD *newBST); //在fileBST 中插入新的结点newBSTUFD *searchBST(UFD *fileBST,char name); //在fileBST 树中查找名字为name 的结//点并返回该结点,文件不存在则返回空void BSTtraverse(UFD *fileBST); //遍历二叉树UFD *deleteBST(UFD *fileBST,char name[30]); //删除name 结点,返回删除后的结点由于该设计的存储结构用到了二叉排序树,所以把相关的操作写成函数,供基本操作的函数调用。

insert 函数在fileBST 中插入新的结点newBST;search 函数在fileBST 树中查找名字为name 的结点并返回该结点,文件不存在则返回空;还有traverse 和delete 函数对二叉排序树做了基本的操作。

void print_path(UFD *fileBST); //输出当前路径void print_open_file(); //输出已打开的文件为了在文件系统中使用户看出路径及一些相关的状态,设置了输出文件路径的函数,路径由每个文件的结构体中pre_folder 记录上一层的文件夹名字,这样逐层输出即可达到目的。

每执行一次操作就输出一次已打开的文件的具体情况,打开的文件应及时关闭,否则删除时会有删除失败提示。

UFD *check_share(char name[30]); //在共享链中检查是否有name 文件,有则//返回该UFD ,没则NULLvoid del_in_share(UFD *node); //在共享链中删除node 结点以上两个函数为对共享文件的处理函数,当打开或读写文件时在本层文件中未找到相应的文件时,就用check_share 函数在共享文件中查找,如果存在就返回该文件的UFD,不存在就返回NULL ,而del_in_share 函数是伴随着删除文件的函数出现的,目的是为了删除文件以后不会在共享链中再存在。

具体代码如下:filesysterm.hstruct AFD{char afd_file[100];int read; //读指针int write; //写指针};struct UFD{UFD *parent;UFD *leftchild;UFD *rightchild;UFD *folder; //作为文件夹时指向下一层,文件时为空UFD *pre_folder; //指向上一层目录(文件夹时用到)AFD *file; //作文文件时文件的具体内容char name[30]; //文件(夹)名字int length; //作为文件时文件的长度,默认为0char rw; //读写标志r or wchar share; //共享标志y or nchar file_folder; //指示此文件是文件或文件夹, f 为文件,o 为文件夹};struct MFD{char name[20]; //用户名UFD *bst_pointer; //文件目录指针MFD *link;};struct REC //UFD 的线性链,用于记录共享文件和已打开文件{UFD *file;REC *link;};void Log_in(); //登陆void Init_user(); //创建用户void Check_user(); //查看用户UFD *operations(UFD *fileBST); //文件夹的操作调用,user 不为空时为第一层void fcreate(UFD *fileBST); //对文件夹的六个基本操作UFD *fdelete(UFD *fileBST);void fopen(UFD *fileBST);void fclose(UFD *fileBST);void fread_write(UFD *fileBST,char f); //代码有重复,合并读写操作。

按选择s=5 为读6 为写void insertBST(UFD *fileBST,UFD *newBST); //新文件插入到user 文件树中UFD *searchBST(UFD *fileBST,char name); //在fileBST 树中查找名字为name 的结点并返回该结点//文件不存在则返回空void BSTtraverse(UFD *fileBST); //遍历二叉树UFD *deleteBST(UFD *fileBST,char name[30]); //删除成功返回1,失败返回0void print_path(UFD *fileBST); //输出当前路径void print_open_file(); //输出已打开的文件UFD *check_share(char name[30]); //在共享链中检查是否有name 文件,有则返回UFD ,没则NULLvoid del_in_share(UFD *node); //在共享链中删除node 结点main.cpp#include <iostream>#include<conio.h>#include"filesystem.h"MFD *mfd_link=NULL; //用户链表MFD *pre_user; //当前操作用户UFD *pre_opera_folder=NULL; //当前操作文件夹int folder_depth=0; //记录当前文件深度(用于辅助pre_folder 的初始化)REC *share_file=NULL;REC *open_file=NULL;void print_path(UFD *fileBST) //输出路径{if(fileBST->pre_folder!=NULL){ print_path(fileBST->pre_folder);printf("/%s",fileBST->pre_folder->name);}elseprintf("/%s",pre_user->name);}void print_open_file(){REC *temp;int i=5;temp=open_file;while(temp!=NULL){printf("%s\t%d\t\t",temp->file->name,temp->file->length);if(temp->file->rw=='r')printf(" 只读\t");else printf(" 可读写\t");if(temp->file->share=='y')printf(" 是\t");else printf(" 否\t");for(i=0;i<5;i++){if(temp->file->file->afd_file[i]!='\0')printf("%c",temp->file->file->afd_file[i]);else break;}if(temp->file->file->afd_file[i]!='\0'&&i==5) printf("..");printf("\n");temp=temp->link;}}void BSTtraverse(UFD *fileBST) //遍历二叉树(前序遍历){UFD *left,*right;printf("%s",fileBST->name);if(fileBST->file_folder=='o') //输出..以区分文件夹printf("..\t");elseprintf("\t");if(fileBST->leftchild!=NULL) //递归{left=fileBST->leftchild;BSTtraverse(left);}if(fileBST->rightchild!=NULL){right=fileBST->rightchild;BSTtraverse(right);}}UFD *searchBST(UFD *fileBST,char name[30])// 在fileBST 树中查找名字为name 的结点并返回该结点{ //文件不存在则返回空int flag;flag=strcmp(fileBST->name,name);if(flag==0)return fileBST; //查找成功else if(flag>0){if(fileBST->leftchild==NULL) return NULL; //查找失败elsesearchBST(fileBST->leftchild,name); //递归调用}else{if(fileBST->rightchild==NULL) return NULL;elsesearchBST(fileBST->rightchild,name);}}void insertBST(UFD *fileBST,UFD *newBST) // 将结点newBST 插入原二叉树fileBST 中{int flag;flag=strcmp(fileBST->name,newBST->name);if(flag>0){if(fileBST->leftchild==NULL) //插入{fileBST->leftchild=newBST;newBST->parent=fileBST;}elseinsertBST(fileBST->leftchild,newBST); //递归调用}else{if(fileBST->rightchild==NULL) //插入{fileBST->rightchild=newBST;newBST->parent=fileBST;}elseinsertBST(fileBST->rightchild,newBST); //递归调用}/*flag=0 的情况已在创建时排除*/}UFD *deleteBST(UFD *fileBST,char name[30])// 删除名字问name 的文件结点{UFD *parent_file=NULL,*del_file=NULL;UFD *move_file=NULL,*move_file_parent;del_file=searchBST(fileBST,name);if(del_file==NULL){printf(" 没有此文件,删除失败!\n");getch();return fileBST; //查找失败}if(del_file->file_folder=='o'&&strcmp(del_file->folder->name,"NULL")!=0){ printf(" 注意,本系统未能实现级联删除,请先逐个删除文件!");printf(" 文件夹非空,删除失败!\n");getch();return fileBST;}if(del_file->share=='y') //先在共享链中删除del_in_share(del_file);parent_file=del_file->parent;if(del_file->leftchild==NULL&&del_file->rightchild==NULL) // 被删除结点为子叶结点{if(del_file==fileBST) //只有一个结点{strcpy(fileBST->name,"NULL");}else if(parent_file->leftchild==del_file){parent_file->leftchild=NULL;free(del_file);}else{parent_file->rightchild=NULL;free(del_file);}}else if(del_file->leftchild==NULL||del_file->rightchild==NULL) //被删除结点没有做孩子或右孩子{if(del_file->leftchild==NULL) //没有左孩子{if(parent_file==NULL) //删除的为根结点{fileBST=del_file->rightchild;del_file->rightchild->parent=NULL;}else if(parent_file->leftchild==del_file) //右孩子接上{parent_file->leftchild=del_file->rightchild;del_file->rightchild->parent=parent_file;}else //右孩子接上{parent_file->rightchild=del_file->rightchild;del_file->rightchild->parent=parent_file;}}else //没有右孩子{if(parent_file==NULL) //删除的为根结点{fileBST=del_file->leftchild;del_file->leftchild->parent=NULL;}else if(parent_file->leftchild==del_file) //左孩子接上{parent_file->leftchild=del_file->leftchild;del_file->leftchild->parent=parent_file;}else //左孩子接上{parent_file->rightchild=del_file->leftchild;del_file->leftchild->parent=parent_file;}}free(del_file);}else //左右孩子都有{move_file_parent=del_file->leftchild;move_file=move_file_parent->rightchild;if(move_file==NULL) //被删除结点的左孩子没有右孩子{if(parent_file==NULL) //删除的为根结点{fileBST=move_file_parent;fileBST->rightchild=del_file->rightchild;fileBST->parent=NULL;}else if(parent_file->leftchild==del_file)parent_file->leftchild=move_file_parent;elseparent_file->rightchild=move_file_parent;move_file_parent->parent=parent_file;move_file_parent->rightchild=del_file->rightchild;}else{while(move_file->rightchild!=NULL) //寻找右边最底下的结点{move_file=move_file->rightchild;move_file_parent=move_file_parent->rightchild;}move_file_parent->rightchild=NULL;move_file->leftchild=del_file->leftchild;move_file->rightchild=del_file->rightchild;if(move_file->rightchild!=NULL)move_file->rightchild->parent=move_file; //右孩子的双亲也要改变move_file->parent=del_file->parent;if(fileBST==del_file) //删除的为根结点fileBST=move_file;free(del_file);}}printf(" 成功删除文件%s\n",name);getch();return fileBST;}void del_in_share(UFD *node){REC *first,*second;first=share_file;second=share_file->link;if(second==NULL){share_file=NULL;free(first);}elsedo{if(second->file==node){first->link=second->link;free(second);}else{first=first->link;second=second->link;}}while(second!=NULL);}void fcreate(UFD *fileBST) //在fileBST 的同一层创建文件{char s;char name[30];int flag=0;UFD *newfile,*temp=NULL;REC *stemp;system("cls");printf("----------------------------------------------------------------\n");printf("------------------- 文件系统/创建文件---------------------\n");printf("----------------------------------------------------------------\n\n");do{printf(" 1. 创建文件\n");printf(" 2. 创建文件夹\n");printf(" 3. 取消\n");printf(" 请选择:\n");scanf("%c",&s);fflush(stdin);if(s=='3')return;if(s!='1'&&s!='2')printf(" 输入错误,请重新输入!\n");}while(s!='1'&&s!='2');if(strcmp(fileBST->name,"NULL")==0) //节点已有(未赋值)用于本层文件夹的第一个文件的特殊情况newfile=fileBST;else{newfile=(UFD*)malloc(sizeof(UFD)); //创建树节点newfile->leftchild=NULL;newfile->rightchild=NULL;}printf(" 请输入文件(夹)名:");scanf("%s",name);fflush(stdin);//搜索二叉树,文件重名就创建失败temp=searchBST(fileBST,name);if(temp!=NULL){printf(" 已存在该文件(夹),创建失败!\n");strcpy(newfile->name,"NULL");return;}strcpy(newfile->name,name);if(folder_depth==1)newfile->pre_folder=NULL;elsenewfile->pre_folder=pre_opera_folder;// 指向正在操作文件夹while(1) //读写否,共享否{printf(" 只读r 还是可读写w:");scanf("%c",&(newfile->rw));fflush(stdin);printf(" 是否共享y/n:");scanf("%c",&(newfile->share));fflush(stdin);if((newfile->rw=='r'||newfile->rw=='w')&&(newfile->share=='y'||newfile->share=='n')) break;printf(" 输入有误,请重新输入!\n");}//*********** 以下为文件和文件夹初始化中不同的地方****************** if(s=='1'){newfile->file_folder='f';newfile->folder=NULL;newfile->file=(AFD*)malloc(sizeof(AFD));printf(" 请输入文件的内容(<100):");scanf("%s",newfile->file->afd_file);fflush(stdin);newfile->length=strlen(newfile->file->afd_file);}else //文件夹的初始化{newfile->file_folder='o';newfile->file=NULL;newfile->length=0;newfile->folder=(UFD*)malloc(sizeof(UFD)); //连上一个空文件节点newfile->folder->pre_folder=newfile;newfile->folder->leftchild=NULL;strcpy(newfile->folder->name,"NULL");newfile->folder->rightchild=NULL;}//****************************************************************if(fileBST!=newfile)insertBST(fileBST,newfile); // 初始化完成后插入到二叉树中elsenewfile->parent=NULL;// 第一个结点略去插入,其双亲结点为空if(newfile->share=='y') //接入共享链{stemp=((REC*)malloc(sizeof(REC)));stemp->file=newfile;stemp->link=share_file;share_file=stemp;}}UFD *fdelete(UFD *fileBST) //在fileBST 的同一层删除文件{char name[30];REC *temp;printf(" 请输入要删除的文件:");scanf("%s",name);fflush(stdin);temp=open_file; //检查文件是否打开,打开则删除失败while(temp!=NULL){if(strcmp(temp->file->name,name)==0){ printf(" 文件打开中,请关闭后再删除!");getch();return fileBST;}else temp=temp->link;}fileBST=deleteBST(fileBST,name);return fileBST;}void fopen(UFD *fileBST){char name[30];UFD *temp=NULL,*temp1=NULL;printf(" 请输入要打开的文件的名字:");scanf("%s",name);fflush(stdin);temp=searchBST(fileBST,name);if(temp==NULL){printf(" 文件不存在!\n");temp=check_share(name);if(temp==NULL){ printf(" 文件不存在!\n");return;}}//******************* 找到文件,以下为打开部分********************** if(temp->file_folder=='o') //打开文件夹{folder_depth++;temp1=pre_opera_folder; //保护正在操作文件pre_opera_folder=temp;temp->folder=operations(temp->folder);pre_opera_folder=temp1; //写回folder_depth--;}else //打开文件{REC *newopen;newopen=((REC*)malloc(sizeof(REC)));// 接入打开链newopen->file=temp;newopen->link=open_file;open_file=newopen;printf(" 已成功打开问%s!\n",temp->name);getch();}}void fclose(){char name[30];REC *first=NULL,*second=NULL;printf(" 请输入要关闭的文件:");scanf("%s",name);fflush(stdin);first=open_file;if(first==NULL){printf(" 没有打开的文件\n");getch();return;}else second=first->link;if(second==NULL&&strcmp(first->file->name,name)==0){free(first); open_file=NULL;printf(" 成功关闭文件%s\n!",name);return;}else{while(second!=NULL){if(strcmp(second->file->name,name)==0){first->link=second->link; free(second);printf(" 成功关闭文件%s\n!",name);return;}else{first=first->link;second=second->link;}}}printf(" 没有找到问件%s,关闭失败!\n",name);}void fread_write(UFD *fileBST,char f){char s;char name[30];char newfile[100];UFD *temp=NULL;if(f=='5')printf(" 请输入要读取的文件的名字:");elseprintf(" 请输入要写入的文件的名字:");scanf("%s",name);fflush(stdin);temp=searchBST(fileBST,name);if(temp==NULL){printf(" 文件不存在!\n");temp=check_share(name);if(temp==NULL){ printf(" 文件不存在!\n");return;}}if(temp->file_folder=='o'){printf(" 文件夹不可读写!");return;}printf(" 文件的内容是:%s\n\n\n",temp->file->afd_file);getch();if(f=='5')return; //读取文件操作到此结束if(temp->rw=='r'){printf(" 只读文件,不可写入!\n");return;}else //追加或重写{do{system("cls");printf(" 1. 追加\n");printf(" 2. 重写\n");printf(" 3. 取消\n");printf(" 请选择:\n");scanf("%c",&s);fflush(stdin);if(s=='3')return;if(s!='1'&&s!='2')printf(" 输入错误,请重新输入!\n");}while(s!='1'&&s!='2');printf(" 请输入要重写或追加的内容(<100):");scanf("%s",newfile);fflush(stdin);if(s=='1') //修改strcat(temp->file->afd_file,newfile);elsestrcpy(temp->file->afd_file,newfile);temp->length=strlen(temp->file->afd_file);}}UFD *check_share(char name[30]){char s;UFD *temp=NULL;REC *stemp=NULL;printf(" 共享文件夹为:\n");stemp=share_file;while(stemp!=NULL){ printf("%s",stemp->file->name);if(stemp->file->file_folder=='f')printf("\t");else printf("..\t");stemp=stemp->link;}printf("\n 是否尝试在共享文件夹中打开(y/n):");do{s=getchar();if(s=='n'||s=='N')return NULL;else if(s=='y'||s=='Y')break;else printf(" 输入错误,请重新输入:");}while(s!='y'&&s!='n'&&s!='Y'&&s!='N');stemp=share_file;while(stemp!=NULL){if(strcmp(stemp->file->name,name)==0){temp=stemp->file;break;}stemp=stemp->link;}return temp;}UFD *operations(UFD *fileBST){while(1){char s;system("cls");if(open_file!=NULL){printf(" 已打开文件,请及时关闭!\n");printf(" 文件名\t 文件长度\t 读写\t 共享\t 内容");printf("\n");print_open_file();printf("\n");}printf(" 当前路径:");print_path(fileBST);printf("\n");if(strcmp(fileBST->name,"NULL")==0)printf(" 本层文件为空!\n");else{ printf(" 本文件夹包含以下文件:\n");BSTtraverse(fileBST);}printf("\n");printf(" 1. 创建文件create \n");printf(" 2. 删除文件delete \n");printf(" 3. 打开文件open \n");printf(" 4. 关闭文件close \n");printf(" 5. 读文件read \n");printf(" 6. 写文件write \n");printf(" 0. 返回上一层/注销\n\n");printf(" 请选择: ");printf("");scanf("%c",&s);fflush(stdin);switch(s){ case '1':fcreate(fileBST);break;case '2':fileBST=fdelete(fileBST);break;case '3':fopen(fileBST);break;case '4':fclose();break;case '5':case '6':fread_write(fileBST,s);break;case '0':return fileBST;default:break;}}}void Log_in(){MFD *temp=NULL;char name[30];char flag='0';if(mfd_link==NULL){printf(" 目前还没有创建用户,请创建后再登陆!");getch();return;}do{printf(" 请输入用户名:");scanf("%s",name);fflush(stdin);if(strcmp(name,"cancel")==0)return; //取消登陆temp=mfd_link;while(temp!=NULL){if(strcmp(name,temp->name)==0){pre_user=temp;folder_depth++;pre_opera_folder=temp->bst_pointer;temp->bst_pointer=operations(temp->bst_pointer); //进入文件操作pre_opera_folder=NULL;folder_depth--;flag='1';return;}elsetemp=temp->link;}printf(" 用户不存在,请重新输入!输入cancel 取消登陆");//防止使用者忘记登陆名printf("\n");}while(1);}void Init_user(){char name[30];MFD *newmfd,*temp=NULL,*temp1=NULL;printf(" 请输入用户名:");scanf("%s",name); //输入名字fflush(stdin);printf("\n");temp=mfd_link;if(temp!=NULL)do{if(strcmp(temp->name,name)==0){ printf(" 用户已存在,创建失败!\n");getch();return;}if(temp->link==NULL)temp1=temp;temp=temp->link;}while(temp!=NULL);newmfd=(MFD*)malloc(sizeof(MFD));strcpy(newmfd->name,name);newmfd->bst_pointer=(UFD*)malloc(sizeof(UFD)); //创建一个空的文件夹newmfd->bst_pointer->pre_folder=NULL;newmfd->bst_pointer->leftchild=NULL;strcpy(newmfd->bst_pointer->name,"NULL");newmfd->bst_pointer->rightchild=NULL;newmfd->link=NULL;if(temp1!=NULL)temp1->link=newmfd; //插到队尾else mfd_link=newmfd;printf(" 成功创建用户%s!",name);getch();}void Check_user(){int i=1;MFD *temp;if(mfd_link==NULL){printf(" 目前还没有创建用户!");getch();return;}printf(" 以创建的用户有:\n");temp=mfd_link;while(temp!=NULL){ printf(" 用户%d: %s\n",i,temp->name);temp=temp->link;i++;}printf("\n");getch();return;}int main(){char s;while(1){system("cls");printf("----------------------------------------------------------------\n");printf("-------------------------- 文件系统-------------------------\n");printf("----------------------------------------------------------------\n\n");printf(" 1. 登录\n");printf(" 2. 添加新用户\n");printf(" 3. 查看已注册用户\n");printf(" 0. 退出\n\n");printf(" 请选择: ");printf("");scanf("%c",&s);fflush(stdin);if(s!='0'&&s!='1'&&s!='2'&&s!='3'){ printf(" 输入错误,请重新输入:");getch();fflush(stdin);continue;}switch(s){case '1':Log_in();break;case '2':Init_user();break;case '3':Check_user();break;case '0':return 1;default:break;}}return 0;}七、测试登录操作:以下为对文件的六个基本操作:无穷级文件、文件路径的显示,以及打开一个不存在的文件的示例:打开普通文件后的情况,此时不能删除文件:本系统未能实现级联删除,操作被禁止:关闭文件后删除操作成功:逐个删除后“文件系统”文件夹也可以删除了:八、总结本次课程设计设计的知识比较广,需要较好的理解能力和编程能力。

相关文档
最新文档