《操作系统实验》指导书
type命令增加了输出重定向功能后,共有3种命令形式(不考虑缺省文件名1的情况时)。 2. dir命令的输出重定向形式
命令形式1:dir [<目录名>] [|<属性符>] > <文件名> 命令功能:将原先应该显示的指定目录中指定属性的文件名和子目录名等内容,保存到文件名指定的文件中。文件名指定文件的原先内容被删除。 命令形式2:dir [<目录名>] [|<属性符>] >> <文件名> 命令功能:将原先应该显示的指定目录中指定属性的文件名和子目录名等内容,保存到文件名指定的文件中。文件名指定文件的原先内容不删除,新内容接到原先内容尾部。
具体地讲,dir命令在原有的4种形式的基础上,增加了输出重定向功能后,增加了8种新的命令形式(这样,dir共有12种命令形式),以下列出8种新的命令形式:
① dir > <文件名> ——将原先应该显示的当前目录中普通属性的文件及第一级子目录名保存到“文件名”指定的文件中。若指定文件已存在,则原内容删除。
② dir <目录名> > <文件名>——将原先应该显示的指定的目录中普通属性的文件及第一级子目录名保存到“文件名”指定的文件中。若指定文件已存在,则原内容删除。 ③ dir |<属性> > <文件名> ——将原先应该显示的当前目录中指定属性的文件及第一级子目录名保存到“文件名”指定的文件中。若指定文件已存在,则原内容删除。
④ dir <目录名> |<属性> > <文件名> ——将原先应该显示的“目录名”指定的目录中指定属性的文件及第一级子目录名保存到“文件名”指定的文件中。若指定文件已存在,则原内容删除。
⑤ dir >> <文件名> ——将原先应该显示的当前目录中普通属性的文件及第一级子目录名保存到“文件名”指定的文件中。若指定文件已存在,则新内容接到原内容的尾部。 ⑥ dir <目录名> >> <文件名> ——将原先应该显示的“目录名”指定的目录中普通属性的文件及第一级子目录名保存到“文件名”指定的文件中。若指定文件已存在,则新内容接到原内容的尾部。
⑦ dir |<属性> >> <文件名> ——将原先应该显示的当前目录中指定属性的文件及第一级子目录名保存到“文件名”指定的文件中。若指定文件已存在,则新内容接到原内容的尾部。
⑧ dir <目录名> |<属性> >> <文件名> ——将原先应该显示的“目录名”指定的目录中指定属性的文件及第一级子目录名保存到“文件名”指定的文件中。若指定文件已存在,则新内容接到原内容的尾部。 【建议】为方便编成,可以利用“字符串流”的方法,先将要显示的内容,保存到字符数组中,
然后再根据要求决定将该字符数组显示还是存盘。
4.10 修改del、copy等命令,使其可以使用统配符 *(选做内容)
修改某些命令,使其可以使用统配符“*”。例如: del * ——删除当前目录中的所有文件
attrib * ——显示当前目录中所有文件和子目录的属性
copy * <目标目录> ——将当前目录中的所有文件复制到目标目录中(同名复制)
4.11 修改copy命令,增加合并复制功能(选做内容)
命令形式:copy <文件名1>+<文件名2> [<文件名3>]
命令功能:文件1和文件2合并,复制到文件3中,其中文件2接到文件1的尾部(文件1、文件2不变)。若文件名3缺省,则目标文件与文件1同名。若文件1、文件2不存在,则报错。若文件3有重名冲突,则询问用户决定是否覆盖。应用举例(假设当前目录是/usr): (1) copy user/boy+test bin
23
《操作系统实验》指导书
上述命令将当前目录中的文件test,连接到当前目录中的user子目录中文件boy尾部,复制到当前目录的文件bin中,文件boy和test内容不变。
??若bin是目录名,则目标文件复制到bin子目录中,文件名为boy。若bin中已经存在文件
boy,则询问是否覆盖它;若bin中的boy仍是子目录,则报错;
??若当前目录中已经存在文件bin,则询问是否覆盖它;若/usr/user/boy或/usr/test不
?存在,则报错。 (2) copy user/boy+test
上述命令将当前目录中的文件test,连接到当前目录中的user子目录中文件boy尾部,复制到当前目录中,文件名为boy。
??若当前目录中已存在文件boy,则询问是否覆盖它;
??若当前目录中存在boy子目录,则目标文件复制到/usr/boy中,文件名为boy;
(3) copy boy+bin/test 该命令将当前目录中bin子目录中的文件test,连接到当前目录中的文件boy尾部,连接后的内容复制到当前目录的文件boy中(因要改变boy的内容,故在复制时要询问用户是否覆盖boy)。
4.12 修改程序,实现多磁盘文件系统(选做内容)
参考程序中只有一个磁盘(设定为C盘),修改程序,实现多磁盘系统(例如有C、D等磁盘)。多磁盘时,每个磁盘有一个FAT表,每个磁盘有一个当前目录,每个磁盘有一个根目录,整个系统有一个当前磁盘。这种系统应增加选择当前磁盘的命令,例如命令: D:
该命令的功能是:选择D盘作为当前盘。
另外,这种系统的路径名开头可有盘符。例如:D:/doc/test,代表D:盘根目录下doc子目录中的文件test。
【修改提示】假设磁盘个数为2。文件分配表FAT可改为二维数组FAT[2][K](磁盘块数为K);模拟磁盘可用三维数组Disk[2][K][SIZE](K为磁盘块数,SIZE为磁盘块容量,例如,K=1000,SIZE=256)。当前目录用结构类数组curpath[2]记录。增设全局变量d_no,用于记录当前磁盘号(其值为0,表示当前磁盘为C:盘,其值为1,表示表示当前磁盘为D:盘)。其他修改不再赘述,例如必须修改路径分析处理函数FindPath()和ProcessPath()等等。 【注】功能较全的程序“OS实验.exe”中有三个磁盘(C:、D:和E:)。
4.13 修改磁盘块容量(选做内容)
将磁盘块容量SIZE由64改为256字节(这需要对程序中跟此有关的部分作相应的改动),磁盘块容量增大为256后,可将删除文件恢复表udtab存储到磁盘中。为此,需修改UnDel的结构,例如,UnDel的结构可修改如下:
struct UnDel //恢复被删除文件的数据结构(共128字节) {
char gpath[112]; //被删除文件的全路径名(不含文件名) char ufname[FILENAME_LEN]; //被删除文件名 char ufattr; //被删除文件属性 short ufaddr; //被删除文件的首块号
short fb; //存储被删除文件长度及块号的指针(首块号) };
每个盘块可以存放2个udtab表的表项。为方便计,udtab表的长度仍可限定为40,可在磁盘中开辟一个大小为20个磁盘块的连续存储空间存放udtab表。udtab表存储在连续的磁盘空间的优点是:可用数组的方法直接处理Disk中的udtab表。退出系统时,无需将udtab表存盘,启动系统时,无需读入udtab表。udtab的块号链的首块号记录在Disk[0]中。
24
《操作系统实验》指导书
4.14 修改undel命令(选做内容)
可考虑3种修改方案,每个同学可任选其中一种修改方案。 1. 删除文件恢复表udtab不用数组存储,而直接存储在磁盘空间
此方案应修改UnDel的数据结构,以便udtab在磁盘中存储。例如可用如下结构: struct UnDel //恢复被删除文件表的数据结构 {
char ufname[FILENAME_LEN]; //被删除文件名 char fattr; //被删除文件的属性
short gpath;//它所指的盘块链存储被删除文件的全路径名(不含文件名) short fb; //它所指的盘块链存储被删除文件的块号(含文件的首块号) };
这样处理,可使每个盘块存储4个表项。这种修改方式处理思路与参考程序相同,但因结构类型UnDel改变了,故del和undel命令的处理函数都要做相应修改。另外,系统启动时,不再需要从文件UdTab2008.dat读入udtab表的数据,退出系统时,也不再需要将udtab表存入文件UdTab2008.dat。
上述UnDel结构中gpath所指的盘块链最多2个盘块(本系统中,去掉文件名后,路径名不超过115字节)。fb所指的盘块链的盘块数视文件占用的盘块数而定,因盘块容量为64B,每个盘块可存放32个块号,故文件占用块数不超过32时,fb所指盘块链只有1个盘块,其余类推。 2. 修改undel命令的执行方式并增强其功能
(1) 参考程序中的undel命令,只恢复指定目录中被删除的文件,并不处理指定目录以外被删除文件的恢复问题,使用不太方便。修改程序,使undel处理所有被删除文件,命令格式改为:undel,即命令中不带“目录名”参数,命令的处理过程是:逐个显示udtab表中记录的被删除文件的信息,询问用户是否恢复它,肯定回答时恢复之(恢复操作过程与原先相似),否则不恢复。
(2) 参考程序中,当被删除文件原先的目录项被它用后,即使被删除文件原先占用的盘块没有被占用,也不能再恢复该文件,这是因为UnDel结构中没有包括文件长度等信息,若UnDel结构中包含FCB的全部信息,就可以做到即使被删除文件原先的目录项被占用,仍可以恢复该文件,只要该文件的磁盘块没有被占用。请按此思路修改程序,提高对被删除文件的恢复能力。
为了实现(2)的功能,建议可采用如下措施:
? 修改磁盘块容量为256字节; ? UnDel结构为:
struct UnDel //恢复被删除文件的数据结构(共128字节) {
char gpath[112]; //被删除文件的全路径名(不含文件名) char ufname[FILENAME_LEN]; //被删除文件名 char ufattr; //被删除文件属性 short ufaddr; //被删除文件的首块号
short fb; //存储被删除文件长度及块号的指针(首块号) };
其中fb所指盘块中第一个值为文件长度值。每个盘块可存储2个表项。
? udtab的表项数仍假定为40,在磁盘中开辟一个有20个盘块的连续空间,用来存储
udtab表。设这20个盘块的连续空间的首块号为b1,则udatb表可定义如下: UnDel *udtab=(UnDel*) Disk[b0];
25
《操作系统实验》指导书
这样,udtab实际上仍然是一个数组,对udtab表的操作,与参考程序一样(只是其表项的结构有所不同)。退出系统时,不再需要将udtab单独存盘,只需将模拟磁盘Disk[K][SIZE]存盘即可。 ? 修改undel等有关程序。 3. 采用类似于Windows的回收站方案
参考程序实现undel命令的思路是:删除文件将释放磁盘空间,但将它的有关目录项信息以及它占用的盘块号存储到udtab表中,恢复文件时,根据udtab表中文件原先占用的盘块号信息,恢复该文件。这是DOS等操作系统采用的方法。请修改undel的实施方案,采用类似于Windows的回收站方案,实现被删除文件恢复功能。回收站方案的基本思路是:被删除文件占用的磁盘空间并不释放,不过将它从它所在目录,“搬到”一个特殊文件夹——回收站中,当需要恢复它时,再将它从回收站“搬回”它原先所在目录。真不需要该文件时,将它从回收站清除(这时才真正释放磁盘空间)。解决方案之一是:在根目录中建立一个特殊的文件夹recycled (其属性为:只读、隐藏、系统),称recycled为回收站,其表项的数据结构仍采用前面介绍的FCB结构,但其中的成员变量Fsize,不用来存储文件长度,而用来存储一个盘块号,该盘块中存储被删除文件长度和文件的全路径名(不含文件名),这里的“全路径名”就是文件的原位置,还原文件时该信息是不可或缺的。 dir等命令处理recycled文件夹时,与普通文件夹略有不同(因其文件长度等信息要从Fsize号盘块中取出,不能直接获得)。rd命令应修改成不能删除文件夹recycled,copy, move, replace等命令也改成不能对文件夹recycled操作。功能较完整的程序“OS实验.exe”中可以演示udtab表恢复被删除文件,也可演示利用“回收站”还原被删除文件。
【注】采用回收站方案的系统,磁盘块容量应≥128字节,否则一个盘块可能存放不下文件
长度和文件的全路径名。程序“OS实验.exe”中的盘块容量是256字节,该程序实现了“回收站”功能。
4.15 修改read命令,允许不带文件名参数(选做内容)
修改read命令处理函数ReadComd(),使其可以使用如下命令形式:
(1) read——读当前操作文件,从读指针位置开始读到文件尾部(新增形式) (2) read <文件名>——读指定文件,从读指针位置开始读到文件尾部 (3) read <文件名> |pm——读指定文件,从指定位置m开始读到文件尾部 (4) read <文件名> |ln——读指定文件,从读指针位置开始读n个字节 (5) read <文件名> |pm |ln——读指定文件,从指定位置m开始读n个字节
(6) read |pm |ln——读当前操作文件,从指定位置m开始读n个字节(新增形式) (7) read |pm——读当前操作文件,从指定位置m开始读到文件尾部(新增形式) (8) read |ln——读当前操作文件,从读指针位置开始读n个字节(新增形式)
上述命令中,“|p”表示“位置”,“m”表示某个整数。“|L”表示“长度”,“n”也代表某个整数。(下同)
4.16 修改write命令,允许不带“文件名”参数(选做内容)
修改write命令处理函数WriteComd(),允许其命令中不带“文件名”参数。这样,除了参考程序中提供的以下5种命令形式:
write <文件名> ——在写指针当前所指位置写,写入内容代替原内容(改写方式) write <文件名> |pn——在文件开头第n个字节处写,改写方式
write <文件名> |ins——在写指针所指位置写,写入处开始的原内容后移(插入方式) write <文件名> |pn |ins——在文件开头第n个字节处写,插入方式 write <文件名> |app——在文件尾部写(添加方式)
26
《操作系统实验》指导书
又新增加如下5种不带文件名的命令形式:
write——在写指针当前所指位置写,写入内容代替原内容(代替方式或改写方式) write |pn——在文件开头第n个字节处写,改写方式
write |ins——在写指针所指位置写,写入处开始的原内容后移(插入方式) write |pn |ins——在文件开头第n个字节处写,插入方式 write |app——在文件尾部写(添加方式)
【思考】如何修改程序,使参数“insert”、“append”只要前3个字符对就可以,但多于3个
字符也行。例如:对于“insert”,输入ins、inse、inser、insert(不区分大小写)都可以,输入其它不行。
4.17 修改write命令,增加“删除”方式(选做内容)
除了插入、改写方式外,在3的基础上,还可以考虑增加“删除”方式,这样,又可增加如下命令形式:
write <文件名> |del——对指定文件,从写指针位置删除到文件末尾 write |del——对“当前操作文件”,从写指针位置删除到文件末尾
write <文件名> |lm |del——对指定文件,从写指针位置开始,删除m个字节 write |lm |del——对“当前操作文件”,从写指针位置开始,删除m个字节 write <文件名> |pn |del——对指定文件,从指定位置n处开始删除到文件末尾 write |pn |del——对“当前操作文件”,从指定位置n处开始删除到文件末尾 write <文件名> |pn |lm |del——对指定文件,从指定位置n处开始删除m个字节 write |pn |lm |del——对“当前操作文件”,从指定位置n处开始删除m个字节
【注】没有完成4.16的工作,也可以在write命令中增加“删除”功能,不过上述8条有关
write删除功能的命令,只有4条带文件名参数的命令可以使用。
五、模拟文件管理系统中操作命令使用说明
为使学生对模拟文件管理系统中的操作命令有一个比较清楚的总体了解,下面对本系统的各命令作较详细的介绍。命令中“[ ]”中为可选项。命令使用举例中,假定目录结构如图1所示,同时假定当前目录为user。 1. attrib命令
命令格式:attrib <文件名> [<属性>]
命令功能:设置或显示指定文件或目录的属性。属性参数缺省,则显示属性。若指定文件或目录不存在则报错。此命令对目录名同样适用。
参数“属性”的表达形式为“+/-属性符,属性符有R、H和S,分别表示“只读”、“隐藏”和“系统”属性,它们可以组合使用,且顺序不限。其中“+”表示增加指定的属性,“-”表示去掉指定的属性。 使用举例: attrib boy
上述命令显示当前目录中文件boy的属性,若文件boy不存在,则报错。 attrib ../mail
上述命令显示当前目录的父目录(即usr目录)中mail文件的属性。 attrib lin/box +r +h
上述命令将当前目录中lin子目录内box(文件或目录)的属性设置成只读且隐藏。 attrib boy -h
上述命令去掉当前目录中文件boy的“隐藏”属性。
27
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库操作系统原理实验指导书(6)在线全文阅读。
相关推荐: