《[计算机软件及应用]Windows命令接口实验报告.doc》由会员分享,可在线阅读,更多相关《[计算机软件及应用]Windows命令接口实验报告.doc(36页珍藏版)》请在三一办公上搜索。
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设计目的:(1)DIR命令:能够正确显示一个目录里面的
2、子目录和文件(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机一台 386以上2 Microsoft Visual Studio2010 软
3、件3 实现语言:C语言四:原理及算法描述:1基本原理: 用户利用联机命令接口实现与机器的交互时,先在终端的键盘上打入所需的命令,由终端处理程序接受该命令,并将它显示在终端屏幕上。当一条命令输入完后,由命令解释程序对命令进行分析,然后执行相应命令的处理程序。2算法描述:(1)存贮输入的各命令参数void store_parameter(char *buffer,char *parameter10,int *para_num)说明:将输入的命令一条一条存储parameter10中,最大允许的参数个数为10个。算法描述:为buffer设置一个指针buffer_point,如果该指针向下移动,碰到空格
4、,继续向下移动,直到遇到字符,读进各存储变量中parameter10,最后如果遇到0,则结束。(2)浏览一个路径下的目录和文件void my_dir(char *a,int *num)说明:该命令只能显示当前目录中的文件和子目录和当前目录中子目录中的文件和子目录。并无如Windows中命令参数如此丰富。主要是考虑其复杂性,予以简化了。算法描述:如果只接受到mydir命令,后面并无其他参数时,显示当前目录下文件和子目录。如果接受到两个参数,如果第二个参数(表示当前目录中子目录)存在,则显示该目录下文件和子目录,如果不存在,则报错。(3)删除一个存在的目录,如果不存在,删除失败!void my_r
5、d(char *a,int *num)算法描述:如果该目录存在且为空目录,则删除,否则失败。(4)打开一个存在的目录,如果不存在,打开失败! void my_cd(char *a,int *num)算法描述:如果接受到两个参数,第二个参数表示要打开的目录。如果该目录存在,则成功,否则失败。(5)创建一个目录void my_md(char *a,int *num)算法描述:如果接受到两个参数,第二个参数表示要建立的目录。如果存在该目录,失败,否则成功。(6)删除一个存在的文件,如果不存在,删除文件失败!void my_del(char *a,int *num)算法描述:如果接受到两个参数,第二个
6、参数表示要删除的文件。如果该文件存在,则删除成功,否则失败。(7)移动一个存在的文件,否则,移动失败void my_move(char *a,int *num)算法描述:如果接受到三个参数,其中第二个参数表示存在的文件或目录,第三个参数表示将要移动到的参数。如果第二个参数不存在,则失败,存在,成功。(8)重命名一个已经存在的文件,否则,重命名失败!void my_ren(char *a,int *num)算法描述:如果接受到三个参数,其中第二个参数表示将要重命名的目录或文件,第三个参数表示将要重命名的新的名字。(9)拷贝文件void my_xcopy(char *a,int *num)算法描述
7、:如果接受到三个参数,其中第二个参数表示存在的目录或文件,第三个表示将要拷贝成的目录或文件。(10)显示系统的时间void my_time(char *a,int *num)算法描述:如果接受到一个参数,调用系统的时间函数,参数正确则输出系统时间。(11)显示系统的日期void my_date(char *a,int *num)算法描述:如果接受到一个参数,调用系统的日期函数,参数正确则输出当时日期。(12)对文本内容进行分类void my_sort(char *a,int *num)算法描述:如果接受到两个参数,第二个参数表示要分类的文本文档。如果该文件存在,则分类成功,否则失败。(13)逐
8、步分屏显示文本内容void my_more(char *a,int *num)算法描述:如果接受到两个参数,第二个参数表示要分屏显示的文本文档。如果该文件存在,则分屏显示成功,否则失败。(14)显示文本内容void my_type(char *a,int *num)算法描述:如果接受到两个参数,第二个参数表示要显示的文本文档。如果该文件存在,则显示成功,否则失败。(15)清除屏幕显示void my_cls(char *a,int *num)算法描述:如果接受到一个参数,调用系统的清屏函数,参数正确则清除屏幕的输入输出。(16)退出,后面可带退出参数void my_exit(char *a,in
9、t *num)算法描述:可以接受小于10个的参数,其中第一个参数表示退出。后面几个参数一起表示输出的信息。五设计思路描述:1本课程设计调用到的API函数有:(1)typedef struct _WIN32_FIND_DATA DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwOID; TCHAR cFileNameMAX_PATH; WIN32_
10、FIND_DATA; 该结构存放着所找到文件的详细信息,通过第一个字段,我们可以判断找到的文件是目录还是文件,通过cFileName可以获得该文件的文件名,继而可以对找到的文件进行操作。(2)HANDLE FindFirstFile(LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData ); 根据文件名查找文件,如执行成功,返回一个搜索句柄。如果出错,返回一个INVALID_HANDLE_VALUE常数。应该用FindClose函数关闭这个句柄。(3)BOOL FindNextFile( HANDLE hFindFile, LPWIN32_F
11、IND_DATA lpFindFileData );该函数根据调用FindFirstFile函数返回的句柄查找下一个文件,返回值非零表示成功,零表示失败。如不再有与指定条件相符的文件,会将GetLastError设置成ERROR_NO_MORE_FILES。(4)BOOL FindClose( HANDLE hFindFile );该函数用来关闭FindFirstFile函数创建的一个搜索句柄。 (5)HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIB
12、UTES lpSecurityAttributes, DWORDdwCreationDispostion , DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); 该函数创建,打开,或截取一个文件。它返回一个对象访问句柄。也可以返回和打开一个目录句柄。(6)BOOL GetFileTime( HANDLE hFile, LPFILETIME lpCreationTime,LPFILETIME lpLastAccessTime, LPFILETIME lpLastWriteTime );该函数得到一个文件创建,最近访问,最近修改日期,时间。(7)G
13、etCurrentDirectory(DWORD nBufferLength,LPWSTR lpBuffer );该函数得到当前目录,存放在lpBuffer中。(8) BOOL RemoveDirectory(LPCTSTR lpPathName);该函数一个存在的空目录。(9)BOOL SetCurrentDirectory(LPCWSTR lpPathName);该函数设置当前目录。(10BOOLCreateDirectory(LPCTSTRlpPathName,LPSECURITY_ATTRIBUTES lpSecurityAttributes ); 该函数创建一个新目录。如果该文件存在
14、,创建失败。(11)BOOL DeleteFile(LPCTSTR lpFileName);该函数删除一个存在的文件。(12)BOOL MoveFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName);该函数移动或重命名一个文件或目录(不管这个目录里是否由子目录或文件)。(13)BOOL CopyFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, BOOL bFailIfExists );该函数拷贝一个存在的文件或新文件。(14)BOOL TimeFile(LPCTSTR lpEx
15、istingFileName);该函数调用输出系统地时间。(15)BOOL DateFile(LPCTSTR lpExistingFileName);该函数调用输出系统地日期。(16)BOOL SortFile(LPCTSTR lpExistingFileName);该函数打开文本文档,将内容进行分类。(17)BOOL MoreFile(LPCTSTR lpExistingFileName);该函数打开文本文档,将内容进行分屏显示。(18)BOOL TypeFile(LPCTSTR lpExistingFileName); 该函数打开文本文档,将内容进行显示。(19)BOOL ClsFile(
16、LPCTSTR lpExistingFileName);该函数清除屏幕输入输出的全部内容。2重要算法: 其实谈不上重要算法,只是对上述API函数的活学活用而已。其中我的my_dir(char *a,int *num)函数要稍微复杂点。其中涉及到一个文件或目录时间日期的获取和转换,这点是需要注意的。在源程序中,我已经给出详细的注解。还有,最后结束时得关闭创建文件的句柄和搜索句柄。这点非常重要。3 流程图:开始输入一个完整的命令parameter0=”mydir” or “MYDIR”执行my_dir()函数parameter0=”myrd” or “MYRD”执行my_rd()函数paramet
17、er0=”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”MYEXIT”执行my_exit()函数返回当前目录存储各命令参数parameter
18、0=”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)测试源程序是否正常,测试通过即可运行Microsoft Visual Studio2010 软
19、件 让源程序生成执行operating_system.exe,如图:(2)将生成的operating_system.exe文件放置于要操作的文件夹内,并打开准备进行操作,如图:原目录列表:(3)使用mydir命令正确显示一个目录里面的子目录和文件,如图:(4)使用myrd命令能够删除一个空目录,如图:(5)使用mycd能够打开一个存在的目录,如图:(6)使用mymd命令能够建立一个空目录,如图:(7)使用mydel命令能够删除一个文件,删除后与前面的源目录参照可知其删除功能,如图:(8)使用mymove命令能够移动一个目录或文件,移动后与前面的源目录参照可知其移动功能,如图:(9)使用myre
20、n命令能够重命名一个目录或文件,命名后与前面的源目录参照可知其命名功能,如图:(10)使用myxcopy命令能够拷贝整个目录,拷贝后与前面的源目录参照可知其拷贝功能 (11)使用mytime命令能够显示系统的时间,如图:(12)使用mydate命令能够显示系统的日期,如图:(13)使用mysort命令能够对文本内容进行分类,分类后与前面的源目录参照可知其分类功能,该功能是以首字母顺序的方式进行重排,如图:(14)使用mymore命令能够对文本内容进行分屏显示,按Enter键可以逐步显示文档内容,如图:(15)使用mytype命令能够显示文本内容,如图:(16)使用CLS命令能够清除屏幕的显示内
21、容,如图:(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_num) cFileName,GENERIC_READ,FILE_SHARE
22、_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(&lpLastWriteTime, &temp_time); / 转换成本地时间 FileTime
23、ToSystemTime(&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(obj_dir);/API函数DWORD(1)FindClose(obj
24、_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,lpLastAccessTime,lpLastWriteTime;/创建时间
25、,最近访问时间,最近修改时间SYSTEMTIME systime;/定义系统时间WIN32_FIND_DATA* fd = new WIN32_FIND_DATA(); /API函数WIN32_FIND_DATAGetCurrentDirectory(64,lpFileName); /API函数GetCurrentDirectory/打开其中的某一个目录if(!SetCurrentDirectory(a1) /API函数SetCurrentDirectoryprintf(浏览目录失败,可能没有此目录!n); elseGetCurrentDirectory(64,next_dir); /API函
26、数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函数FindNextFileHANDLE obj_dir = CreateFile(find_fil
27、e-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(&lpLastW
28、riteTime,&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);FindClose(obj_handle); /API函数FindClose/
29、返回上一个目录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(删除目录成功!n); else if(*num) = 1)printf(正确
30、语法格式为: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(t mycd directoryn);elseprintf(语法格式不正确
31、!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(*num) = 2)if(!DeleteFile(a1) /API函数Del
32、eteFileprintf(删除文件失败!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(文件移动成功!n);else if(*num) = 1)printf(正确语法格
33、式为: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);else printf(语法格式不正确!n);/拷贝文件void my_xcop
34、y(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);void my_sort(char *a,int *num)int ln
35、um=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=y;if(min!=x)for(int a=0;a100;a+)tmpa
36、=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(ch,1000,EOF);coutchendl;infile.close
37、();/分屏显示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,之前的文件状态属性不会变化infile.seekg(0,ios:beg);/把流指针重新定位到文件头if(count124)