操作系统实习报告书.docx

上传人:b****8 文档编号:9141575 上传时间:2023-02-03 格式:DOCX 页数:31 大小:707.41KB
下载 相关 举报
操作系统实习报告书.docx_第1页
第1页 / 共31页
操作系统实习报告书.docx_第2页
第2页 / 共31页
操作系统实习报告书.docx_第3页
第3页 / 共31页
操作系统实习报告书.docx_第4页
第4页 / 共31页
操作系统实习报告书.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

操作系统实习报告书.docx

《操作系统实习报告书.docx》由会员分享,可在线阅读,更多相关《操作系统实习报告书.docx(31页珍藏版)》请在冰豆网上搜索。

操作系统实习报告书.docx

操作系统实习报告书

 

2009学年—2010学年第2学期

操作系统

实习报告书

目录

一.实习步骤………………………………………………………………………3

二.技术方案………………………………………………………………………4

1.主要功能介绍…………………………………………………………………4

2.实现编译平台介绍……………………………………………………………4

3.详细设计………………………………………………………………………4

4.结构说明………………………………………………………………………6

三.结果………………………………………………………………………7

1.实习程序的使用说明书………………………………………………………7

2.重要函数功能说明及流程图:

………………………………………………6

3.运行结果…………………………………………………………………………21

四.分析………………………………………………………………………28

1.总结………………………………………………………………………………28

2.存在的问题……………………………………………………………………29

 

实习内容:

基于shell的形式来模拟文件系统

实习环境:

VisualStudio6.0C++/VisualStudio2005

一.实习步骤

1.前期讨论实现方法及设计方案

2.任务分工

 

二.技术方案

1.主要功能介绍

1)盘符切换:

可以更改当前的磁盘,根据用户输入的盘符,转到相应的磁盘下;

2)cd:

显示当前目录的名称或将其更改,cdA:

\B,进入B目录。

3)chdir:

显示当前目录的名称,当后面没有任何符号时,显示显示当前目录中的文件和子目录列表,如果后边指定相应的目录,则列出对应目录下的文件和子目录表;

4)copy:

将文件复制到另一个位置.

5)dir:

显示一个目录中的文件和子目录,当后面没有任何符号时,显示显

示当前目录中的文件和子目录列表,如果后边指定相应的目录,则列出对应目录下的文件和子目录表;

6)mkdir:

创建指定路径下的子目录

7)more:

逐屏显示输出的内容。

8)move:

将文件移动到另一个位置。

9)rmdir:

将指定的文件或目录删除

10)help:

帮助,显示所能进行的操作

2.实现编译平台及运行平台

在windowsXP、windowsVista、windows7下运行平台式VisualStudioC++6.0及VisualStudio2005

3.详细设计

1)首先创建文件A,并对A进行初始化,A中包含B、C目录,B目录下有十个a[i]文件。

并将刚刚初始化好的A中的信息用writein()写进A文件。

2)实现命令的解析:

a)用getline()函数获得用户输入的命令;

b)定义全局变量stringorder和stringobj分别存放当前命令和操作路径

c)以””为分隔符,用循环的方式分割出当前命令和操作路径。

d)判断当前命令与存在命令是否相符,若相符实现相应函数,若不相符,出现不存在命令的提示。

3)voidhelp()函数打印帮助信息,打印内容包括有哪些命令以及各个命令如何使用。

若只输入help命令,则进入到stringlline==help的函数中。

若除了输入help命令还输入相应命令,则通过之后一系列helpcd()之类的特定帮助函数用来对特定功能进行帮助。

4)cd命令的实现。

用path存放当前路径,将输入路径打印出来。

若只输入cd而没有输入路径,则系统显示当前路径继续服务。

并通过seekp函数将指针定位到A中当前cd之后的内容。

5)voiddir()列出目录下的所有文件及文件夹:

a)当解析当order为dir时,进入dir函数。

b)将传过来的参数s变成s\,在Path[]中寻找s\,通过字符串函数提取判断,若找到并且Path[]中s\之后的所有字符串中不再有\出现时,则将此路径之后的所有内容显示。

c)显示时用seekp函数定位到已找到的相应位置,并把该位置之后的信息内容全部显示出来。

d)定位时,要用循环,将之前所有的内容的总长度相加存入sum,将指针定位到sum+1。

6)voidmkdir(stringobj1,stringobj2)创建新文件或目录:

a)在执行该命令之前,要将obj用“”分割开,分为obj1和obj2。

Obj1存放的是当前要创建的文件或目录的路径及名称,obj2存放的是创建的对象的属性,即是文件还是目录。

b)在Path[]中寻找obj1,若找到,则说明要创建的对象已经存在,不能再创建,若没有找到,则可以创建。

c)若要创建的对象不存在,则对其各个对象进行编写,同时,将刚创建的对象的路径存入Path[],将刚创建的对象存入total[]。

d)用writein()函数对磁盘空间进行整理。

7)voidmore(stringch)逐屏显示输出。

调用more()函数实现。

完成判断,定位,打印输出的过程。

8)voidcopy(stringobj1,stringobj2)

a)在执行该命令之前,要将obj用“”分割开,分为obj1和obj2。

Obj1存放的是当前要复制的对象的路径及名称,obj2存放的是要复制到的路径。

b)obj1和obj2相等,则提示对象自身不能复制。

c)若obj1和obj2不相等,则进行复制,复制时要对路径进行修改,并对Path[]和total[]进行相应添加。

d)writein()磁盘空间整理。

9)voidrmdir(stringstr)可以删除一个目录或者文件,调用rmdir()函数。

10)voidmove(stringobj1,stringobj2)移动目录或文件

a)在执行该命令之前,要将obj用“”分割开,分为obj1和obj2。

Obj1存放的是当前要移动的对象的路径及名称,obj2存放的是要移动到的路径。

b)首先判断,若obj1和obj2相等,则提示对象不能自身移动。

c)若通过判断,则首先将obj1复制到obj2下(使用copy()中的命令),再将obj1删除(使用rmdir()中的命令)。

11)voidrename(stringobj1,stringobj2)修改文件名或目录名

a)在执行该命令之前,要将obj用“”分割开,分为obj1和obj2。

Obj1存放的是当前要修改的对象的路径及名称,obj2存放的是要修改成的路径及名称。

b)调用rename()函数。

12)voidmain()负责调用相应的函数满足用户的需求:

a)首先打印信息cout<<"Shell-AboveWindows7[Ver1.0]\n";cout<<"(C)Copyright2010zx_wql_djy.\n\n";输出当前磁盘cout<<"A:

\\>";

b)根据order和obj调用相应的函数。

4.结构说明

定义String型字符串,order存放当前命令,obj存放当前操作路径,path存放当前路径:

stringorder="",obj="",path="";

charPath[maxdir][20];//存放所有路径

定义文件结构体childfile,具有五个属性:

文件内容、属性(文件或目录)、路径、文件长度、文件名。

typedefstructchildfile{//childfile*pfirst[maxdir];

stringcontent;//文件内容

stringattribute;//属性:

目录文件

stringppath;//路径

intlength;//文件长度

stringname;//文件名

}childfile,*pfile;

定义结构体指针,用于进行文件的存取和读写:

pfileA,B,C,D;

pfilea[10];//B目录下的子文件

pfiletotal[maxdir];//存放所有已存在的目录

三.结果

⏹实习程序的使用说明书

1.输入help,显示所能进行的操作。

2.输入cd目录路径显示指定驱动器中的当前目录,不带参数只键入CD则

显示当前驱动器和目录。

3.输入chdir:

显示当前目录的名称,当后面没有任何符号时,显示前目录

中的文件和子目录列表,如果后边指定相应的目录,则列出对应目录下的文件和子目录表;

4.输入dir目录路径显示指定驱动器中的所有文件和子目录

5.输入more目录路径显示当前目录路径下的文件内容

6.输入copy目录路径1目录路径2将“目录路径1”下的内容复制到“目

录路径2

7.输入copy目录路径1目录路径2将文件复制到另一个位置

8.输入rmdir目录路径将指定的文件或目录删除.

9.输入move目录路径1目录路径2将“目录路径1”下的内容移动到“目

录路径2”。

10.输入rename目录路径1修改的目录路径名2将目录路径1修改成2。

⏹整体流程图

⏹流程图和函数说明:

1.Dir()函数:

显示一个目录中的文件和子目录,当后面没有任何符号时,显示显

示当前目录中的文件和子目录列表,如果后边指定相应的目录,则列出对应目录下的文件和子目录表.

Ø解析输入的命令,当存放命令的order字符串中存放的为dir时,调用dir(s)函数。

Ø将传过来的参数s变成s\,将Path[]中的路径存入tpath,通过字符串函数提取判断,若找到并且Path[]中s\之后的所有字符串中不再有\出现时,则将此路径之后的所有内容显示。

if((tpath.find(s,0)=tpath.length()))

{/*如果查找在输入命令行中出现s("\\")的位置比tpath的长度小,并且从此位置向后找到(“\\”)的位置

比tpath.length大或者等于length——即在找到出现\\的i位置后没有子目录*/

intsum=0;

for(intk=0;k

{

sum+=total[k]->attribute.size()+total[k]->content.size()+2+total[k]->name.size()+total[k]->ppath.size();//文件的属性、内容、名字、路径长度相加

}

Ø显示时用seekp函数定位到已找到的相应位置,并把该位置之后的信息内容全部显示出来。

fout.seekg(600+sum+5*i,ios:

:

beg);//定位:

从开始定位到个地址单元+已读取的文件长度+每个文件性质后设置的空格

Ø定位时,要用循环,将之前所有的内容的总长度相加存入sum,将指针定位到sum+1。

流程图如下:

2.COPY:

将文件复制到另一个位置.

voidcopy(stringobj1,stringobj2)

Ø在执行该命令之前,要将obj用“”分割开,分为obj1和obj2。

Obj1存放的是当前要复制的对象的路径及名称,obj2存放的是要复制到的路径。

for(i=0;i

{

if(Path[i]==obj1)//将obj1赋到Path中

{p1=i;break;}//当前位置记录到p1

}

for(j=0;j

{

if(Path[j]==obj2)//将obj2赋到Path中

{p2=j;break;}//当前位置记录到p2

}

Ø判断如果obj1和obj2相等,则提示对象自身不能复制。

f(p1==p2)

cout<<"文件无法自身复制"<

Ø若obj1和obj2不相等,则进行复制,复制时要对路径进行修改,并对Path[]和total[]进行相应添加。

elseif(p1!

=-1&&p2!

=-1)

{

pfilecpdir=newchildfile;

cpdir->attribute=total[p1]->attribute;

cpdir->content=total[p1]->content;

cpdir->length=total[p1]->length;

cpdir->name=total[p1]->name;

cpdir->ppath.resize(100);

cpdir->ppath=total[p2]->ppath+"\\"+obj1.substr(obj1.length()-1,1);

total[flag2]=cpdir;

flag2++;

strcat(Path[flag],cpdir->ppath.c_str());//每次将路径存入到path中去,并加

flag++;

writein()磁盘空间整理。

流程图如下:

3.MOVE:

将文件移动到另一个位置

voidmove(stringobj1,stringobj2)移动目录或文件

Ø在执行该命令之前,要将obj用“”分割开,分为obj1和obj2。

voidmove(stringobj1,stringobj2)

{

intp1=-1,p2=-1;

inti,j;

for(i=0;i

{

if(Path[i]==obj1)

{p1=i;break;}

}

for(j=0;j

{

if(Path[j]==obj2)

{p2=j;break;}

}

ØObj1存放的是当前要移动的对象的路径及名称,obj2存放的是要移动到的路径。

Ø首先判断,若obj1和obj2相等,则提示对象不能自身移动。

if(p1==p2)

cout<<"文件无法自身移动"<

Ø若通过判断,则首先将obj1复制到obj2下(使用copy()中的命令):

elseif(p1!

=-1&&p2!

=-1)

{

pfilecpdir=newchildfile;//先把obj1复制到obj2

cpdir->attribute=total[p1]->attribute;

cpdir->content=total[p1]->content;

cpdir->length=total[p1]->length;

cpdir->name=total[p1]->name;

cpdir->ppath.resize(100);

cpdir->ppath=total[p2]->ppath+"\\"+obj1.substr(obj1.length()-1,1);

////将输入路径的最后一个字符提取加入到obj1中,并且与ppath字串中的内容链接起来

total[flag2]=cpdir;

flag2++;

strcat(Path[flag],cpdir->ppath.c_str());//将路径存入到Path中去(将字符串接到Path【flag】后面)

flag++;

Ø再将obj1删除(使用rmdir()中的命令)。

for(inti=0;i

{

if(strcmp(obj1.c_str(),Path[i])==0)

{

for(intj=i;j

{

total[j]=total[j+1];

for(intk=0;k<20;k++)

Path[j][k]=Path[j+1][k];

}

}

}

writein();//磁盘空间整理

流程图如下:

4.More:

逐屏显示输出的内容

调用more()函数实现。

完成判断,定位,打印输出的过程。

Ø首先判断路径存在,则找到相应的位置,读出件的属性、内容、名字、路径、长度信息

for(intk=0;k

{

sum+=total[k]->attribute.size()+total[k]->content.size()+2+total[k]->name.size()+total[k]->ppath.size();//文件的属性、内容、名字、路径长度相加

}

Ø使用seekp函数定位到已找到的相应位置,并把该位置之后的信息内容全部显示出来。

fout.seekg(600+sum+5*i,ios:

:

beg);//从开始定位到600个地址单元+已读取的文件长度+每个文件性质后设置的空格

5.Writein:

磁盘整理程序,将文件重新写入A中

voidwritein()

打开文件A,循环向Path中写入20个字符,如果目录指针total【】中有内容,则将total的五个信息分别写入文件中。

fout.open("A",ios:

:

out|ios:

:

binary);

for(inti=0;i

{

fout.write((char*)Path[i],20);//将Path写到A中向文件中写入个字符

}

for(inti=0;i

{

if(total[i])//如果total存在,就将total的信息写到A中

{

fout<ppath;

fout<<"";

fout<name;

fout<<"";

fout<attribute;

fout<<"";

fout<content;

fout<<"";

fout<length;

fout<<"";

}

流程图如下:

6.Mkdir:

创建指定路径下的子目录

Ø在执行该命令之前,要将obj用“”分割开,分为obj1和obj2。

Obj1存放的是当前要创建的文件或目录的路径及名称,obj2存放的是创建的对象的属性,即是文件还是目录。

Ø在Path[]中寻找obj1,若找到,则说明要创建的对象已经存在,不能再创建,若没有找到,则可以创建。

for(inti=0;i

{

if(strcmp(Path[i],obj1.c_str())==0)

{

cout<<"您输入的路径已存在"<

p=1;

}

}

Ø若要创建的对象不存在,则对其各个对象进行编写,同时,将刚创建的对象的路径存入Path[],将刚创建的对象存入total[]。

if(p==0)

{

D=newchildfile;

D->ppath=obj1;//存放名称

D->name=obj.substr(obj1.length()-1,1);//将输入路径的最后一个字符提取加入到obj1中,(从obj.length-1开始的一个字符)

D->attribute=obj2;//文件属性

D->length=sizeof(childfile);//子文件的长度

D->content="%%";//存放目录内容

total[flag2]=D;//结构体指针指向D

flag2++;

strcat(Path[flag],D->ppath.c_str());//将路径存入到Path中去(将字符串接到Path【flag】后面)

flag++;

writein();//磁盘空间整理

cout<

"<

}

7.Rename:

修改文件名或目录名

Ø在执行该命令之前,要将obj用“”分割开,分为obj1和obj2。

Obj1存放的是当前要修改的对象的路径及名称,obj2存放的是要修改成的路径及名称。

Ø调用rename()函数。

Ø解析命令行,用substr得到obj1的最后一个字符既要修改的对象,将obj2中的字符重新赋值给路径,替换原名称。

intp=0;

for(inti=0;i

{

if(strcmp(Path[i],obj1.c_str())==0)

{

total[i]->name=obj2.substr(obj1.length()-1,1);//得到输入命令行的最后一个字符赋值给目录存放结构体的名字指针

total[i]->ppath=obj2;//重置路径

strcpy(Path[i],total[i]->ppath.c_str());//将目录存放结构体的内容赋值给路径结构体数组

cout<<"修改成功!

"<

writein();//磁盘空间整理

p=1;//判断是否找到路径

}

}

if(p==0)

cout<<"您输入的路径不存在!

"<

cout<";

流程图如下:

8.Rmdir:

将指定的文件或目录删除

以删除一个目录或者文件,调用voidrmdir(stringstr)函数.

Ø先解析输入的命令行内容,当读取的字符串内容与Path[]内容一致时找到路径位置;

Ø使用循环将目录里的文件列表移动覆盖原位置的信息;

Ø最后更新Path[]中的内容。

Ø进行磁盘空间整理调用Writein函数。

for(inti=0;i

{

if(strcmp(str.c_str(),Path[i])==0)//定位找到删除位置i

{

for(intj=i;j

{

total[j]=total[j+1];//后一位置前移

for(intk=0;k<20;k++)

Path[j][k]=Path[j+1][k];//后一位置前移

}

cout<<"删除成功!

"<

p=1;

}

流程图如下:

 

⏹运行结果

1.运行开始界面

2.输入help命令显示所有命令信息

3.Cd命令实现

4.返回上一级目录

5.Dir命令

6.Mkdir命令

7.More命令

8.Copy命令

9.Rmdir命令

10.Move命令

11.Rename命令

12.退出程序

13.健壮性考虑

四.分析

1.总

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 自然景观

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1