操作系统课设报告文件管理系统
- 格式:doc
- 大小:578.50 KB
- 文档页数:24
《操作系统》课程教案第一章:操作系统概述1.1 学习目标理解操作系统的概念、作用和重要性掌握操作系统的基本功能和分类了解操作系统的历史和发展趋势1.2 教学内容操作系统的定义和作用操作系统的功能:进程管理、存储管理、文件管理、作业管理和设备管理操作系统的分类:批处理系统、分时系统、实时系统和分布式系统操作系统的发展趋势:个人操作系统、服务器操作系统、嵌入式操作系统和云计算操作系统1.3 教学方法讲授:讲解操作系统的概念、功能和发展趋势案例分析:分析不同类型的操作系统实例讨论:引导学生思考操作系统的未来发展方向1.4 教学资源教材:操作系统相关书籍课件:操作系统的图片、图表和动画网络资源:操作系统相关的文章和视频1.5 教学评估课堂问答:检查学生对操作系统概念的理解小组项目:培养学生合作分析和解决问题的能力第二章:进程管理2.1 学习目标理解进程的概念和作用掌握进程管理的基本方法和策略了解进程调度和死锁的解决方法2.2 教学内容进程的定义和作用:进程的属性、进程的状态和进程的控制块进程管理的基本方法:进程的创建、进程的终止和进程的同步进程调度:短作业优先调度、优先级调度和轮转调度死锁的解决方法:资源分配图、银行家算法和死锁避免2.3 教学方法讲授:讲解进程的概念、进程管理的方法和策略模拟实验:模拟进程调度和死锁的解决过程讨论:引导学生思考进程管理的优化方法2.4 教学资源教材:操作系统相关书籍课件:进程的概念、进程管理的图表和动画网络资源:进程调度和死锁解决相关的文章和视频2.5 教学评估课堂问答:检查学生对进程概念的理解小组项目:培养学生合作分析和解决问题的能力第三章:存储管理3.1 学习目标理解存储管理的作用和重要性掌握存储管理的策略和方法了解虚拟存储器和页面置换的算法3.2 教学内容存储管理的作用和重要性:存储器的层次结构、存储管理的任务和目标存储管理的策略:分页存储管理、分段存储管理和段页式存储管理页面置换的算法:先进先出置换、最近最久未使用置换和最少使用置换虚拟存储器的实现:虚拟地址空间、页面表和缺页中断3.3 教学方法讲授:讲解存储管理的作用、策略和页面置换算法模拟实验:模拟虚拟存储器和页面置换的过程讨论:引导学生思考存储管理的优化方法3.4 教学资源教材:操作系统相关书籍课件:存储管理的图表和动画网络资源:虚拟存储器和页面置换相关的文章和视频3.5 教学评估课堂问答:检查学生对存储管理作用的理解课后作业:巩固学生对存储管理策略和方法的掌握小组项目:培养学生合作分析和解决问题的能力第四章:文件管理4.1 学习目标理解文件的概念和作用掌握文件管理的基本方法和策略了解目录结构和文件系统的实现4.2 教学内容文件的概念和作用:文件的基本属性、文件的类型和文件的操作文件管理的基本方法:文件的创建、文件的删除和文件的权限管理目录结构:树状目录结构、层次目录结构和虚拟目录结构文件系统的实现:文件系统的层次结构、文件系统的存储方式和文件系统的访问控制4.3 教学方法讲授:讲解文件的概念、文件管理的方法和策略模拟实验:模拟文件操作和目录结构的过程讨论:引导学生思考文件管理的优化方法4.4 教学资源教材:操作系统相关书籍课件:文件的概念、文件管理的图表和动画网络资源:目录结构和文件系统实现相关的文章和视频4.5 教学评估课堂问答:检查学生对文件概念的理解课后作业:巩固学生对文件管理方法的掌握小组项目:第六章:作业管理6.1 学习目标理解作业管理的作用和重要性掌握作业调度和作业控制的方法了解作业优先级和作业队列的实现6.2 教学内容作业管理的作用和重要性:作业的概念、作业的类型和作业管理的任务作业调度:作业优先级调度、作业期限调度和多级反馈调度作业控制:作业的创建、作业的执行和作业的终止作业队列的实现:作业队列的维护和作业队列的优化6.3 教学方法讲授:讲解作业管理的作用、方法和策略模拟实验:模拟作业调度和作业控制的过程讨论:引导学生思考作业管理的优化方法6.4 教学资源教材:操作系统相关书籍课件:作业管理的图表和动画网络资源:作业优先级和作业队列实现相关的文章和视频6.5 教学评估课堂问答:检查学生对作业管理作用的理解课后作业:巩固学生对作业控制方法的掌握小组项目:培养学生合作分析和解决问题的能力第七章:设备管理7.1 学习目标理解设备管理的作用和重要性掌握设备管理的基本方法和策略了解设备驱动程序和I/O调度7.2 教学内容设备管理的作用和重要性:设备的分类、设备管理的目标和设备管理的任务设备管理的基本方法:设备分配、设备驱动程序和设备控制设备驱动程序:设备驱动程序的原理、设备驱动程序的编写和设备驱动程序的调试I/O调度:轮转调度、优先级调度和反馈调度7.3 教学方法讲授:讲解设备管理的作用、方法和策略模拟实验:模拟设备驱动程序和I/O调度过程讨论:引导学生思考设备管理的优化方法7.4 教学资源教材:操作系统相关书籍课件:设备管理的图表和动画网络资源:设备驱动程序和I/O调度实现相关的文章和视频7.5 教学评估课堂问答:检查学生对设备管理作用的理解课后作业:巩固学生对设备管理方法的掌握小组项目:培养学生合作分析和解决问题的能力第八章:用户接口8.1 学习目标理解用户接口的作用和重要性掌握命令接口和图形用户接口的设计了解用户接口的实现和用户界面设计的原则8.2 教学内容用户接口的作用和重要性:用户接口的概念、用户接口的任务和用户接口的设计目标命令接口的设计:命令的语法、命令的语义和命令的帮助图形用户接口的设计:图形用户接口的元素、图形用户接口的布局和图形用户接口的交互用户接口的实现:用户接口的框架、用户接口的库和用户接口的编程接口8.3 教学方法讲授:讲解用户接口的作用、设计和实现案例分析:分析常见的命令接口和图形用户接口实例讨论:引导学生思考用户界面设计的优化方法8.4 教学资源教材:操作系统相关书籍课件:用户接口的图表和动画网络资源:用户接口设计和用户界面设计相关的文章和视频8.5 教学评估课堂问答:检查学生对用户接口作用的理解课后作业:巩固学生对命令接口和图形用户接口设计的掌握小组项目:培养学生合作分析和解决问题的能力第九章:操作系统安全9.1 学习目标理解操作系统安全的作用和重要性掌握操作系统安全的基本策略和方法了解操作系统安全漏洞和攻击手段9.2 教学内容操作系统安全的作用和重要性:操作系统的安全级别、操作系统的安全目标和操作系统的安全威胁操作系统安全的基本策略:访问控制、身份验证、加密和审计操作系统安全的方法:安全内核、安全操作系统和操作系统安全增强操作系统安全漏洞和攻击手段:缓冲区溢出、恶意软件和网络攻击9.3 教学方法讲授:讲解操作系统安全的作用、策略和方法案例分析:分析操作系统安全漏洞和攻击手段的实例讨论:引导学生思考操作系统安全的优化方法9.4 教学资源教材:操作系统相关书籍课件:操作系统安全的图表和动画网络资源:操作系统安全策略和操作系统安全漏洞相关的文章和视频9.5重点解析本《操作系统》课程教案涵盖了操作系统的概述、进程管理、存储管理、文件管理、作业管理、设备管理、用户接口和操作系统安全等十个章节。
《操作系统》课程设计一、课程目标知识目标:1. 让学生掌握操作系统的基本概念,包括进程、线程、内存管理、文件系统等核心知识;2. 了解操作系统的历史发展,掌握不同类型操作系统的特点及使用场景;3. 掌握操作系统的性能评价方法和常用的调度算法。
技能目标:1. 培养学生运用操作系统知识解决实际问题的能力,如分析系统性能瓶颈、优化系统资源分配等;2. 培养学生具备基本的操作系统编程能力,如进程创建、线程同步、文件操作等;3. 提高学生的团队协作能力和沟通能力,通过小组讨论和项目实践,学会共同解决问题。
情感态度价值观目标:1. 培养学生对操作系统学科的兴趣,激发学生的学习热情,使其形成积极向上的学习态度;2. 培养学生具备良好的信息素养,尊重知识产权,遵循法律法规;3. 培养学生的创新精神和批判性思维,敢于质疑、勇于探索,形成独立思考的能力。
课程性质:本课程为计算机科学与技术专业的核心课程,旨在让学生掌握操作系统的基本原理和实现方法,提高学生的系统分析和编程能力。
学生特点:学生具备一定的编程基础和计算机系统知识,具有较强的逻辑思维能力和动手实践能力。
教学要求:结合学生特点和课程性质,注重理论与实践相结合,通过案例分析和项目实践,帮助学生将所学知识内化为具体的学习成果。
在教学过程中,关注学生的学习进度和反馈,及时调整教学策略,确保课程目标的实现。
二、教学内容1. 操作系统概述:介绍操作系统的定义、发展历程、功能、类型及特点,对应教材第一章内容。
- 操作系统的起源与发展- 操作系统的功能与类型- 操作系统的主要特点2. 进程与线程:讲解进程与线程的概念、状态、调度算法,对应教材第二章内容。
- 进程与线程的定义与区别- 进程状态与转换- 进程调度算法3. 内存管理:分析内存管理的基本原理、策略和技术,对应教材第三章内容。
- 内存分配与回收策略- 虚拟内存技术- 页面置换算法4. 文件系统:介绍文件系统的基本概念、结构、存储原理,对应教材第四章内容。
《操作系统课程设计》报告学号:姓名:班级:指导教师:报告日期:一、课设目的通过对操作系统课程的学习,熟悉进程的概念、进程的管理与存储、进程的调度,通过实践深入理解进程的调度算法。
二、课设任务要求编写一个程序,可以创建若干个虚拟进程,并对若干个虚拟进程进行调度,调度策略为时间片轮转法,主要任务包括:①进程的个数,进程的内容(即进程的功能序列)来源于一个进程序列描述文件,另外调度运行结果输出到一个运行日志文件;②设计PCB适用于时间片轮转法;③建立进程队列;④实现时间片轮转调度算法,尽量可视化的展示调度的动态过程。
○5总结程序设计的开发过程:需求分析、系统设计、系统实现及文档的收集和整理。
三、实验方法与设计分析每个进程有一个进程控制块( PCB)表示。
进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
据需要设计调查计划调查、收集数据,能按要求整理数据,在统计表进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为输入进程的时间。
,计算机,千千万万中小创业者渴望成功高中语文,语文试卷,计算机摇篮课进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
式,因此上开店成为了一种潮流,并且越来越多高中语文,语文试卷,计算机就绪进程获得 CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示。
卷,计算机络购物高中语文,语文试卷,计算机市场潜力还远未被释放课件同如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
语文,语文试卷,计算机,第5代速度达自动软件,不用东奔西走高中语文,语文每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。
操作系统课程设计Linux一、教学目标本课程的教学目标是使学生掌握Linux操作系统的核心概念、原理和应用技能。
通过本课程的学习,学生将能够:1.理解操作系统的基本原理,包括进程管理、内存管理、文件系统和输入/输出系统。
2.掌握Linux操作系统的安装、配置和管理方法。
3.熟练使用Linux命令行界面,进行日常操作和系统管理。
4.掌握Linux常用命令、 shell脚本编写和系统监控工具的使用。
5.了解Linux操作系统在服务器、嵌入式设备和云计算等领域的应用。
二、教学内容本课程的教学内容分为五个部分:1.操作系统概述:介绍操作系统的定义、功能和分类,以及Linux操作系统的历史和发展。
2.进程管理:讲解进程的基本概念、进程控制、进程同步和互斥、死锁及其解决方法。
3.内存管理:介绍内存分配与回收策略、内存保护、虚拟内存和分页分段机制。
4.文件系统:讲解文件和目录结构、文件访问控制、文件系统性能优化和磁盘空间分配策略。
5.输入/输出系统:介绍I/O设备管理、中断和DMA机制、设备驱动程序和I/O调度策略。
三、教学方法本课程采用多种教学方法相结合的方式,以提高学生的学习兴趣和主动性:1.讲授法:教师讲解操作系统的核心概念和原理,引导学生掌握基本知识。
2.讨论法:学生针对实际案例和问题进行讨论,培养学生的思考和分析能力。
3.案例分析法:分析Linux操作系统的实际应用案例,使学生了解操作系统的应用场景。
4.实验法:安排实验室课时,让学生亲自动手进行系统安装、配置和调试,提高学生的实践能力。
四、教学资源本课程的教学资源包括:1.教材:选用权威、实用的Linux操作系统教材,如《Linux操作系统原理与应用》。
2.参考书:提供相关的学术论文、技术博客和在线文档,供学生拓展阅读。
3.多媒体资料:制作课件、教学视频和演示文稿,辅助学生理解和记忆。
4.实验设备:提供Linux服务器、虚拟机和实验室环境,让学生进行实际操作。
操作系统课程设计报告专业:计算机信息处理学号:08201328姓名:杨馨雨提交日期:2011-7-14【设计目的】1.课程设计目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。
2.结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。
3.通过对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力【设计内容】1、delete删除文件2、open打开文件3、close关闭文件4、write写文件【实验环境】Windows7系统Visualstudio2010【相关知识综述】本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。
另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。
首先应确定文件系统的数据结构:主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
用户创建的文件,可以编号存储于磁盘上。
如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。
【设计思路】1主要数据结构#define MAXNAME25/*thelargestlengthofmfdname,ufdname,filename*/#define MAXCHILD50/*thelargestchild每个用户名下最多有50个文件*/#define MAX(MAXCHILD*MAXCHILD)/*thesizeoffpaddrno*/typedefstruct/*thestructureofOSFILE定义主文件*/{int fpaddr;/*filephysicaladdress*/int flength;/*filelength*/int fmode;/*filemode:0-ReadOnly;1-WriteOnly;2-ReadandWrite;3-Protect;*/char fname[MAXNAME];/*filename*/}OSFILE;typedefstruct/*thestructureofOSUFD定义用户文件目录*/{char ufdname[MAXNAME];/*ufdname*/OSFILEufdfile[MAXCHILD];/*ufdownfile*/}OSUFD;typedefstruct/*thestructureofOSUFD'LOGIN定义登陆*/{char ufdname[MAXNAME];/*ufdname*/char ufdpword[8];/*ufdpassword*/}OSUFD_LOGIN;typedefstruct/*fileopenmode定义操作方式*/{int ifopen;/*ifopen:0-close,1-open*/int openmode;/*0-readonly,1-writeonly,2-readandwrite,3-initial*/}OSUFD_OPENMODE;2主要函数void LoginF();/*LOGINFileSystem*/void DirF();/*DirFileSystem*/void CreateF();/*CreateFile*/void DeleteF();/*DeleteFile*/void ModifyFM();/*ModifyFileMode*/void OpenF();/*OpenFile*/void CloseF();/*CloseFile*/void ReadF();/*ReadFile*/void WriteF();/*WriteFile*/void QuitF();/*QuitFileSystem*/void CdF();/*ChangeDir*/void help();【主要程序段】1Delete函数voidDeleteF()/*DeleteFile*/{charfname[MAXNAME],str[50],str1[50];inti,k,j;intfpaddrno1;if(strcmp(strupr(ltrim(rtrim(dirname))),"")==0)/*无法删除主目录的文件*/{printf("\.\n");wgetchar=1;}if(strcmp(strupr(dirname),strupr(username))!=0)/*无法删除非自己目录的文件*/{printf("\.\n");wgetchar=1;}else{printf("\nPleaseinputFileName:");gets(fname);fopen==1)/*文件打开时无法删除*/{printf("\nError.\'%s\'.\n",fname);wgetchar=1;}else{if(ufd[k]->ufdfile[i].fmode==3)/*被保护的文件无法删除*/{printf("\nError.\'%s\'.\n",fname);wgetchar=1;}else{fpaddrno1=ufd[k]->ufdfile[i].fpaddr;xt");remove(str);n",fname);wgetchar=1;}}}else'%s\'dosenotexist.\n",fname);wgetchar=1;}}}2Open函数voidOpenF()/*OpenFile*/{charfname[MAXNAME];inti,k,j;if(strcmp(strupr(dirname),strupr(username))!=0)/*在自己的目录里才能打开*/{printf("\.\n");wgetchar=1;}else{k=ExistD(username);for(j=0;j<fcount[k];j++){printf("%15s",ufd[k]->ufdfile[j].fname);}printf("\nPleaseinputFileName:");gets(fname);fopen==1)'%s\'isinopenstatus.\n",fname);wgetchar=1;}else{ifopen[k][i].ifopen=1;mode==0)/*根据文件的模式设置打开模式*/{ifopen[k][i].openmode=0;}elseif(ufd[k]->ufdfile[i].fmode==1){ifopen[k][i].openmode=1;}elseif(ufd[k]->ufdfile[i].fmode==2){ifopen[k][i].openmode=2;}elseifopen[k][i].openmode=3;printf("\n\'%s\'isopenedsuccessfully\n",fname);wgetchar=1;}}else'%s\'dosenotexist.\n",fname);wgetchar=1;}}}3Close函数voidCloseF()/*CloseFile*/{charfname[MAXNAME];inti,k,j;if(strcmp(strupr(dirname),strupr(username))!=0)/*不在自己的目录里没法进行*/{printf("\.\n");wgetchar=1;}else{k=ExistD(username);for(j=0;j<fcount[k];j++)/*列出已经打开的文件*/ {if(ifopen[k][j].ifopen==1)name);}printf("\nPleaseinputFileName:");gets(fname);fopen=0;/*关闭文件*/printf("\n\'%s\'closedsuccessfully\n",fname);wgetchar=1;}else'%s\'dosenotexist.\n",fname);wgetchar=1;}}}4Write函数voidWriteF()/*WriteFile*/{inti,k,n=0;intlength;charfname[MAXNAME],values[1000];charstr[255],str1[255],c;if(strcmp(strupr(ltrim(rtrim(dirname))),"")==0)n");wgetchar=1;return;}printf("\nCaution:Openfilefirst\n");printf("OpenedFile(s)List:\n");k=ExistD(dirname);fopen==1)name);n++;}if((n%4==0)&&(n!=0))printf("\n");}printf("\n%dfilesopenned.\n",n);if(n==0)wgetchar=1;fopen==1)penmode==1)||(ifopen[k][i].o penmode==2))paddr,str,10);xt");fp_file=fopen(str,"ab");length=ufd[k]->ufdfile[i].flengt h+length;n",ufd[k]->ufdfile[i].flength);printf("\n\nYouhavewritefilesuccessfully!!");fclose(fp_file);wgetchar=0;}elseif(ifopen[k][i].openmode==0)'%s\'\'twrite.\n",fname) ;wgetchar=1;}else'%s\'\'twrite.\n",fname);wgetchar=1;}}else'%s\'\n",fname);wgetchar=1;}}else'%s\'doesnotexist.\n",fname);wgetchar=1;}}}【程序流程设计】1总的功能结构图:2部分子模块程序流程图(1)打开命令的程序流程图:(2)关闭命令的程序流程图:(3)写命令的程序流程图:(4)删除命令的程序流程图:【测试结果】1删除文件2打开的文件不能删除3打开文件,其中已经打开的文件不能再次打开3关闭文件4写文件,其中只有打开了文件才能写入5写文件6只读文件和保护文件不能写入7其他函数【参考文献】计算机操作系统,西安电子科技大学出版社,方敏主编, 【源程序清单】#include""#include""#include""#include""#define MAXNAME25/*thelargestlengthofmfdname,ufdname,filename*/#define MAXCHILD50/*thelargestchild每个用户名下最多有50个文件*/#define MAX(MAXCHILD*MAXCHILD)/*thesizeoffpaddrno*/typedefstruct/*thestructureofOSFILE定义主文件*/{int fpaddr;/*filephysicaladdress*/int flength;/*filelength*/int fmode;/*filemode:0-ReadOnly;1-WriteOnly;2-ReadandWrite;3-Protect;*/ char fname[MAXNAME];/*filename*/}OSFILE;typedefstruct/*thestructureofOSUFD定义用户文件目录*/{char ufdname[MAXNAME];/*ufdname*/OSFILEufdfile[MAXCHILD];/*ufdownfile*/}OSUFD;typedefstruct/*thestructureofOSUFD'LOGIN定义登陆*/char ufdname[MAXNAME];/*ufdname*/char ufdpword[8];/*ufdpassword*/}OSUFD_LOGIN;typedefstruct/*fileopenmode定义操作方式*/{int ifopen;/*ifopen:0-close,1-open*/int openmode;/*0-readonly,1-writeonly,2-readandwrite,3-protect*/}OSUFD_OPENMODE;void LoginF();/*LOGINFileSystem*/void DirF();/*DirFileSystem*/void CreateF();/*CreateFile*/void DeleteF();/*DeleteFile*/void ModifyFM();/*ModifyFileMode*/void OpenF();/*OpenFile*/void CloseF();/*CloseFile*/void ReadF();/*ReadFile*/void WriteF();/*WriteFile*/void QuitF();/*QuitFileSystem*/void CdF();/*ChangeDir*/void help();char*rtrim(char*str);/*removethetrailingblanks.*/char*ltrim(char*str);/*removetheheadingblanks.*/void InputPW(char*password);/*inputpassword,use'*'replace*/int ExistD(char*dirname);/*WhetherDirNameExist,Exist-i,NotExist-0*/int WriteF1();/*writefile*/int ExistF(char*filename);/*WhetherFileNameExist,Exist-i,NotExist-0*/void SetPANo(int RorW);/*Setphysicaladdressnum*/int FindPANo();/*findoutphysicaladdressnum*/int ucount=0;/*thecountofmfd'sufds用户数*/int fcount[MAXCHILD];/*thecountofufd'sfiles子文件数*/int loginsuc=0;/*whetherloginsuccessfully登陆成功*/char username[MAXNAME];/*recordloginuser'sname22用户名*/char dirname[MAXNAME];/*recordcurrentdirectory使用的用户目录*/int fpaddrno[MAX];/*recordfilephysicaladdressnum物理地址号,存放自己所创建的所有文件的地址*/int wgetchar;/*whethergetchar()*/OSUFD*ufd[MAXCHILD];/*ufdandufdownfiles*/OSUFD_LOGINufd_lp;;QuitF();exit(0);break;case10:clrscr();choiceend=1;break;case11:CdF();choiceend=1;break;;}char*rtrim(char*str)/*removethetrailingblanks.去掉登陆用户名的尾空格*/int n=strlen(str)-1;while(n>=0){if(*(str+n)!=''){*(str+n+1)='\0';break;}else n--;}if(n<0)str[0]='\0';return str;}char*ltrim(char*str)/*removetheheadingblanks.去掉登陆用户名的头空格*/ {strrev(str);name),strupr(filename))==0){exist=1;break;}if(exist)return(i);elsereturn(-1);}int FindPANo()/*findoutphysicaladdressnum*/{int i;for(i=0;i<MAX;i++)if(fpaddrno[i]==0){fpaddrno[i]=1;break;}if(i<MAX)return(i);elsereturn(-1);}int WriteF1()/*writefile*/{int length=0;char c;printf("Pleaseinputtext(\'#\'standsforend):\n");while((c=getchar())!='#'){fprintf(fp_file,"%c",c);if(c!='\n')length++;}fprintf(fp_file,"\n");fclose(fp_file);return(length);}void LoginF()/*LOGINFileSystem登陆函数*/{char loginame[MAXNAME],loginpw[9],logincpw[9],str[50];xt");ufd[j]=(OSUFD*)malloc(sizeof(OSUFD));fopen=0;ifopen[j][i].openmode=4;}fclose(fp_ufd);}fclose(fp_mfd);ucount=j;SetPANo(0);printf("\n\nLoginsuccessful!WelcometothisFileSystem\n\n");loginsuc=1;return;}else xt");if((fp_ufd=fopen(str,"rb"))==NULL){fp_ufd=fopen(str,"wb");fclose(fp_ufd);}fp_mfd=fopen("d:\\osfile\\","rb");for(j=0;fread(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd)!=0;j++){strcpy(str,"d:\\osfile\\");strcat(str,;strcat(str,".txt");ufd[j]=(OSUFD*)malloc(sizeof(OSUFD));strcpy(ufd[j]->ufdname,strupr);fp_ufd=fopen(str,"rb");for(i=0;fread(&ufd[j]->ufdfile[i],sizeof(OSFILE),1,fp_ufd)!=0;i++,fcount[j]++)fopen =0;ifopen[j][i].openmode=4;}fclose(fp_ufd);}fclose(fp_mfd);ucount=j;SetPANo(0);printf("\n\nLoginSuccessful!WelcometothisSystem\n\n");loginsuc=1;return;}else");getch();clrscr();printf("\n%14s%16s%14s%10s%18s\n","FileName","FileAddress","FileLength","Type","Fil eMode");}itoa(ufd[j]->ufdfile[i].fpaddr,str,10);mode==0)strcpy(sfmode,"ReadOnly");elseif(ufd[j]->ufdfile[i].fmode==1)strcpy(sfmode,"WriteOnly");elseif(ufd[j]->ufdfile[i].fmode==2)strcpy(sfmode,"ReadAndWrite");else strcpy(sfmode,"Protect");printf("%14s%16s%14d%10s%18s\n",ufd[j]->ufdfile[i].fname,sfpaddr,ufd[j]->ufdfile[i] .flength,"<FILE>",sfmode);}printf("\n%3dfile(s)\n",fcount[j]);}else.");getch();clrscr();printf("\n%14s%18s%8s\n","DirName","OwnFileCount","Type");}printf("%14s%18d%8s\n",ufd[i]->ufdname,fcount[i],"<UFD>");count=count+fcount[i];}printf("\n%3ddir(s),%5dfile(s)\n",ucount,count);}}void CreateF()/*CreateFile*/{int fpaddrno,flag=1,i;char fname[MAXNAME],str[50],str1[50],a[25];char fmode[25];if(strcmp(strupr(dirname),strupr(username))!=0)n");wgetchar=1;}else{printf("\nPleaseinputFileName:");gets(fname);ltrim(rtrim(fname));if(ExistF(fname)>=0){printf("\\'%s\'hasalreadyexisted.\n",fname);wgetchar=1;}else{printf("PleaseinputFileMode(0-ReadOnly,1-WriteOnly,2-ReadandWrite,3-Protect):");gets(fmode);ltrim(rtrim(fmode));if((strcmp(fmode,"0")==0)||(strcmp(fmode,"1")==0)||(strcmp(fmode,"2")==0)||(strcmp( fmode,"3")==0)){fpaddrno=FindPANo();if(fpaddrno>=0)name,fname);paddr=fpaddrno;ufd[i]->ufdfile[fcount[i]].fmode=atoi(fmode);ifopen[i][fcount[i]].ifopen=0;ifopen[i][fcount[i]].openmode=4;strcpy(str,"d:\\osfile\\file\\file");itoa(fpaddrno,str1,10);strcat(str,str1);strcat(str,".txt");fp_file=fopen(str,"wb");fclose(fp_file);fcount[i]++;while(flag){printf("Inputtextnow(Y/N):");gets(a);ltrim(rtrim(a));ufd[i]->ufdfile[fcount[i]-1].flength=0;if(strcmp(strupr(a),"Y")==0){fp_file=fopen(str,"wb+");length=WriteF1();flag=0;}elseif(strcmp(strupr(a),"N")==0){flag=0;wgetchar=1;}}printf("\n\'%s\'hasbeencreatedsuccessfully!\n",fname);}else{printf("\nFail!.\n");wgetchar=1;}}else{printf("\\'sRangeis0-3\n");wgetchar=1;}}}}void DeleteF()/*DeleteFile*/{char fname[MAXNAME],str[50],str1[50];int i,k,j;int fpaddrno1;if(strcmp(strupr(ltrim(rtrim(dirname))),"")==0)/*无法删除主目录的文件*/{printf("\.\n");wgetchar=1;}if(strcmp(strupr(dirname),strupr(username))!=0)/*无法删除非自己目录的文件*/ {printf("\.\n");wgetchar=1;}else{printf("\nPleaseinputFileName:");gets(fname);fopen==1)/*文件打开时无法删除*/{printf("\nError.\'%s\'.\n",fname);wgetchar=1;}else{if(ufd[k]->ufdfile[i].fmode==3)/*被保护的文件无法删除*/{printf("\nError.\'%s\'.\n",fname);wgetchar=1;}else{fpaddrno1=ufd[k]->ufdfile[i].fpaddr;xt");remove(str);n",fname);wgetchar=1;}}}else'%s\'dosenotexist.\n",fname);wgetchar=1;}}}void ModifyFM()/*ModifyFileMode*/{char fname[MAXNAME],str[50];int i,k;char fmode[25];/*whetherdelete*/if(strcmp(strupr(dirname),strupr(username))!=0){printf("\.\n");wgetchar=1;}else{printf("\nPleaseinputFileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if(i>=0){k=ExistD(username);if(ifopen[k][i].ifopen==1){printf("\nError.\'%s\'.\n",fname);wgetchar=1;}else{if(ufd[k]->ufdfile[i].fmode==0)strcpy(str,"readonly");/*FileMode*/elseif(ufd[k]->ufdfile[i].fmode==1)strcpy(str,"writeonly");elseif(ufd[k]->ufdfile[i].fmode==2)strcpy(str,"readandwrite");else strcpy(str,"Protect");printf("\'%s\'filemodeis%s.\n",fname,strupr(str));printf("Modifyto(0-readonly,1-writeonly,2-readandwrite,3-Protect):");gets(fmode);ltrim(rtrim(fmode));if(strcmp(fmode,"0")==0){ufd[k]->ufdfile[i].fmode=0;printf("\n\'%s\'hasbeenmodifiedtoREADONLYmodesuccessfully.\n",fname);wgetchar=1;}elseif(strcmp(fmode,"1")==0){ufd[k]->ufdfile[i].fmode=1;printf("\n\'%s\'hasbeenmodifiedtoWRITEONLYmodesuccessfully.\n",fname);wgetchar=1;}elseif(strcmp(fmode,"2")==0){ufd[k]->ufdfile[i].fmode=2;printf("\n\'%s\'hasbeenmodifiedtoREADANDWRITEmodesuccessfully.\n",fname);wgetchar=1;}elseif(strcmp(fmode,"3")==0){ufd[k]->ufdfile[i].fmode=3;printf("\n\'%s\'hasbeenmodifiedtoFORBIDmodesuccessfully.\n",fname);wgetchar=1;}else{printf("\nError.\'%s\'isnotmodified.\n",fname);wgetchar=1;}}}else{printf("\nError.\'%s\'dosenotexist.\n",fname);wgetchar=1;}}}void OpenF()/*OpenFile*/{char fname[MAXNAME];int i,k,j;if(strcmp(strupr(dirname),strupr(username))!=0)/*在自己的目录里才能打开*/ {printf("\.\n");wgetchar=1;}else{k=ExistD(username);for(j=0;j<fcount[k];j++){printf("%15s",ufd[k]->ufdfile[j].fname);}printf("\nPleaseinputFileName:");gets(fname);fopen==1)'%s\'isinopenstatus.\n",fname);wgetchar=1;}else{ifopen[k][i].ifopen=1;mode==0)/*根据文件的模式设置打开模式*/{ifopen[k][i].openmode=0;}elseif(ufd[k]->ufdfile[i].fmode==1){ifopen[k][i].openmode=1;}elseif(ufd[k]->ufdfile[i].fmode==2){ifopen[k][i].openmode=2;}else ifopen[k][i].openmode=3;printf("\n\'%s\'isopenedsuccessfully\n",fname);wgetchar=1;}}else'%s\'dosenotexist.\n",fname);wgetchar=1;}}}void CloseF()/*CloseFile*/{char fname[MAXNAME];int i,k,j;if(strcmp(strupr(dirname),strupr(username))!=0)/*不在自己的目录里没法进行*/ {printf("\.\n");wgetchar=1;}else{k=ExistD(username);for(j=0;j<fcount[k];j++)/*列出已经打开的文件*/{if(ifopen[k][j].ifopen==1)name);}printf("\nPleaseinputFileName:");gets(fname);fopen=0;'%s\'dosenotexist.\n",fname);wgetchar=1;}}}void ReadF()/*ReadFile*/{int i,k,n=0;char fname[MAXNAME];char str[255],str1[255],c;if(strcmp(strupr(ltrim(rtrim(dirname))),"")==0)n");wgetchar=1;return;}printf("\nCaution:Openfilefirst\n");printf("OpenedFile(s)List:\n");k=ExistD(dirname);for(i=0;i<fcount[k];i++){if(ifopen[k][i].ifopen==1)name);n++;}if((n%4==0)&&(n!=0))printf("\n");}printf("\n%dfilesopenned.\n",n);if(n==0)wgetchar=1;fopen==1){if((ifopen[k][i].openmode==0)||(ifopen[k][i].openmode==2))paddr,str,10);strcpy(str1,"file");strcat(str1,str);strcpy(str,"d:\\osfile\\file\\");strcat(str,str1);strcat(str,".txt");fp_file=fopen(str,"rb");fseek(fp_file,0,0);printf("\nThetextis:\n\n");printf("");while(fscanf(fp_file,"%c",&c)!=EOF)if(c=='\n')printf("\n");else printf("%c",c);printf("\n\n%dLength.\n",ufd[k]->ufdfile[i].flength);fclose(fp_file);wgetchar=1;}elseif(ifopen[k][i].openmode==1)'%s\'\'tread.\n",fname);wgetchar=1;}else'%s\'\'tread.\n",fname);wgetchar=1;}}else{printf("\nError.\'%s\'\n",fname);wgetchar=1;}}else{printf("\nError.\'%s\'doesnotexist.\n",fname);wgetchar=1;}}}void WriteF()/*WriteFile*/{int i,k,n=0;int length;char fname[MAXNAME],values[1000];char str[255],str1[255],c;if(strcmp(strupr(ltrim(rtrim(dirname))),"")==0)n");wgetchar=1;return;}printf("\nCaution:Openfilefirst\n");printf("OpenedFile(s)List:\n");k=ExistD(dirname);fopen==1)name);n++;}if((n%4==0)&&(n!=0))printf("\n");}printf("\n%dfilesopenned.\n",n);if(n==0)wgetchar=1;fopen==1)penmode==1)||(ifopen[k][i].openmode==2))paddr,str,10);x t");fp_file=fopen(str,"ab");length=ufd[k]->ufdfile[i].flength+length;n",ufd[k]->ufdfile [i].flength);printf("\n\nYouhavewritefilesuccessfully!!");fclose(fp_file);wgetchar=0;}elseif(ifopen[k][i].openmode==0)'%s\'\'twrite.\n",fname);wgetchar=1;}else'%s\'\'twrite.\n",fname);wgetchar=1;}}else'%s\'\n",fname);wgetchar=1;}}else'%s\'doesnotexist.\n",fname);wgetchar=1;}}}void QuitF()/*QuitFileSystem*/{int i,j;char str[50];SetPANo(1);if(fp_mfd!=NULL)fclose(fp_mfd);xt");fp_ufd=fopen(str,"wb");fclose(fp_ufd);fp_ufd=fopen(str,"ab");for(i=0;i<fcount[j];i++)fwrite(&ufd[j]->ufdfile[i],sizeof(OSFILE),1,fp_ufd);fclose(fp_ufd);}}void CdF()/*ExchangeDir更换用户*/{char dname[MAXNAME];printf("\nPleaseinputDirName:");gets(dname);ltrim(rtrim(dname));if(ExistD(dname)>=0)strcpy(dirname,strupr(dname));elseif(strcmp(strupr(dname),"CD..")==0)strcpy(ltrim(rtrim(dirname)),"");else printf("\nError.\'%s\'doesnotexist.\n",dname);}void help(void){printf("\nTheCommandList\n");printf("\nCdAttribCreatewriteReadOpenClsDeleteExitClose\n");}【设计总结】UNIX系统中的文件系统是人们最感兴趣的,也是最成功的一部分。
操作系统课程设计报告姓名:xxx______学号:xxxxxxxxxxxx__专业年级:软件2班指导教师:__xx_2016年 3月1日1 概述目的:本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。
意义: 本系统是基于linux平台运行在终端上的虚拟二级文件管理系统。
模拟真正的文件管理系统,并采用用户登录机制对文件和文件夹进行创建,修改,删除的操作.对于文件夹而言,可以进行创建删除的操作;对于文件而言,可以创建,修改,删除.删除文件夹时,同时删除相应文件夹下的文件。
采用用户登录使得用户管理文件更方便,并形成了二级的文件管理模式.主要任务:为DOS系统设计一个简单的二级文件系统。
要求做到以下几点:①可以实现下列命令:login 用户登录dir 列文件目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件②列目录时要列出文件名、物理地址、保护码和文件长度. ③源文件可以进行读写保护(1)设计思路程序中要求每个用户在登陆后才可对其拥有的文件进行操作,用户对于其他用户的文件无操作权.文件操作包括浏览、创建、删除、打开、关闭、阅读、写入、修改模式。
其他操作包括新建用户、帮助、用户登入、用户登出、退出系统。
在程序文件夹下有个名为“file”的系统根目录,此目录下包括:一个名为“mfd”的文件,记录所有注册过的帐号及密码;用户文件,以用户名作为文件名,内容为其拥有的文件名及属性;一个名为“keiji”的文件夹.“keiji”文件夹中包括:“file。
p”指针文件,记录所有已用的物理地址;一些以物理地址为名的文件,内容为文件内容。
(2) 数据结构file结构体系统文件.数据结构:fpaddrint,文件的物理地址、flengthint,文件长度、fmodeint,文件模式 0。
只读;1.可写;2.可读写;3.保护、 fname[]char,文件名; filemode结构体文件状态数据结构:isopenint,文件当前状态,0。
2023年最新的操作系统文件管理实验报告三篇操作系统文件管理实验报告一篇一、实训主要内容Word排版,表格制作与编辑。
Powerpoint的制作,初步认识计算机办公应用OFFICE。
二、实训过程第一天:初步熟悉计算机的性能和认识Word;第二天:练习Word题;第三天:认识Powerpoint并对昨天的Word练习予以测试;Excel实训作业第四天:将Word表格与Powerpoint的制作熟悉巩固;第五天:老师再次对我们Word与Powerpoint测验以及教我们一些有用的技能与方法,初步认识计算机办公应用。
OFFICE。
三、实训心得体会很快的,一个假期又过来了,面对本学期最后一次的校园生活实训,想着刚刚过去的最后一个周,紧张沉默之后更多的是感慨,印在脑海里的每一个足迹都是那么的深,真的说不出是什么感觉,伴着时间,就像是在和自己的影子赛跑,不可能从真实的两面去看清它,只是经意不经意的感受着有种东西在过去,也许更适合的只有那句话:时不待我,怎可驻足一周,短短的一周,我学到了很多不知道的东西,实在是感受颇深。
当今企业竞争范围的伴随社会市场经济的发展以及信息化程度的不断提高而日益扩大,这样就要求企业在各个方面加强管理,要求企业有更高的信息化集成来实现对企业的整体资源进行集成管理。
现代企业都意识到,企业之间的竞争是综合实力的竞争,要求企业有更强的资金实力,具备强有力的管理能力和更快的市场响应速度。
因此,引入计算机系统的意义是非常重大的。
在社会主义市场经济高速发展的今天,如果计算机的各项管理运做仍然停滞在以纸、笔为主要工具的阶段,就会因为信息量的快速增长而无法迅速、准确的运用计算机完成各项工作,这样,必将成为企业各方面发展的一个瓶颈。
而在当代这个以信息时代为主题的社会里,计算机技术高速发展,将信息技术应用于对现代企业的管理日益普及。
计算机技术不但可以提高信息的处理速度和提高信息处理的准确性,更重要的是,可以进一步的解放劳动力,将他们分配到更需要人力资源的岗位上去,从而加快社会工作的现代化、综合化的发展步伐。
《操作系统》课程实验报告一、实验目的本次《操作系统》课程实验的主要目的是通过实际操作和观察,深入理解操作系统的工作原理、进程管理、内存管理、文件系统等核心概念,并掌握相关的操作技能和分析方法。
二、实验环境1、操作系统:Windows 10 专业版2、开发工具:Visual Studio Code3、编程语言:C/C++三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新进程,并观察进程的创建过程和资源分配情况。
同时,实现进程的正常终止和异常终止,并分析其对系统的影响。
2、进程同步与互斥使用信号量、互斥锁等机制实现进程之间的同步与互斥。
通过模拟多个进程对共享资源的访问,观察并解决可能出现的竞争条件和死锁问题。
(二)内存管理实验1、内存分配与回收实现不同的内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法。
观察在不同的内存请求序列下,内存的分配和回收情况,并分析算法的性能和优缺点。
2、虚拟内存管理研究虚拟内存的工作原理,通过设置页面大小、页表结构等参数,观察页面的换入换出过程,以及对系统性能的影响。
(三)文件系统实验1、文件操作实现文件的创建、打开、读取、写入、关闭等基本操作。
观察文件在磁盘上的存储方式和文件系统的目录结构。
2、文件系统性能优化研究文件系统的缓存机制、磁盘调度算法等,通过对大量文件的读写操作,评估不同优化策略对文件系统性能的提升效果。
四、实验步骤(一)进程管理实验步骤1、进程创建与终止(1)使用 C/C++语言编写程序,调用系统函数创建新进程。
(2)在子进程中执行特定的任务,父进程等待子进程结束,并获取子进程的返回值。
(3)通过设置异常情况,模拟子进程的异常终止,观察父进程的处理方式。
2、进程同步与互斥(1)定义共享资源和相关的信号量或互斥锁。
(2)创建多个进程,模拟对共享资源的并发访问。
(3)在访问共享资源的关键代码段使用同步机制,确保进程之间的正确协作。
(4)观察并分析在不同的并发情况下,系统的运行结果和资源竞争情况。
linux课程设计报告一、课程目标知识目标:1. 理解Linux操作系统的基本概念,掌握其发展历程和特点;2. 学会使用Linux命令行进行基本操作,如文件管理、目录切换、文本编辑等;3. 了解Linux系统的文件权限和用户管理,能够进行简单的系统维护;4. 掌握Linux下软件的安装与配置方法。
技能目标:1. 培养学生熟练运用Linux命令行进行日常操作的能力;2. 培养学生解决Linux系统常见问题的能力;3. 培养学生独立完成Linux软件安装与配置的能力;4. 提高学生的实际操作能力和团队协作能力。
情感态度价值观目标:1. 激发学生对Linux操作系统的兴趣,培养其学习热情和主动性;2. 培养学生严谨、细致的学习态度,树立良好的信息安全意识;3. 增强学生的团队协作精神,培养其尊重他人、善于沟通的品格;4. 引导学生认识到开源软件的价值,培养其创新精神和共享意识。
课程性质:本课程为实践性较强的课程,以学生动手操作为主,结合理论讲解,培养学生实际应用能力。
学生特点:学生具备一定的计算机操作基础,对Linux操作系统有一定了解,但实践经验不足。
教学要求:注重理论与实践相结合,强调实际操作能力的培养,以学生为主体,教师为主导,充分调动学生的积极性与主动性。
通过本课程的学习,使学生能够掌握Linux操作系统的基本知识,具备实际应用能力。
在教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。
二、教学内容1. Linux操作系统概述- Linux发展历程- Linux系统特点- 常见Linux发行版介绍2. Linux命令行操作- 基本命令:ls、cd、pwd、mkdir、rm、cp、mv等- 文件和目录权限管理:chmod、chown、umask等- 文本处理命令:cat、grep、sort、uniq等- 压缩和解压缩命令:tar、gzip、bzip2等3. Linux系统管理- 用户和组管理:useradd、usermod、userdel、groupadd等- 软件包管理:rpm、yum、apt等- 系统启动与关闭:init、systemctl等- 网络配置:ifconfig、ip、route等4. Linux软件安装与配置- 源码编译安装:configure、make、make install- 包管理器安装:rpm、deb等- 常用软件安装与配置:Apache、MySQL、PHP等5. 实践操作与案例- 常见系统问题排查与解决- Linux下文件共享与权限设置- Linux下Web服务器搭建- Linux下数据库服务器搭建教学内容安排与进度:第1周:Linux操作系统概述第2周:Linux命令行操作第3周:Linux系统管理第4周:Linux软件安装与配置第5周:实践操作与案例本教学内容根据课程目标,结合教材章节进行选择和组织,确保内容的科学性和系统性。
目录一.课程设计目的及要求 (1)二.相关知识 (2)三题目分析 (3)四.概要设计 (4)五.代码及流程 (5)六.运行结果 (20)七.设计心得 (23)八.参考文献 (24)一.课程设计目的及要求深入了解文件管理系统,初步掌握文件管理系统的实现方法。
用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
编写一程序,模拟一个简单的文件管理系统。
树型结构,目录下可以是目录,也可以是文件。
在此文件管理系统,可实现的操作有:改变目录:格式:cd <目录名>显示目录:格式:dir <目录名>创建目录:格式:md <目录名>删除目录:格式:rd <目录名>新建文件:格式:edit <文件名>删除文件:格式:del <文件名>退出文件系统:exit二.相关知识1.文件结构体struct FileNode{char filename[FILENAME_LEN];//文件名/目录名int isdir;//目录文件识别标志int i_nlink;//文件的链接数int adr;//文件的地址struct FileNode *parent, *child;//指向父亲的指针和指向左孩子的指针struct FileNode *sibling_prev, *sibling_next;//指向前一个兄弟的指针和指向//后一个兄弟的指针.};整个文件系统采用二叉树型存储结构,初始化文件树如下:图 2-1 初始目录树2.所使用函数及其功能int Main(); //主函数void Init();//初始化文件树int ParseCommand();//接受输入的命令并把其分解成操作名和路径文件名void ExecuteCommand();//执行命令,分别执行cd,edit,md,del,rd, dir,exit命令int cdComd(); //改变目录功能处理int editComd();//处理edit命令,即创建文件,只要创建表示文件的节点即可,内容及大小不考虑int mdComd(); //创建目录int delComd();//处理del命令,即删除指定文件,不存在是给出错误信息int dirComd();//处理dir命令,显示目录int rdComd(); //删除目录int FindFilename(char Para2[]);//查找文件名struct FileNode* CreateFileNode(char filename[],int isdir,int i_nlink);//创建结点int GetInput(char* buffer,unsigned int buffer_len);//获取输入3.所使用的变量struct FileNode *cp, *tp, *root;// *cp, *tp, *root是根目录节点char path[INPUT_LEN-COMMAND_LEN];//记录当前走过的路径charPara1[COMMAND_LEN],Para2[INPUT_LEN-COMMAND_LEN];//para1数组存储输入的命令,para2数组存储输入的文件名char filename[FILENAME_LEN],tmp;unsigned int i,j;三题目分析1.文件系统采用二叉树型存储结构,结点结构如下:struct FileNode{char filename[FILENAME_LEN];//文件名/目录名int isdir;//目录、文件的识别标志(0为文件,1为目录)int i_nlink;//文件的链接数//int adr;//文件的地址struct FileNode *parent, *child;//指向父亲的指针和指向左孩子的指针struct FileNode *sibling_prev, *sibling_next;//指向前一个兄弟的指针和指向后一个兄弟的指针.};2.目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开3.功能具体描述:改变目录:改变当前工作目录,目录不存在时给出出错信息显示目录:显示指定目录下或当前目录下所有文件和一级目录(选做:带/s参数的dir命令,显示所有子目录)创建目录:在指定路径或当前路径下创建指定目录。
重名时给出错信息。
删除目录:删除指定目录下所有文件和子目录。
要删目录不空时,要给出提示是否要删除。
创建文件:创建指定名字的文件,只要创建表示文件的节点即可,内容及大小不考虑。
删除文件:删除指定文件,不存在时给出出错信息。
退出文件系统:exit4、总体流程:初始化文件目录;输出提示符,等待接受命令,分析键入的命令;对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止。
四.概要设计1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个简单的单用户文件系统。
2.文件存储空间的分配采用显式链接分配。
为了实现创建和删除文件必须要有一棵初始的文件树存在,以便在文件树的根节点下实现创建和删除文件。
3. 数据结构与树结构。
数据结构是计算机存储、组织数据的方式。
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。
树中每个分叉点称为结点,起始结点称为树根,任意两个结点间的连接关系称为树枝,结点下面不再有分枝称为树叶。
结点的前趋结点称为该结点的"双亲",结点的后趋结点称为该结点的"孩子",同一结点的"孩子"之间互称"兄弟"。
4.文件目录结构采用多级目录结构。
为了简单起见,可以使用文件结构体,结构体内容包括:文件名,文件目录识别标示,文件链接数,以及他的左孩子右孩子左兄弟右兄弟指5. 要有分解函数对输入的命令进行分解。
以识别那部分是哪部分是命令,哪部分是路径和文件名。
6. 最后要有执行函数。
来执行输入的创建文件命令。
五.代码及流程图5-1 主函数流程图2)edit()创建文件函数流程图图5-2 创建文件函数流程图图5-3 删除函数流程图4)ParseCommand()分解命令函数流程图开始检查命令格式获取文件名不存在该文件 删除的是目录 由用户共享该报错提示处理删除的是第一个孩子情处理删除的不是第一个孩子结束图5-4 分解命令函数流程图5)改变目录函数rdComd()图 5-5 改变目录函数流程图#include <stdio.h>#include <iostream>#include <string.h>#include <ctype.h>#include <stdlib.h>#define FILENAME_LEN 21#define INPUT_LEN 81#define COMMAND_LEN 11using namespace std;void Init();//初始化文件树int ParseCommand();//接受输入的命令并把其分解成操作名和路径文件名void ExecuteCommand();//执行命令int cdComd();//处理cd命令int editComd();//处理edit命令int delComd();//处理del命令int dirComd();//处理dir命令int mdComd();//处理md命令int rdComd();//处理rd命令int FindPath(char *ph);//寻找参数ph所指向的路径int FindFilename(char Para2[]);//从参数Para2中找到要建立或删除的文件、目录名,并把指针只想其父亲结点struct FileNode* CreateFileNode(char filename[],int isdir,int i_nlink);//创建结点int GetInput(char* buffer,unsigned int buffer_len);//获取输入int CheckCommand();//命令检查int GetDir(int begin,char *path,char *curDir);//获取路径struct FileNode *cp, *tp, *root;char path[INPUT_LEN-COMMAND_LEN];//记录当前走过的路径char Para1[COMMAND_LEN],Para2[INPUT_LEN-COMMAND_LEN];char curpath[INPUT_LEN-COMMAND_LEN],tmppath[INPUT_LEN-COMMAND_LEN];char filename[FILENAME_LEN],tmp;unsigned int i,j;//int i,j;struct FileNode //结点结构{c har filename[FILENAME_LEN];//文件名/目录名i nt isdir;//目录文件识别标志i nt i_nlink;//文件的链接数s truct FileNode *parent, *child;//指向父亲的指针和指向左孩子的指针s truct FileNode *sibling_prev, *sibling_next;//指向前一个兄弟的指针和指向后一个兄弟的指针.};struct FileNode* CreateFileNode(char filename[],int isdir,int i_nlink) {struct FileNode* node=(struct FileNode*)malloc(sizeof(struct FileNode));//申请结点空间//相应内容赋初值strcpy(node->filename,filename);n ode->isdir=isdir;n ode->i_nlink=i_nlink;n ode->parent=NULL;n ode->child=NULL;n ode->sibling_prev=NULL;n ode->sibling_next=NULL;return node;}//初始化文件树void Init() {s truct FileNode *binNode,*usrNode,*unixNode,*etcNode,*libNode,*userNode,*binNode2,*liuNode,*sunNode,*ftiNode;s trcpy(path,"/"); //根目录写入当前路径//创建文件树的结点b inNode=CreateFileNode("bin",1,0);u srNode=CreateFileNode("usr",1,0);u nixNode=CreateFileNode("unix",0,0);e tcNode=CreateFileNode("etc",1,0);l ibNode=CreateFileNode("lib",1,0);u serNode=CreateFileNode("user",1,0);b inNode2=CreateFileNode("bin",1,0);l iuNode=CreateFileNode("liu",1,0);s unNode=CreateFileNode("sun",1,0);f tiNode=CreateFileNode("fti",1,0);c p=tp=root=CreateFileNode("/",1,0);//结点相应内容赋值r oot->parent=NULL;r oot->child=binNode;r oot->sibling_prev=root->sibling_next=NULL;b inNode->parent=root;b inNode->child=NULL;b inNode->sibling_prev=NULL;b inNode->sibling_next=usrNode;u srNode->parent=NULL;u srNode->child=libNode;u srNode->sibling_prev=binNode;u srNode->sibling_next=unixNode;u nixNode->parent=NULL;u nixNode->child=NULL;u nixNode->sibling_prev=usrNode;u nixNode->sibling_next=etcNode;e tcNode->parent=NULL;e tcNode->child=NULL;e tcNode->sibling_prev=unixNode;e tcNode->sibling_next=NULL;l ibNode->parent=usrNode;l ibNode->child=liuNode;l ibNode->sibling_prev=NULL;l ibNode->sibling_next=userNode;u serNode->parent=NULL;u serNode->child=NULL;u serNode->sibling_prev=libNode;u serNode->sibling_next=binNode2;b inNode2->parent=NULL;b inNode2->child=NULL;b inNode2->sibling_prev=userNode;b inNode2->sibling_next=NULL;l iuNode->parent=libNode;l iuNode->child=NULL;l iuNode->sibling_prev=NULL;l iuNode->sibling_next=sunNode;s unNode->parent=NULL;s unNode->child=NULL;s unNode->sibling_prev=liuNode;s unNode->sibling_next=ftiNode;f tiNode->parent=NULL;f tiNode->child=NULL;f tiNode->sibling_prev=sunNode;f tiNode->sibling_next=NULL;}//获取文件或目录名,并把指针指向其父亲结点int FindFilename(char Para2[]) {i=strlen(Para2)-1;j=0;w hile(Para2[i]!='/'&& i>=0) {filename[j]=Para2[i];i--; j++;}f ilename[j]='\0';//获得逆序的文件或目录名,存入filename中i f(i<0) Para2[i+1]='\0';e lse Para2[i]='\0';j--;f or(i=0;i<strlen(filename)/2;i++,j--) { //filename逆转,获得正确的文件或目录名tmp=filename[i];filename[i]=filename[j];filename[j]=tmp;}i f(strlen(Para2)>0) { //查找路径int sign=FindPath(Para2);if(sign==0)return 0;}r eturn 1;}//缓冲区安全输入子函数//如果输入超过buffer_len,则截取前buffer_len-1长度的输入,//buffer_len处字符用'/0'代替int GetInput(char* buffer,unsigned int buffer_len) {u nsigned int count=0;while(count<buffer_len) {if((buffer[count]=getchar())==10) {buffer[count]='\0';return count;}count++;}w hile(getchar()!=10);b uffer[buffer_len-1]='\0';r eturn -1;}//改变目录函数int cdComd() {if(!CheckCommand()) //命令检查return 0;i f(strcmp(Para2,"..")==0) { //对cd..命令的处理int i;while(cp->sibling_prev)cp=cp->sibling_prev;if(cp->parent){ cp=cp->parent; } //找到父亲结点else{ return 0; }//对当前路径进行相应处理i=strlen(path);while(path[i]!='/'&&i>0) i--;if(i!=0)path[i]='\0';elsepath[i+1]='\0';}e lse {FindPath(Para2);//查找路径}r eturn 1;}//创建目录函数int mdComd() {s truct FileNode * temp,*tp;t emp=CreateFileNode("",1,0);i nt sign;i f(strlen(Para2)==0) { //参数不能为空printf("\n命令格式有错误.\n");return 0;}i f(strlen(Para2)>20) { //长度检查printf("\n目录名过长\n");return 0;}//格式检查i f (!(isalpha(Para2[0])||Para2[0]=='_'||Para2[0]=='\0'||Para2[0]=='/')) {printf("目录名格式有错!\n");/* 目录首字母可以为'字母'或'数字'或'/'*/ return 0;}s ign=FindFilename(Para2); //获取目录名i f(sign==0)return 0;i f(cp->isdir!=1) { //如当前指针指向的是文件,则报错printf("you cannot edit a directory in under a file!\n");return 0;}t p=CreateFileNode(filename,1,0); //创建目录结点,并插入到指定目录下i f(cp->child==NULL) {tp->parent=cp;tp->child=NULL;cp->child=tp;tp->sibling_prev=NULL;tp->sibling_next=NULL;}e lse {temp=cp;//用temp找到新结点插入处temp=temp->child;while(temp->sibling_next ) { //find the last sibing nodetemp=temp->sibling_next;if(strcmp(temp->filename,filename)==0&&temp->isdir==1) {printf("此目录名已存在\n");//重名报错return 0;}}//找到了最后一个结点t emp->sibling_next=tp;t p->parent=NULL;t p->child=NULL;t p->sibling_prev=temp;t p->sibling_next=NULL;}r eturn 1;}//删除目录函数int rdComd() {i nt sign;s truct FileNode *temp;c har cmd[2];if(!CheckCommand()) //命令检查return 0;s ign=FindFilename(Para2); //获取目录名i f(sign==0) return 0;i f(cp->child) { //用temp指向要删除的结点temp=cp->child;while(temp->sibling_next && (strcmp(temp->filename,filename)!=0 || temp->isdir!=1))temp=temp->sibling_next;if(strcmp(temp->filename,filename)!=0) {printf("不存在该目录!\n");return 0;}}e lse {printf("不存在该目录!\n");return 0;}i f(temp->isdir!=1) { //要删除的不能是文件printf("ERROR!该命令只能删除目录,不可删除文件!\n");return 0;}i f(temp->child) { //如仍有用户使用该目录,则不能删除printf("\n该目录不为空,您确定要删除吗?Y/N!\n");GetInput(cmd,2);if(strcmp(cmd,"n")==0||strcmp(cmd,"N")==0)return 0;}//删除工作if(temp->parent==NULL) { //不是第一个孩子temp->sibling_prev->sibling_next=temp->sibling_next;if(temp->sibling_next)//处理是最后一个兄弟的情况temp->sibling_next->sibling_prev=temp->sibling_prev;temp->sibling_prev=temp->sibling_next=NULL;}//ife lse { //第一个孩子if(temp->sibling_next)//处理是最后一个兄弟的情况temp->sibling_next->parent=temp->parent;temp->parent->child=temp->sibling_next;}f ree(temp);r eturn 1;}//显示目录子函数int dirComd() {i f(strlen(Para2)>0) {int sign=FindPath(Para2); //查找路径if(sign==0) { return 0; }else{ printf("\n%s>", path); }}i f(cp!=root)printf(" <DIR> %s\n","..");i f(cp->child==NULL) //指定目录为空{return 0; }t p=cp;t p=tp->child; //指定目录不为空,显示其所有子目录及文件名w hile(tp) {if(tp->isdir)printf(" <DIR> %s\n",tp->filename);elseprintf(" <FILE> %s\n",tp->filename);tp=tp->sibling_next;}r eturn 0;}//创建文件函数int editComd() {s truct FileNode * temp=CreateFileNode("",0,0);i nt sign;s truct FileNode *tp;i f(strlen(Para2)==0) { //路径不能为空printf("\n命令格式有错误.\n");return 0;}i f(strlen(Para2)>20) { //长度检查printf("\n文件名过长\n");return 0;}//格式检查i f (!(isalpha(Para2[0])||Para2[0]=='_'||Para2[0]=='\0'||Para2[0]=='/')) {printf("文件名格式有错!\n");/* 文件首字母可以为'字母'或'数字'或'_'或'/'或'回车'*/return 0;}s ign=FindFilename(Para2);//获取文件名i f(sign==0)return 0;i f(cp->isdir!=1) { //如当前指针指向的是文件,则报错printf("you cannot edit a file in under a file!\n");return 0;}//创建文件结点,并插入到指定目录下t p=CreateFileNode("",1,0);s trcpy(tp->filename,filename);t p->isdir=0;t p->i_nlink=0;i f(cp->child==NULL) {tp->parent=cp;tp->child=NULL;cp->child=tp;tp->sibling_prev=NULL;tp->sibling_next=NULL;}e lse {temp=cp;temp=temp->child;//用temp找到新结点插入处while(temp->sibling_next ) { //find the last sibing nodetemp=temp->sibling_next;if(strcmp(temp->filename,filename)==0&&temp->isdir==0) {printf("此文件名已存在,请重新输入\n"); //重名报错return 0;}}//找到了最后一个结点t emp->sibling_next=tp;t p->parent=NULL;t p->child=NULL;t p->sibling_prev=temp;t p->sibling_next=NULL;}r eturn 1;}//删除文件子函数int delComd() {i nt sign;s truct FileNode *temp;i f(strlen(Para2)==0) { //参数不能为空printf("\n命令格式有错误.\n");return 0;}s ign=FindFilename(Para2); //获取文件名i f(sign==0) return 0;i f(cp->child) { //用temp指向要删除的结点temp=cp->child;while(temp->sibling_next&&(strcmp(temp->filename,filename)!=0||temp->isdir!=0)) temp=temp->sibling_next;if(strcmp(temp->filename,filename)!=0) {printf("不存在该文件!\n");return 0;}}e lse {printf("不存在该文件!\n");return 0;}i f(temp->isdir!=0) { //要删除的不能是目录printf("ERROR!该命令只能删除文件,不可删除目录!\n");return 0;}i f(temp->i_nlink!=0) { //如仍有用户使用该文件,则不能删除printf("还有用户共享了该文件,不能删除!\n");return 0;}//删除工作if(temp->parent==NULL) { //不是第一个孩子temp->sibling_prev->sibling_next=temp->sibling_next;if(temp->sibling_next)//处理是最后一个兄弟的情况temp->sibling_next->sibling_prev=temp->sibling_prev;temp->sibling_prev=temp->sibling_next=NULL;}e lse { //第一个孩子if(temp->sibling_next)//处理是最后一个兄弟的情况temp->sibling_next->parent=temp->parent;temp->parent->child=temp->sibling_next;}f ree(temp);r eturn 1;}//获取当前目录名子函数int GetDir(int begin,char *path,char *curDir) {i nt i=0;i nt len=strlen(path);w hile(!((path[begin]=='\\')||(path[begin]=='/'))&&begin<len) { curDir[i++]=path[begin++]; }c urDir[i]='\0';r eturn begin+1;}//查找路径函数int FindPath(char *ph) {s truct FileNode *temp; //struct FileNode *tp,*temp;c har oldpath[INPUT_LEN-COMMAND_LEN];u nsigned int i=0; //int i=0i nt sign=1;i f(strcmp(ph,"/")==0) { //ph是根目录cp=root;strcpy(path,"/");return 1;}t emp=cp;s trcpy(oldpath,path);//保留原路径和指针i f(ph[0]=='/') { //指针指向根目录的左孩子cp=root->child;i++; //滤过'/'strcpy(path,"/");}e lse {if(cp!=NULL&&cp!=root)strcat(path,"/");if(cp&&cp->child) {if(cp->isdir)cp=cp->child;//指针指向当前目录的左孩子else {printf("路径错误!\n");return 0;}}}w hile(i<=strlen(ph)&&cp) { //继续查找指定路径,如遇到文件则报错int j=0;if(ph[i]=='/'&&cp->child) {i++; //略过'/'if(cp->isdir)cp=cp->child; //继续查找下级目录else {printf("路径错误!\n");return 0;}strcat(path,"/");}while(ph[i]!='/'&&i<=strlen(ph)) { // curpath 记录当前要找的路径名curpath[j]=ph[i];i++; j++;}curpath[j]='\0';while((strcmp(cp->filename,curpath)!=0||(cp->isdir!=1))&&cp->sibling_next!=NULL) { cp=cp->sibling_next; }if(strcmp(cp->filename,curpath)==0) {if(cp->isdir==0) {strcpy(path,oldpath);cp=temp;printf("是文件不是目录.\n");return 0;}strcat(path,cp->filename);}if(strcmp(cp->filename,curpath)!=0||cp==NULL) {strcpy(path,oldpath);cp=temp;printf("输入路径错误\n");return 0;}}r eturn 1;}//命令检查函数int CheckCommand() {i f(strlen(Para2)==0) {printf("命令语法不正确.\n");return 0;}r eturn 1;}//分解命令子函数int ParseCommand() {c har Inputs[INPUT_LEN];i nt i=0,j=0,ch;u nsigned int k=0;p rintf("%s>",path);i f(GetInput(Inputs,INPUT_LEN)==-1) { //获取输入printf("输入行太长.\n");return 0;}P ara1[0]=Para2[0]='\0';//获取参数Para1,即操作名w hile(Inputs[i]!=' '&&Inputs[i]!='\0'&&i<COMMAND_LEN-1) { Para1[i]=Inputs[i];i++;}P ara1[i]='\0';i f(i==(COMMAND_LEN-1)) return 1; //输入命令太长i f(Inputs[i]!='\0') { //获取参数2,即路径文件名while(Inputs[i]==' '&&i<INPUT_LEN-1) i++; j=0;while(Inputs[i]!='\0'&&i<INPUT_LEN-1) {Para2[j]=Inputs[i];i++; j++;}Para2[j]='\0';}f or(k=0;k<strlen(Para1);k++) { //将操作名全部转换成小写字母ch=tolower((int)Para1[k]);Para1[k]=ch;}r eturn 1;}//执行命令函数void ExecuteCommand() {i nt sign;//根据参数Para1调用相应的功能处理模块if(strcmp(Para1,"cd")==0)sign=cdComd(); //cd命令else if(strcmp(Para1,"edit")==0)sign=editComd(); //edit命令else if(strcmp(Para1,"md")==0)sign=mdComd(); //e lse if(strcmp(Para1,"del")==0)sign=delComd(); //del命令e lse if(strcmp(Para1,"rd")==0)sign=rdComd();e lse if(strcmp(Para1,"dir")==0)sign=dirComd(); //dir命令e lse if(strcmp(Para1,"exit")==0)exit(0); //exit命令e lseprintf("命令错误,请重试\n"); //命令输入不正确,报错}int main() {I nit(); //初始化文件树w hile(1) {if(ParseCommand()) //分解命令ExecuteCommand(); //执行命令}return 0;}六.运行结果1.显示根目录下所有文件和目录图 6-1 当前根目录下目录和文件2.创建目录和文件图 6-2创建目录和文件3.删除目录和文件图 6-3 删除目录和文件4.创建文件重名情况图 6-4 创建文件重名的情况5.改变目录图 6-5 改变目录6.退出系统图 6-6 退出文件系统七.设计心得经过几周的时间,课程设计终于完成了,他锻炼了我查阅资料,进行方案构思的能力。