[计算机软件及应用]Windows命令接口实验报告_第1页
[计算机软件及应用]Windows命令接口实验报告_第2页
[计算机软件及应用]Windows命令接口实验报告_第3页
[计算机软件及应用]Windows命令接口实验报告_第4页
[计算机软件及应用]Windows命令接口实验报告_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

1、 操作系统课程设计报告 作者:半童 合肥工业大学 独立之精神,自由之思想!windows命令接口实验一实验题目: 第29题操作系统接口:windows命令接口。(3人) 4分二实验任务:1.设计要求:l 为windows操作系统建立兼容的dos命令接口,文件与目录命令;l 具体命令:dir, rd,cd,md, del,move,ren, copy, xcopy, time, date,sort,重定向命令,.,|,more,type ,cls,exit命令格式可参照windows的cmd.exe或ms-dos提供的命令;l 设计命令的名称、参数等格式;l 可以字符形式接收命令,执行命令,然后

2、显示命令执行结果.2设计目的:(1)dir命令:能够正确显示一个目录里面的子目录和文件(2)rd命令:能够删除一个空目录(3)cd命令:能够打开一个存在的目录(4)md命令:能够建立一个空目录(5)del命令:能够删除一个文件(6)move命令:能够移动一个目录或文件(7)ren命令:能够重命名一个目录或文件(8)xcopy命令:能够拷贝整个目录(8)time命令:显示系统的时间(8)date命令:显示系统的日期(8)sort命令:对文本内容进行分类(8)more命令:逐步分屏显示(8)type命令:显示文本内容(8)cls命令:清楚屏幕显示(8)exit命令:退出三:实验环境:1 pc机一台

3、 386以上2 microsoft visual studio2010 软件3 实现语言:c语言四:原理及算法描述:1基本原理: 用户利用联机命令接口实现与机器的交互时,先在终端的键盘上打入所需的命令,由终端处理程序接受该命令,并将它显示在终端屏幕上。当一条命令输入完后,由命令解释程序对命令进行分析,然后执行相应命令的处理程序。2算法描述:(1)存贮输入的各命令参数void store_parameter(char *buffer,char *parameter10,int *para_num)说明:将输入的命令一条一条存储parameter10中,最大允许的参数个数为10个。算法描述:为bu

4、ffer设置一个指针buffer_point,如果该指针向下移动,碰到空格,继续向下移动,直到遇到字符,读进各存储变量中parameter10,最后如果遇到0,则结束。(2)浏览一个路径下的目录和文件void my_dir(char *a,int *num)说明:该命令只能显示当前目录中的文件和子目录和当前目录中子目录中的文件和子目录。并无如windows中命令参数如此丰富。主要是考虑其复杂性,予以简化了。算法描述:如果只接受到mydir命令,后面并无其他参数时,显示当前目录下文件和子目录。如果接受到两个参数,如果第二个参数(表示当前目录中子目录)存在,则显示该目录下文件和子目录,如果不存在,

5、则报错。(3)删除一个存在的目录,如果不存在,删除失败!void my_rd(char *a,int *num)算法描述:如果该目录存在且为空目录,则删除,否则失败。(4)打开一个存在的目录,如果不存在,打开失败! void my_cd(char *a,int *num)算法描述:如果接受到两个参数,第二个参数表示要打开的目录。如果该目录存在,则成功,否则失败。(5)创建一个目录void my_md(char *a,int *num)算法描述:如果接受到两个参数,第二个参数表示要建立的目录。如果存在该目录,失败,否则成功。(6)删除一个存在的文件,如果不存在,删除文件失败!void my_de

6、l(char *a,int *num)算法描述:如果接受到两个参数,第二个参数表示要删除的文件。如果该文件存在,则删除成功,否则失败。(7)移动一个存在的文件,否则,移动失败void my_move(char *a,int *num)算法描述:如果接受到三个参数,其中第二个参数表示存在的文件或目录,第三个参数表示将要移动到的参数。如果第二个参数不存在,则失败,存在,成功。(8)重命名一个已经存在的文件,否则,重命名失败!void my_ren(char *a,int *num)算法描述:如果接受到三个参数,其中第二个参数表示将要重命名的目录或文件,第三个参数表示将要重命名的新的名字。(9)拷贝

7、文件void my_xcopy(char *a,int *num)算法描述:如果接受到三个参数,其中第二个参数表示存在的目录或文件,第三个表示将要拷贝成的目录或文件。(10)显示系统的时间void my_time(char *a,int *num)算法描述:如果接受到一个参数,调用系统的时间函数,参数正确则输出系统时间。(11)显示系统的日期void my_date(char *a,int *num)算法描述:如果接受到一个参数,调用系统的日期函数,参数正确则输出当时日期。(12)对文本内容进行分类void my_sort(char *a,int *num)算法描述:如果接受到两个参数,第二个

8、参数表示要分类的文本文档。如果该文件存在,则分类成功,否则失败。(13)逐步分屏显示文本内容void my_more(char *a,int *num)算法描述:如果接受到两个参数,第二个参数表示要分屏显示的文本文档。如果该文件存在,则分屏显示成功,否则失败。(14)显示文本内容void my_type(char *a,int *num)算法描述:如果接受到两个参数,第二个参数表示要显示的文本文档。如果该文件存在,则显示成功,否则失败。(15)清除屏幕显示void my_cls(char *a,int *num)算法描述:如果接受到一个参数,调用系统的清屏函数,参数正确则清除屏幕的输入输出。(

9、16)退出,后面可带退出参数void my_exit(char *a,int *num)算法描述:可以接受小于10个的参数,其中第一个参数表示退出。后面几个参数一起表示输出的信息。五设计思路描述:1本课程设计调用到的api函数有:(1)typedef struct _win32_find_data dword dwfileattributes; filetime ftcreationtime; filetime ftlastaccesstime; filetime ftlastwritetime; dword nfilesizehigh; dword nfilesizelow; dword d

10、woid; tchar cfilenamemax_path; win32_find_data; 该结构存放着所找到文件的详细信息,通过第一个字段,我们可以判断找到的文件是目录还是文件,通过cfilename可以获得该文件的文件名,继而可以对找到的文件进行操作。(2)handle findfirstfile(lpctstr lpfilename, lpwin32_find_data lpfindfiledata ); 根据文件名查找文件,如执行成功,返回一个搜索句柄。如果出错,返回一个invalid_handle_value常数。应该用findclose函数关闭这个句柄。(3)bool find

11、nextfile( handle hfindfile, lpwin32_find_data lpfindfiledata );该函数根据调用findfirstfile函数返回的句柄查找下一个文件,返回值非零表示成功,零表示失败。如不再有与指定条件相符的文件,会将getlasterror设置成error_no_more_files。(4)bool findclose( handle hfindfile );该函数用来关闭findfirstfile函数创建的一个搜索句柄。 (5)handle createfile(lpctstr lpfilename, dword dwdesiredaccess,

12、 dword dwsharemode, lpsecurity_attributes lpsecurityattributes, dworddwcreationdispostion , dword dwflagsandattributes, handle htemplatefile); 该函数创建,打开,或截取一个文件。它返回一个对象访问句柄。也可以返回和打开一个目录句柄。(6)bool getfiletime( handle hfile, lpfiletime lpcreationtime,lpfiletime lplastaccesstime, lpfiletime lplastwritet

13、ime );该函数得到一个文件创建,最近访问,最近修改日期,时间。(7)getcurrentdirectory(dword nbufferlength,lpwstr lpbuffer );该函数得到当前目录,存放在lpbuffer中。(8) bool removedirectory(lpctstr lppathname);该函数一个存在的空目录。(9)bool setcurrentdirectory(lpcwstr lppathname);该函数设置当前目录。(10boolcreatedirectory(lpctstrlppathname,lpsecurity_attributes lpsec

14、urityattributes ); 该函数创建一个新目录。如果该文件存在,创建失败。(11)bool deletefile(lpctstr lpfilename);该函数删除一个存在的文件。(12)bool movefile(lpctstr lpexistingfilename, lpctstr lpnewfilename);该函数移动或重命名一个文件或目录(不管这个目录里是否由子目录或文件)。(13)bool copyfile(lpctstr lpexistingfilename, lpctstr lpnewfilename, bool bfailifexists );该函数拷贝一个存在的

15、文件或新文件。(14)bool timefile(lpctstr lpexistingfilename);该函数调用输出系统地时间。(15)bool datefile(lpctstr lpexistingfilename);该函数调用输出系统地日期。(16)bool sortfile(lpctstr lpexistingfilename);该函数打开文本文档,将内容进行分类。(17)bool morefile(lpctstr lpexistingfilename);该函数打开文本文档,将内容进行分屏显示。(18)bool typefile(lpctstr lpexistingfilename)

16、; 该函数打开文本文档,将内容进行显示。(19)bool clsfile(lpctstr lpexistingfilename);该函数清除屏幕输入输出的全部内容。2重要算法: 其实谈不上重要算法,只是对上述api函数的活学活用而已。其中我的my_dir(char *a,int *num)函数要稍微复杂点。其中涉及到一个文件或目录时间日期的获取和转换,这点是需要注意的。在源程序中,我已经给出详细的注解。还有,最后结束时得关闭创建文件的句柄和搜索句柄。这点非常重要。3 流程图:开始输入一个完整的命令parameter0=”mydir” or “mydir”执行my_dir()函数paramete

17、r0=”myrd” or “myrd”执行my_rd()函数parameter0=”mycd” or”mycd”执行my_cd()函数parameter0=”mymd” or”mymd”执行my_md()函数parameter0=”mydel” or”mydel”执行my_del()函数parameter0=”mymove” or”mymove”执行my_move()函数parameter0=”myren” or”myren”执行my_ren()函数parameter0=”myxcopy” or”myxcopy”执my_xcopy()函数parameter0=”myexit” or”myexi

18、t”执行my_exit()函数返回当前目录存储各命令参数parameter0=”mytime” or”mytime”parameter0=”mydate” or”mydate”parameter0=”mysort” or”mysort”parameter0=”mymore” or”mymore”parameter0=”myxtype” or”mytype”parameter0=”mycls” or”mycls”执my_time()函数执my_date()函数执my_sort()函数执my_more()函数执my_type()函数执my_ mycls()函数七实验步骤:(1)测试源程序是否正常,

19、测试通过即可运行microsoft visual studio2010 软件 让源程序生成执行operating_system.exe,如图:(2)将生成的operating_system.exe文件放置于要操作的文件夹内,并打开准备进行操作,如图:原目录列表:(3)使用mydir命令正确显示一个目录里面的子目录和文件,如图:(4)使用myrd命令能够删除一个空目录,如图:(5)使用mycd能够打开一个存在的目录,如图:(6)使用mymd命令能够建立一个空目录,如图:(7)使用mydel命令能够删除一个文件,删除后与前面的源目录参照可知其删除功能,如图:(8)使用mymove命令能够移动一个目

20、录或文件,移动后与前面的源目录参照可知其移动功能,如图:(9)使用myren命令能够重命名一个目录或文件,命名后与前面的源目录参照可知其命名功能,如图:(10)使用myxcopy命令能够拷贝整个目录,拷贝后与前面的源目录参照可知其拷贝功能 (11)使用mytime命令能够显示系统的时间,如图:(12)使用mydate命令能够显示系统的日期,如图:(13)使用mysort命令能够对文本内容进行分类,分类后与前面的源目录参照可知其分类功能,该功能是以首字母顺序的方式进行重排,如图:(14)使用mymore命令能够对文本内容进行分屏显示,按enter键可以逐步显示文档内容,如图:(15)使用myty

21、pe命令能够显示文本内容,如图:(16)使用cls命令能够清除屏幕的显示内容,如图:(17)使用exit命令退出operating_system.exe六程序清单:(1)function.h 头文件:/*/存贮输入的各命令参数#include#include#includeusing namespace std;void store_parameter(char *buffer,char *parameter10,int *para_num)char *buffer_point = buffer;for(*para_num) = 0; *buffer_point != 0 & (*para_n

22、um) cfilename,generic_read,file_share_read | file_share_delete |file_share_write,null,open_existing,file_flag_backup_semantics, null); /api函数createfileif(getfiletime(obj_dir,&lpcreationtime,&lplastaccesstime,&lplastwritetime) /api函数getfiletime filetime temp_time; filetimetolocalfiletime(&lplastwrite

23、time, &temp_time); / 转换成本地时间 filetimetosystemtime(&temp_time, &systime); / 转换成系统时间格式 printf(%d/%d/%d ,systime.wyear,systime.wmonth,systime.wday);/年月日printf(%d:%d:%d ,systime.whour,systime.wminute,systime.wsecond);/时分秒printf(%sn,find_file-cfilename);/printf(%d ,find_file-dwfileattributes);closehandle

24、(obj_dir);/api函数dword(1)findclose(obj_handle); /api函数findclose/浏览其中目录文件else if(*num) = 2)handleobj_handle;char *lpfilename = (char*)malloc(64*sizeof(char);char *next_dir = (char*)malloc(64*sizeof(char);win32_find_data* find_file = new win32_find_data(); /api函数win32_find_datafiletime lpcreationtime,l

25、plastaccesstime,lplastwritetime;/创建时间,最近访问时间,最近修改时间systemtime systime;/定义系统时间win32_find_data* fd = new win32_find_data(); /api函数win32_find_datagetcurrentdirectory(64,lpfilename); /api函数getcurrentdirectory/打开其中的某一个目录if(!setcurrentdirectory(a1) /api函数setcurrentdirectoryprintf(浏览目录失败,可能没有此目录!n); elsege

26、tcurrentdirectory(64,next_dir); /api函数getcurrentdirectorystrcat(next_dir,*.*);obj_handle = findfirstfile(next_dir, fd);/obj_handle初始化 api函数findfirstfile(2)if(findfirstfile(next_dir, find_file) != invalid_handle_value) /api函数findfirstfile(2)while (findnextfile(obj_handle, find_file) /api函数findnextfil

27、ehandle obj_dir = createfile(find_file-cfilename,generic_read,file_share_read | file_share_delete |file_share_write,null,open_existing,file_flag_backup_semantics, null); /api函数createfileif(getfiletime(obj_dir,&lpcreationtime,&lplastaccesstime,&lplastwritetime) /api函数getfiletime filetime temp_time; /

28、临时变量 filetimetolocalfiletime(&lplastwritetime,&temp_time); filetimetosystemtime(&temp_time, &systime); /转换成系统时间 printf(%d/%d/%d ,systime.wyear,systime.wmonth,systime.wday);/年月日printf(%d:%d:%d ,systime.whour,systime.wminute,systime.wsecond);/时分秒printf(%sn,find_file-cfilename);/closehandle(obj_dir);fi

29、ndclose(obj_handle); /api函数findclose/返回上一个目录setcurrentdirectory(lpfilename); /api函数setcurrentdirectory/参数个数大于等于3,警告错误else if(*num) = 3)printf(语法格式不正确!n);/删除一个存在的目录,如果不存在,删除失败!void my_rd(char *a,int *num)if(*num) = 2)if(!removedirectory(a1) /api函数removedirectoryprintf(删除目录失败,可能没有此目录!n); else printf(删

30、除目录成功!n); else if(*num) = 1)printf(正确语法格式为:n);printf(t myrd directoryn);elseprintf(语法格式不正确!n);/打开一个存在的目录,如果不存在,打开失败!void my_cd(char *a,int *num)if(*num) =2)if(!setcurrentdirectory(a1) /api函数setcurrentdirectoryprintf(打开目录失败,可能没有此目录!n); elseprintf(打开目录成功!n); else if(*num) = 1)printf(正确语法格式为:n);printf(

31、t mycd directoryn);elseprintf(语法格式不正确!n);/创建一个目录void my_md(char *a,int *num)if(*num) = 2)if(!createdirectory(a1,null) printf(创建新目录失败!);else printf(创建新目录成功n); else if(*num) = 1)printf(正确语法格式为:n);printf(t mymd directoryn);else printf(语法格式不正确!n);/删除一个存在的文件,如果不存在,删除文件失败!void my_del(char *a,int *num)if(*

32、num) = 2)if(!deletefile(a1) /api函数deletefileprintf(删除文件失败!n); else printf(删除文件成功!n); else if(*num) = 1)printf(正确语法格式为:n);printf(t mydel filen);else printf(语法格式不正确!n);/移动一个存在的文件,否则,移动失败void my_move(char *a,int *num)if(*num) = 3)if(!movefile(a1,a2) /api函数movefileprintf(移动文件失败,文件可能不存在!n);elseprintf(文件移

33、动成功!n);else if(*num) = 1)printf(正确语法格式为:n);printf(t mymove filen);else printf(语法格式不正确!n);/重命名一个已经存在的文件,否则,重命名失败!void my_ren(char *a,int *num)if(*num) = 3) if(!movefile(a1,a2) /api函数movefileprintf(重命名文件失败,文件可能不存在!n); else printf(重命名文件成功!n);else if(*num) = 1)printf(正确语法格式为:n);printf(t myren filen);els

34、e printf(语法格式不正确!n);/拷贝文件void my_xcopy(char *a,int *num)if(*num) = 3)if(!copyfile(a1,a2,1) /api函数copyfileprintf(拷贝文件失败,文件可能不存在!n);else printf(拷贝文件成功!n);else if(*num) = 1)printf(正确语法格式为:n);printf(t myxcopy filen);else printf(语法格式不正确!n);/显示日期void my_date()system( date);/显示时间void my_time()system( time)

35、;void my_sort(char *a,int *num)int lnum=0,min;char line100100,tmp100;/行数、每行字符数string s100;ifstream infile(a1);if(!infile)cout无法打开文件a1endl;elsewhile(!infile.eof()infile.getline(linelnum,100,n);lnum+;/记录总行数infile.close();for(int x=0;xlnum-1;x+)min=x;for(int y=x+1;ylnum;y+)if(strcmp(liney,linemin)0)min

36、=y;if(min!=x)for(int a=0;a100;a+)tmpa=linexa;linexa=linemina;linemina=tmpa;ofstream outfile(a1,ios:out);if(!outfile)cout文件写入失败endl;elsefor(int c=0;clnum;c+)outfilelinecendl;outfile.close();/屏显void my_type(char *a,int *num)char ch1000;ifstream infile(a1);if(!infile)cout无法打开文件a1endl;elseinfile.getline

37、(ch,1000,eof);coutchendl;infile.close();/分屏显示void my_more(char *a,int *num)int quit=0;char ch1000;ifstream infile(a1);if(!infile)cout无法打开文件a1endl;elseint count1=0,count2=0,l;/count1用于显示文件总行数,count2用于显示当前读到的文件行数while(!infile.eof()infile.getline(ch,1000,n);count1+;infile.clear();/不用clear,之前的文件状态属性不会变化

38、infile.seekg(0,ios:beg);/把流指针重新定位到文件头if(count124)for(l=0;lcount1;l+)infile.getline(ch,1000,n);coutchendl;elsefor(l=0;l24;l+)infile.getline(ch,1000,n);coutchendl;count2+;cout-more-int(double)count2/count1*100)%;while(!infile.eof()&(quit!=113)quit=getchar();if(cin.get()=n)infile.getline(ch,1000,n);cou

39、tchendl;count2+;cout-more-int(double)count2/count1*100)0&(count1-count2)24)for(l=0;l(count1-count2);l+)infile.getline(ch,1000,n);coutch24)for(l=0;l24;l+)infile.getline(ch,1000,n);coutchendl;count2+;cout-more-int(double)count2/count1*100)%n;if(int(double)count2/count1*100)=100)coutendl;break;infile.c

40、lose();void my_cls()system( cls );/退出,后面可带退出参数void my_exit(char *a,int *num)int i;for(i=1; i (*num);i+)printf(%s ,ai);printf(n);exit(1);(2)主函数程序:#include#include#include#include#include#includefunction.h/*/ 主程序/*int main()printf(t=n);/printf(t* 这是29题的文件和目录操作系统课程设计! *n);/ printf(t* operating order *n

41、);/ printf(t* 浏览文件和目录: mydir *n);/ printf(t* 删除目录 : myrd *n);/ printf(t* 打开目录 : mycd *n);/ printf(t* 建立目录 : mymd *n);/ printf(t* 删除文件 : mydel *n);/ printf(t* 移动文件 : mymove *n);/ printf(t* 重命名文件 : myren *n);/ printf(t* 拷贝文件 : myxcopy *n);/printf(t* 时间查询 : mytime *n);/printf(t* 日期查询 : mydata *n);/printf(t* 文本排序 : mysort *n);/printf(t* 分屏显示 : mymore *n);/printf(t* 文本输出 : mytype *n);/printf(t* 清除屏幕 : mycls *n);/printf(t* 退出 : myexit *n);/ printf(t=n);/printf(n);/获取当前路径char *current_path = (char*

温馨提示

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

评论

0/150

提交评论