操作系统原理实验指导书2012.doc_第1页
操作系统原理实验指导书2012.doc_第2页
操作系统原理实验指导书2012.doc_第3页
操作系统原理实验指导书2012.doc_第4页
操作系统原理实验指导书2012.doc_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

操作系统实验指导书计算机科学与技术专业适用操作系统原理实验指导书南京工业大学信息科学与工程学院2008年4月33目 录一、实验目的1二、实验要求与内容12.1 实验题目12.2 初始目录结构12.3 系统操作命令简介12.4 几点说明2三、设计方案33.1 采用FAT文件格式33.2 目录项(FCB)结构33.3 根目录43.4 主要函数43.5 用户已打开文件表(UOF)53.6 程序中有关变量的说明51. 当前目录curpath数据结构52. 删除文件恢复表udtab数据结构53. 全局变量ffbp和Udelp54. 全局数组comd5PATH_LEN65. 全局数组temppathPATH_LEN63.7 主要函数的流程图61. 主函数main()的流程图62. create命令流程图63. cd命令流程图74. del命令流程图85. dir命令流程图86. md命令流程图97. rd命令流程图98. open命令流程图109. close命令流程图1010. write命令流程图1111. read命令流程图1212. copy命令流程图1213. ren命令流程图1414. attrib命令流程图1415. undel命令程序流程图1516. FindPath( )函数程序流程图1517. FindFCB( )函数程序流程图1518. ProcessPath( )函数程序流程图17四、实验任务184.1 修改md命令184.2 修改Help命令或命令行预处理程序181. 修改help命令的显示方式和显示内容182. 修改命令行预处理程序184.3 新增fc命令,实现两个文件的比较184.4 新增replace命令,实现文件取代184.5 新增move命令,实现文件“搬家”及子目录改名194.6 新增batch命令,实现批处理194.7 修改close、type等命令,允许不带文件名参数214.8 完善copy命令221. 改正某些缺陷222. 允许覆盖同名文件(选做内容)224.9 增加输出重定向功能(选做内容)221. type命令的输出重定向形式222. dir命令的输出重定向形式234.10 修改del、copy等命令,使其可以使用统配符 *(选做内容)234.11 修改copy命令,增加合并复制功能(选做内容)234.12 修改程序,实现多磁盘文件系统(选做内容)244.13 修改磁盘块容量(选做内容)244.14 修改undel命令(选做内容)251. 删除文件恢复表udtab不用数组存储,而直接存储在磁盘空间252. 修改undel命令的执行方式并增强其功能253. 采用类似于Windows的回收站方案264.15 修改read命令,允许不带文件名参数(选做内容)264.16 修改write命令,允许不带“文件名”参数(选做内容)264.17 修改write命令,增加“删除”方式(选做内容)27五、模拟文件管理系统中操作命令使用说明27六、学生应提交的实验材料336.1 实验报告336.2 源程序清单及其可执行文件336.3 程序测试、运行的结果33操作系统原理实验指导书一、实验目的理解操作系统文件系统的某些工作原理,学习文件操作命令的设计方法。通过实验,使学生加深对操作系统文件系统某些问题的理解,归纳学习方法和思考方法,做到理论联系实际。培养学生分析问题、解决问题的能力,提高学生软件设计能力和逻辑思维能力。二、实验要求与内容2.1 实验题目模拟文件管理系统的设计设计实现一个简单的模拟文件管理系统,包括目录文件、普通文件,以及一些文件操作命令和目录操作命令(例如可以模仿DOS的有关命令)。具体要求如下列2.2和2.3。2.2 初始目录结构程序初始化时构造如图1所示的目录结构。binusrdevuserlibbinlisunmaauto图1 初始目录树目录文件无框 普通文件【图例说明】根目录图中auto是(普通)文件(初始化时假设是空文件),其余都是子目录(目录文件)。2.3 系统操作命令简介在模拟文件管理系统中,要求可以实现如下操作:n 改变当前目录:cd 。当前目录(工作目录)转移到指定目录下。指定目录不存在时,给出错误信息。若命令中无目录名,则显示当前目录路径。n 创建文件:create 。创建一个指定名字的新文件,即在目录中增加一目录项,不考虑文件的内容。对于重名文件给出错误信息。n 删除文件:del 。删除指定的文件,即清除其目录项和回收其所占用磁盘空间。对于只读文件,删除前应询问用户,得到同意后方能删除。当指定文件正在使用时,显示“文件正在使用,不能删除”的信息,当指定文件不存在时给出错误信息。 n 显示目录:dir 。显示“目录名”指定的目录中文件名和第一级子目录名。若指定目录不存在,则给出错误信息。n 创建目录:md 。在指定路径下创建指定目录,若没有指定路径,则在当前目录下创建指定目录。对于重名目录给出错误信息。n 删除目录:rd 目录名。若指定目录为空,则删除之,否则,给出“非空目录不能删除”的提示。不能删除当前目录。n 打开文件:open 。若指定文件存在且尚未打开,则打开之,并在用户打开文件表(UOF)中登记该文件的有关信息。若指定文件已经打开,则显示“文件已打开”的信息;若指定文件不存在,则给出错误信息。只读文件打开后只能读不能写。n 写文件:write insert。在文件的指定位置处写入新内容。n 读文件:read 。从已打开文件中读指定内容并显示。n 关闭文件:close 。若指定文件已打开,则关闭之,即从UOF中删除该文件对应的表项。若文件未打开或文件不存在,分别给出有关信息。n 显示文件内容:type 。显示指定文件的内容。若指定文件不存在,则给出错误信息。n 复制文件:copy 。命令功能:为目标文件建立目录项,分配新的盘块,并将源文件的内容复制到目标文件中。n 文件改名:ren 。将指定文件的名字改为“新文件名”。若原文件不存在,给出错误信息。若原文件存在,但正在使用,也不能改名,同样显示出错信息。应检查新文件名是否符合命名规则以及是否存在重名问题。n 显示、修改文件或目录属性:attrib 。若命令中无“文件属性”参数,则显示指定文件的属性;若命令中有“文件属性”参数,则修改指定文件的属性。此命令对目录名同样适用。2.4 几点说明n 命令中的目录名和文件名可以统称为路径名,支持绝对路径(又称全路径)和相对路径;n 路径名是由目录结构中各级目录文件名和普通文件名(必定是最后一个名)用分隔符“/”连接而成的字符串组成。其中以字符“/”开始的路径名是绝对路径,表示从根目录开始;不是以字符“/”开始的路径名是相对路径,表示从当前目录开始。当前目录又称工作目录。n 本系统规定,名字(文件名或目录名)的命名规则如下:(1) 名字长度不能超过FILENAME_LEN-1个字节,即10个字符(符号常数FILENAME_LEN为11)。允许输入的名字超过10个字符,但只有前10个字符有效;(2) 名字一般由字母(区分大小写)、数字、下划线等组成,名字允许是汉字;(3) 名字不能包含以下16个字符之一: * + , / : ; ? | space(空格)(4) 名字中允许包含字符“.”,但它不能是名字的第一个字符,故“.”、“.abc”、“.”和“.abc”等等都是不合法的名字。“.”代表父目录是例外,但它并非由用户通过键盘输入的名字,故不需要符合名字的命名规则。n 本系统中,命令名(如dir)和命令参数中的有关关键字(如append或app、insert或ins等)不区分大小写。文件名和目录名中的字母是区分大小写的。n 命令格式中,“”代表某个字符串 ,“ ”中内容为可选项。三、设计方案本系统提供的参考程序在C+环境中开发,下面介绍系统的设计方案。3.1 采用FAT文件格式文件在磁盘上的组织采用FAT文件格式,为了设计程序方便,本系统的FAT表用整型数组FATK表示(K为总盘块数,本系统中假定K=5000,即共有5000个盘块),而实际的操作系统,FAT表是存储在磁盘中的,当系统启动时装入内存。FAT0中存储空闲盘块数。磁盘空间用字符数组DiskKSIZE (其中SIZE为每个盘块的字节数,即盘块的容量)表示。本系统设定磁盘块容量为64。3.2 目录项(FCB)结构本模拟系统的文件目录项(FCB)结构如下:文件名属性首块号文件长度(11字节)(1字节)(2字节)(2字节)struct FCB/每个目录项16个字节char FileName11;/文件名最多10个字符且以0结尾char Fattrib;/文件属性short int Addr;/文件首块号short int Fsize;/文件长度;u 为简单,本系统不考虑文件扩展名,文件名为110个字符,以结尾标记0存储(实际操作系统目录项中文件名一般没有结尾标记),命令中输入的文件名若超过10个则截取前10个字符。u 文件属性为1个字节,其二进制位对应的属性如下图所示。D7D6D5D4D3D2D1D00001表示目录0/101表示系统0/11表示隐藏0/10/11表示只读u 文件的首块号Addr=0代表空文件(此时文件长度Fsize=0)。文件名(目录名)的第一个字符的ASCII码为0E5H或00H,代表空目录项。其中0E5H是目录项被删除后的标志,00H代表该目录项从未使用过。u 每个目录项占用16个字节,因系统中假设磁盘块大小SIZE=64,因此,每个盘块可存储4个目录项。u 除根目录外,每个目录中的第一个目录项存储父目录的FCB(该目录项的名字为“.”),其地址是父目录的首块号,它的作用是相当于指向父目录的指针,用于实现从该目录退回父目录。目录项“.”是在创建目录时,由系统自动建立的,它不能被rd命令删除。3.3 根目录本系统假设根目录存储在130号盘块中,即存储在Disk1Disk30的盘快中。因每个盘块可存储4个目录项,故本系统根目录中的文件目录项及子目录项最多共计120个。从31号盘块开始为文件区,用于存储文件及子目录。本系统初始化时,图1所示的目录树的磁盘分配情况如图2所示。根目录Disk1 bin,usr,auto,dev Disk31:. Disk33:. Disk32:.,user,lib,binDisk30 Disk35:. Disk36:.Disk34:.,li,sun,ma Disk37:. Disk38:. Disk39:.图2 初始目录树的磁盘空间分配指定目录3.4 主要函数系统参考程序的主要函数如下:main()主函数AttribComd()attrib命令处理函数CdComd()cd命令处理函数CloseComd()close命令处理函数CopyComd()copy命令处理函数CreateComd()Create命令处理函数DelComd()del命令处理函数DirComd()dir命令处理函数MdComd()md命令处理函数OpenComd()open命令处理函数RdComd()rd命令处理函数ReadComd()read命令处理函数RenComd()ren命令处理函数TypeComd()type命令处理函数UndelComd()undel命令处理函数WriteComd()write命令处理函数ParseCommand()分析、分解命令行ExecComd()执行命令FindPath()查找指定目录路径的首块号FindFCB()查找指定文件(或目录)的首块号ProcessPath()将路径名分离成目录路径与文件名两部分3.5 用户已打开文件表(UOF)设置一张“用户已打开文件表”(UOF),用于记录用户当前正在使用文件的情况。本系统允许用户最多同时打开或建立S个文件,故用户已打开文件表UOF共有S个登记栏。用户请求打开或建立一个文件时,相应的文件操作把有关该文件的信息登记到UOF中。UOF表项的结构如下:struct UOF/定义用户打开文件表的结构char fnamePATH_LEN;/文件全路径名char attr;/文件属性,1=只可读;0=可读写short int faddr;/文件的首块号short int fsize;/文件大小(字节数)FCB *fp;/指向该文件的目录项指针short int state;/状态:0=空表项;1=新建;2=打开short int readp;/读指针,指向某个要读的字符位置,0=空文件short int writep;/写读指针,指向某个要写读的字符位置;本程序中,用户打开文件表用数组UOF uofS表示,其中S=32,即最多允许同时打开32个文件。读指针和写指针用于指出对文件进行存取的当前位置。fp指向该UOF登记项对应的文件的目录项。系统启动时, UOF常驻内存,退出系统时,UOF不需要保存。3.6 程序中有关变量的说明1. 当前目录curpath数据结构struct CurPath short int fblock;/当前目录的首块号char cpathPATH_LEN;/当前目录路径字符串;当前目录用全局变量curpath存储:CurPath curpath;根目录的路径字符串cpath是“/”,首块号为1。2. 删除文件恢复表udtab数据结构struct UnDel /恢复被删除文件信息表的数据结构char gpathPATH_LEN;/被删除文件的全路径名(不含文件名)char ufnameFILENAME_LEN;/被删除文件名short ufaddr;/被删除文件名的首块号short fb;/存储被删除文件块号的第一个块号(链表头指针)/首块号也存于fb所指的盘块中;与实际系统不同,为简化程序设计,本系统的被删除文件恢复表用(全局变量)数组udtab存储,定义为:UnDel udtabDM;程序中DM值为40,即最多保存40个被删除文件的信息(若删除文件数超过40个时,总是保持最新的40个被删除文件信息)。一个被删除文件恢复后,其在udtab表中的信息将被删除。退出系统时该表可存于文件UdTab.dat中。3. 全局变量ffbp和Udelpshort Udelp; 它是udtab表的第一个空表项的下标,系统初始化时为0。当Udelp=DM时,表示表已满,需清除最早的表项(后续表项依次前移)。系统退出存盘时,其值保存到0号盘块Disk0中,以便下次启动系统使用。short ffbp; 它是分配盘块时FAT表的起始指针(下标),这样使得分配盘块类似于分区存储管理的“循环首次适应”分配算法,这有利于被删除文件的恢复。系统退出存盘时,其值也保存到0号盘块Disk0中。 4. 全局数组comd8PATH_LENchar comd8PATH_LEN;它在分析命令时使用,其中comd0存放命令字符串,comd1,.,comd7用于存放命令参数。5. 全局数组temppathPATH_LENchar temppathPATH_LEN; 用于临时存储文件的路径名(绝对路径名而非相对路径名)。例如,设当前目录为/usr,执行命令open user/boy时,系统将文件boy的全路径名(即绝对路径名) /usr/user/boy,存放在temppath中,在登记UOF表项时,再将temppath存储到表项的fname域中。其他一些命令处理过程中也会用到temppath。3.7 主要函数的流程图1. 主函数main()的流程图图3 主函数流程图开始初始化结束输入命令行调用函数ParseCommand( )分解命令行是是exit吗?否调用执行命令函数ExecComd( )执行输入的命令采用条件编译实现:初始化目录树、FAT、Disk、UOF等或者从文件读入FAT、Disk等数据要保存数据吗?保存相关数据是否主函数main()的流程图如图3所示。2. create命令流程图创建新文件的命令格式如下:create 命令中的“文件属性”规定了文件的使用权限,分为“只读”、“隐藏”、“系统”等,分别用“r”、“h”、“s”的形式表示,程序内部分别用1、2、4表示(参见3.2节的介绍),它们可以组合使用,例如“rh”表示“只读”且“隐藏”属性的文件,其属性值为3,又如“rhs”表示“只读”且“隐藏”且“系统”属性的文件,其属性值为7。若命令中无可选项“文件属性”,则创建的文件是属性值为0的普通文件,即不是只读文件,也不是隐藏文件,也不是系统文件。create命令中的“文件名”允许是绝对路径名或相对路径名,例如命令create /usr/user/boy表示在根目录的usr子目录中的user子目录中建立文件boy,该文件为普通文件。又如create bin/mail rh图4 “创建文件”流程图否是开 始查temppath中最后一目录该目录中有该文件?在该目录中找到空登记栏登记该文件名的目录项;在UOF中登记该文件,状态=建立,读指针=0(空文件),显示:同名文件 不能建立返回查找“文件名”中的路径,并将该路径存于temppath中。 该路径存在吗?否显示:路径错误是返回显示“文件创建成功”表示在当前目录中的bin子目录中建立文件mail,该文件为“只读”且“隐藏”属性的文件。执行create命令时,当路径不存在或有同名文件,则分别给出错误信息。create命令处理函数CreateComd()的简化流程图如图4所示。3. cd命令流程图命令形式:cd 。命令功能:改变当前目录,即把指定目录变为当前目录(工作目录)。指定目录不存在时,给出错误信息。若命令中无目录名,则显示当前目录路径名。cd命令的处理函数为CdComd(),其简单流程图如图5所示。开始将查找过程得到的全路径名以及指定目录的首块号保存到当前目录变量中返回是是否否图5 cd命令函数流程图显示错误信息是显示当前目录否命令格式正确吗?命令中有参数吗?指定路径正确吗?4. del命令流程图命令形式:开始命令格式正确吗?调用FindFCB( )查找指定文件指定文件存在吗?删除指定文件的目录项回收该文件占用的磁盘空间返回是是否否图6 del命令函数流程图显示相关的错误信息指定路径正确吗?是否调用ProcessPath( )查找指定路径文件正在使用吗?是否否开始命令格式正确吗?在指定目录中逐个查找目录项,显示文件或目录的名字,以及显示文件的长度或子目录标志。最后显示文件和目录的统计数以及文件的总字节数和磁盘剩余字节数。返回是否图7 dir命令函数流程图显示相关的错误信息指定路径正确吗?是否调用FindPath( )查找指定路径否del 。命令功能:删除指定的文件,即清除其目录项和回收其所占用磁盘空间。对于只读文件,删除前应询问用户,得到同意后方能删除。当指定文件正在使用时,显示“文件正在使用,不能删除”的信息,当指定文件不存在时给出错误信息。del命令的处理函数为DelComd(),其简单流程图如图6所示。5. dir命令流程图命令形式:dir 。命令功能:显示“目录名”指定的目录中文件名和第一级子目录名。若指定目录不存在,则给出错误信息。如果命令中没有指定目录名,则显示当前目录下的相应内容。若命令中无“属性”参数,则显示指定目录中“非隐藏”属性的全部文件名和第一级子目录名;若命令中有“属性”参数,则仅显示指定属性的文件名和目录名。属性参数的形式是“|属性符号”,其中属性符号有r、h和s三种(不区分大小写),分别表示“只读”、“隐藏”和“系统”三种属性,它们可以组合使用且次序不限。例如“|rh”,表示要求显示同时具有“只读”和“隐藏”属性的文件和目录名。dir命令显示文件名时,同时显示该文件长度;显示目录名时,同时显示“”的字样。命令使用举例:dir /usr |h 显示根目录下usr子目录中全部“隐藏”属性的文件名和子目录名dir . 显示当前目录的父目录中全部“非隐藏”属性的文件和子目录名(包括“只读”、“系统”属性的文件和目录名也显示)。dir命令的处理函数为DirComd(),其简单流程图如图7所示。6. md命令流程图开始命令格式正确吗?在指定目录中查找空目录项(若已无空目录项,则为其分配新的盘块),找到后为新目录登记目录项。为新目录分配1盘块,用于登记该目录的第一个目录项,即“.”目录项。返回是否图 8 md命令函数流程图显示相关的错误信息指定路径正确吗?是否新目录有重名吗?是否命令形式:md 。命令功能:在指定目录路径下创建指定子目录。若没有指定路径,则在当前目录下创建指定子目录。对于重名目录给出错误信息。md命令的处理函数为MdComd(),其简单流程图如图8所示。7. rd命令流程图命令形式:rd 。命令功能:删除子目录。若指定目录为空(仅有一个“.”目录项的目录为空目录),则删除之,否则,给出“非空目录不能删除”的提示。不能删除当前目录。rd命令的处理函数为RdComd(),其简单流程图如图9所示。开始命令格式正确吗?回收指定目录的磁盘空间,在其父目录中删除指定目录对应的目录项。返回是否图 9 rd命令函数流程图显示相关的错误信息是否是否指定路径正确吗?要删当前目录吗?指定目录空的吗?是否8. open命令流程图命令形式:open 。命令功能:打开文件。若指定文件存在且尚未打开,则打开之,并在用户打开文件表(UOF)中登记该文件的有关信息。若指定文件已经打开,则显示“文件已打开”的信息;若指定文件不存在,则给出错误信息。open命令的处理函数为OpenComd(),其简单流程图如图10所示。开始在UOF中登记指定文件的有关信息。显示文件打开成功。返回是是否图10 open命令函数流程图显示相关的错误信息是是否否是否命令格式正确吗?指定路径正确吗?指定文件存在吗?文件已打开了吗?UOF表已满了吗?否9. close命令流程图命令形式:close 。命令功能:关闭文件。若指定文件已打开,则关闭之,即从UOF中删除该文件对应的表项。若文件未打开或文件不存在,分别给出有关信息。close命令的处理函数为CloseComd(),其简单流程图如图11所示。开始指定文件的首块号和长度保存到其目录项中;删除指定文件在UOF中的登记项。显示文件关闭成功。返回是否图11 close命令函数流程图显示相关的错误信息是否命令格式正确吗?指定文件打开了?10. write命令流程图命令形式:write insert。命令功能:向文件中写入信息。命令中若无“位置”参数,则在写指针所指位置写入文件内容;若提供“位置”参数,则在对应位置写入内容。位置可以是整数n,是指在文件的第n个字节处开始写入(位置从1开始编号)。“位置”参数可以是“append”(前3个字符有效,不区分大小写),表示在文件尾部写入信息;参数“insert”(前3个字符有效,不区分大小写)表示新写入的内容插入到对应位置,对应位置开始的原内容后移。若无参数“insert”,写入内容代替文件原先的内容(改写方式)。写入内容中的“n”代表“回车”符。写入完毕调整文件长度和写指针值。若文件未打开或文件不存在,分别给出错误信息。本系统约定:刚打开的文件,其写指针指向文件末尾。目前参考程序的write命令只有“插入”和“改写”两种功能,尚未提供“删除”功能。write命令的处理函数为WriteComd(),其简单流程图如图12所示。开始是否否图12 write命令程序流程图是是否否是否命令中有文件名?指定文件已打开?是只读文件吗?参数只有文件名?第2参数是|app?是显示:“命令中无文件名”显示:“文件未打开。”显示:“只读文件不能写”从写指针位置写改写方式。从文件尾部写改写方式。第2参数是|ins?从写指针位置写,插入方式。是写入位置正确?显示“写入位置错误。”否否有第3参数吗?是第3参数是ins?是从写入位置写暂定为改写方式。显示“命令参数错误。”否从写入位置写,插入方式。返回返回等待用户输入写入的内容输入内容接到写入点是插入方式吗?写入点开始的原内容接到写入内容后边是否 11. read命令流程图命令形式:read 。命令功能:从已打开的文件中读文件内容并显示。若无“位置”参数,则从读指针所指位置开始读。若有“位置”参数,则从指定位置处开始读。位置m是指从文件开头第m个字节处读(m从1开始编号)。若无“字节数n”参数,则从指定位置读到文件末尾;若有“字节数n”参数,则从指定位置开始读n个字节。若文件未打开或文件不存在,分别给出错误信息。read命令的处理函数为ReadComd(),其简单流程图如图13所示。开始按命令要求读出信息并显示返回是否否图13 read命令程序流程图显示“命令中参数太多或太少”是是否否否是命令格式正确吗?文件已打开了吗?是空文件吗?命令只有1个参数?读位置正确吗?是显示“文件未打开或不存在。”显示“是空文件,不能读。”从读指针所指位置读到文件尾部显示“命令中读位置错误。”否是命令有第3参数?从读位置开始读到文件尾部否是读字节数n正确吗?显示“命令中读字节数错误。”从读位置开始读n个字节调整读指针12. copy命令流程图命令形式:copy 。命令功能:为目标文件建立目录项,分配新的盘块,并将源文件的内容复制到目标文件中。若目标文件与源文件所在的目录相同,则只能进行更名复制,此时目标文件名不能省;若目标文件与源文件所在的目录不同,则既可更名复制也可同名复制,同名复制时目标文件名可省。例如,命令copy mail email(1) 若当前目录中不存在email(目录或文件),则该命令将当前目录中的文件mail,复制成当前目录下的文件email;(2) 若当前目录下存在email,但email是子目录名,则将当前目录中的文件mail,复制到当前目录中的email子目录内,文件名为mail(同名复制);此时若email目录内已经存在名字为mail的文件或目录,则出现重名错误;(3) 若当前目录内存在email文件,则出现重名错误(并不询问是否覆盖);(4) 若当前目录内不存在源文件mail(或者虽然有mail,但它是子目录名),则也报错。【注】l 在同一目录中,各目录项不能重名(不管是文件名还是子目录名)l 上述(2)(3)是为了简化程序设计,真实系统一般与这种处理方式有区别,请参见实习任务的“完善copy命令”中的叙述。copy命令的处理函数为CopyComd(),其简单流程图如图14所示。开始为目标文件建立目录项,分配磁盘空间,复制源文件内容到新分配的磁盘空间。返回是否否图14 copy命令程序流程图显示“命令中参数太多或太少”是是否否否是命令格式正确吗?源文件存在吗?源文件已打开?命令只有1个参数?目标路径正确吗?是显示“源文件不存在。”显示“文件正在使用不能复制。”文件复制到当前目录,同名复制显示“路径名错误。”否是目标文件名正确?显示“目标文件名错误。”是否目标文件名冲突?显示“目标文件重名错误。”目标文件与子目录同名?源文件同名复制到该子目录中源文件更名复制到目标目录中是否子目录有源文件同名文件?是否13. ren命令流程图命令形式:ren 。功能:文件改名,即将指定文件的名字改为“新文件名”。若原文件不存在,给出错误信息。若原文件存在,但正在使用,也不能改名,同样显示出错信息。应检查新文件名是否符合命名规则以及新文件名是否有重名冲突。ren命令的处理函数为RenComd(),其简单流程图如图15所示。开始返回是否否图15 ren命令程序流程图显示“命令中参数太多或太少”是是否否命令格式正确吗?改名文件存在吗?文件已打开了吗?新文件名合法吗?是显示“要改名的文件不存在。”显示“文件正在使用不能改名。”在该文件的目录项中用新名字代替原名字显示“新文件名不合规则。”否是新文件名重名吗?显示“存在文件新文件重名。”14. attrib命令流程图命令形式:attrib 。功能:显示、修改文件或目录属性。若命令中无“文件属性”参数,则显示指定文件的属性;若命令中有“文件属性”参数,则修改指定文件的属性。“文件属性”的形式有“+r或+h或+s”和“-r或-h或-s”两种形式,前者为设置指定文件为“只读”或“隐藏”或“系统”属性,后者为去掉指定文件的“只读”或“隐藏”或“系统”属性。各属性可组合使用且顺序不限。例如:attrib user/boy +r +h上述命令的功能是设置当前目录下user子目录中的文件boy为只读、隐藏文件。又如attrib /usr/user/box -h -r -s上述命令的功能是取消根目录下usr子目录中user子目录中的box文件的“隐藏”、“只读”、“系统”属性。当命令中指定的文件已打开或不存在,不能修改其属性,给出错误信息;当命令中提供的参数错误,也显示出错信息。【注】本程序没有考虑属性的相关性和制约性。例如,DOS操作系统中,设置一个文件的“系统”属性时,必须先将该文件的属性设置成“只读”和“隐藏”后,才能设置它为“系统属性”,即设置属性有次序问题。本系统不受这些限制。attrib命令的处理函数为AttribComd(),其简单流程图如图16所示。开始返回是否否图16 attrib命令程序流程图显示“命令中参数太多或太少”是是否否命令格式正确吗?文件/目录存在吗?命令没有属性吗?命令指定的是文件?是显示“文件或目录不存在。”显示指定文件或目录的属性。按命令的属性给指定文件或目录设置属性否是该文件打开了吗?显示“文件正在使用,不能修改属性。”所给属性正确吗?否显示“命令中的属性参数错误。”是15. undel命令程序流程图命令形式:undel 。功能:恢复指定目录中被删除的文件。指定目录不存在,报错;命令中不指定目录,则对当前目录进行操作。若目录中无删除的文件,则显示“无文件可恢复”;若目录中有被删除的文件,逐个显示并询问用户,得到肯定回答后则开始恢复之,恢复过程中若发现该文件原先占用的盘块已作它用,则显示“不能恢复”信息;若发现恢复文件与现有文件重名,则请求用户输入一个新名字(也要检查是否发生重名冲突)。恢复成功与失败的文件在udtab中对应的表项都将被删除。【说明】udtab的表项是在删除文件时填写的。undel命令的处理函数为UndelComd(),其简单流程图如图17所示。16. FindPath( )函数程序流程图函数原型:int FindPath(char *pp,char attrib,int ffcb,FCB* &fcbp);功能:查找给定的路径(由参数pp指定),确定路径的正确性,并返回路径中最后一个名字(目录名)代表的目录的地址(首块号);对路径进行处理(去掉路径中的“.”),构成一个全路径名存于全局变量temppath中;当函数参数ffcb非零时,通过调用FindFCB( )函数,使得本函数成功返回时,FCB类引用参数fcbp带回指向路径最后一个目录的目录项的地址。其程序流程图如图18所示。17. FindFCB( )函数程序流程图函数原型:int FindFCB(char *Name,int s,char attrib,FCB* &fcbp);功能:从函数参数s指定的块开始,查找参数Name指定的名字(目录或文件名)且符合属性attrib的目录项。若找到,返回其首块号(非负整数Name是目录名时,返回正整数;Name是文件名时,返回非负整数:非空文件,返回正整数,空文件,返回0);若没有找到,返回负数-1。函数正确返回时,引用参数fcbp带回该目录项的地址。FindFCB()函数的程序流程图如图19所示。开始返回是否否图17 undel命令程序流程图显示“命令中参数太多”是否命令格式正确吗?命令无参数吗?指定目录存在吗?是处理当前目录中文件恢复问题。显示“命令中指定路径错误。”显示恢复文件个数。在要处理的目录中查找被删除的目录项,找到后询问用户是否恢复,得到肯定回答后恢复它。恢复过程中若发现该文件原先占用盘块已作它用,则显示“不能恢复”字样;若恢复文件存在重名冲突,则请求用户输入一个文件名,系统检查无重名冲突后,即执行恢复工作。然后处理下一个被删除文件,直到全部处理完毕为止。处理指定目录中文件恢复问题。开始返回否否图18 FindPath()函数流程图Temppath=/返回首块号s=1是pp=/?*pp=/?是s=curpath.fblocktemppathcurpath.cpaths=1pp+最终,s=Temppath中最后一个名字的首块号将pp所指路经的各项分离出来(去掉/),存于pathsj(j=0,.,n)中。逐个处理pathsj,将它们加到Temppath中,遇到某个pathsj=.,则去掉临时路经Temppath中最后一个名字。对每一个pathsj,调用FindFCB()函数,以确定其存在性,若存在,返回其首块号s说明:进入函数时pp指向路径名字符串开始结束否否图19 FindFCB( )函数流程图返回-1是s 0?找到了吗?是取下一个块号s=FATs在块s中查找名字为Name,属性为attrib的目录项说明:进入函数时Name指向需查找的名字, s=该名字所在子目录的首块号返回该目录项的首块号s,并由引用参数带回指向该目录项的指针值(地址)。属性符合吗?返回-1否是开始结束否否图20 ProcessPath( )函数流程图s=curpath.fblocktemppathcurpath.cpath是path是空串?path=/?是将path中最后一个名字保存到Name中path中去掉Name后,余下部分仍存于path显示“路径名错误”s=-1说明:进入函数时path指向需处理的路经名返回 ss 0?调用函数:s=FindPath(path , .)s=1(是根目录)temppath/是18. ProcessPath( )函数程序流程图函数原型:int ProcessPath(char* path,char* &Name,int k,int n,char attrib);功能:将参数path中最后一个名字(文件名或目录名)分离出来,并由引用参数Name带回;返回path中除掉Name后,最后一个目录的地址(首块号);必要时调用函数FindPath(),并通过全局变量temppath带回path(去掉Name后)的全路径名(绝对路径名)。ProcessPath()函数的程序流程图如图20所示。四、实验任务以下实验任务中,每个学生可在4.14.8中任选6项任务(浦计学生可任选4项)。4.94.17为“选做内容”,能力较强的学生可在完成上述必做题目基础上,选择几项“选做”任务并努力完成之。4.14.17中的各项功能,在“OS实验.exe”程序都已实现,同学们可运行该程序,观察各项功能的执行情况。4.1 修改md命令修改md命令,增加“属性”参数,用于创建指定属性的子目录。命令形式如下:md 属性包括R、H、S以及它们的组合(不区分大小写,顺序也不限)。例如:md user rh其功能是在当前目录中创建具有“只读”和“隐藏”属性的子目录user。4.2 修改Help命令或命令行预处理程序对下面两项任务,每个学生可任选其中一项。1. 修改help命令的显示方式和显示内容修改HelpComd()函数,使之提供菜单式的较详细的帮助信息。例如可以先用菜单形式简单列出各命令名称,当用户选择某个命令的序号后,再比较详细地介绍该命令,包括命令的各种形式,每种形式的功能,以及某些举例说明等等。2. 修改命令行预处理程序修改命令行预处理函数ParseCommand( ),使以下命令行(命令与参数间无空格符)可以正确执行:cd/cd.dir/usrcopy/usr/boy mail即命令名称与后边的“/”或“.”之间不需要空格也能正确执行。【说明】参考程序已经可以处理类似于“cd/”的形式,但还不能处理“cd.”等形式。另外,若有输出重定向功能,“”、“”也允许不是用空格分隔符(即允许与其它参数连用)。例如:type/usr/boy/test4.3 新增fc命令,实现两个文件的比较命令形式:fc 命令功能:逐个字节比较指定的两个文件,若相同,显示“文件内容相同”字样;若不同,显示第一个不同字节的位置和各自的内容。若文件不存在则报错。4.4 新增replace命令,实现文件取代命令形式:replace 命令功能:以“文件名”指定的文件,取代“目录名”指定目录中的同名文件。请按以下要求设计replace命令的函数:l 若指定文件或被取代文件不存在,则报错;l 若被取代的是只读属性的文件时,应询问用户;l 具有隐藏和系统属性的文件不能被取代;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论