北京联合大学《操作系统课程设计》实验一:命令行解释程序学院:信息学院专业:计算机科学与技术课程:操作系统班级: 1 1 0 3 B 姓名:傅笔贵学号: 20090803053022014年7 月10 日一.采用的数据结构说明字符数组:本程序中包含的字符数组有:filename1[20]:在Ccopy()函数中,存储源文件路径和名字的字符数组。
filename2[20]:在Ccopy()函数中,存储目标文件路径和名字的字符数组。
oldname[20]:在Cmv()函数中用来保存源文件路径和名字的字符数组。
newname[20]:在Cmv()函数中用来保存目标文件路径和名字的字符数组。
Cho2[6]:存取用户输入的指令,并用来作为Switch分支的判定条件之一。
File[20]:Cerase()函数中用来存放要删除的文件的路径和名字的字符数组。
Word[100]:在Cdis()中存放用户要回显的字符串。
二.源程序清单、注释和流程图(1)流程图(2)源程序和注释#include<stdio.h>#include<sys/types.h>#include<windows.h>#include<process.h>#include<string.h>#include<conio.h>#include<stdlib.h>int flag=1;char ch[8];//存储文件读取内容的中间变量FILE *fp;FILE *fp1;char filename1[20];/*复制文件候存放的原文件名*/char filename2[20];/*复制文件候存放的目标文件名*/char oldname[20];/*用来存放移动文件的源文件名*/char newname[20];/*用来存放移动文件的目标文件名*/void start_copy(char *filename1,char *filename2)/*文件复制函数,可以实现文本和图片的复制*/{if((fp=fopen(filename1,"rb"))==NULL||(fp1=fopen(filename2,"wb"))==NUL L)/*源文件或目标文件打开失败则无法进行复制*/{printf("can't open the source file!\n");exit(0);}else{fread(ch,1,8,fp);//一次读取八个字节的字节流,存放到ch字符数组里while (!feof(fp))//没读取到文件尾部时,持续读取{fwrite(ch,1,8,fp1);//写到目标文件里fread(ch,1,8,fp);//继续读取}fclose(fp);//关闭指针,释放内存fclose(fp1);}}void Cend(){flag=0;//将循环条件flag=1变为0来结束循环,结束程序}void Cdir(){/*目录显示函数,除了调用Cmd没有更好的解决办法,是本程序的遗憾.*/system("cmd.exe /b dir");}void Ccopy()//文件复制主函数{scanf("%s%s",&filename1,&filename2);//获取源文件和目标文件名start_copy(filename1,filename2);//传参到复制函数}void Cerase()//删除文件函数{char File[20];//文件名存储scanf("%s",&File);//获得文件名if(remove(File)==0)//删除成功remove返回0{printf("Remove %s Successfully!\n",File);}else{perror("Failed!");}}void Cdis(){char Word[100];//存放用户输入的字符串getchar();//吸取第一个不必要的空格字符gets(Word);//获得用户的字符串内容printf("---------E---C---H---O-------------\n");puts(Word);//显示用户的字符串内容}void Cmv()//移动或重命名文件函数{scanf("%s%s",&oldname,&newname);//用来获取用户输入的两个文件名rename(oldname,newname);}int main(){//定义判定字符char cdir1[]="Cdir";char cdir2[]="cdir";char ccopy1[]="Ccopy";char ccopy2[]="ccopy";char cerase1[]="Cerase";char cerase2[]="cerase";char cdis1[]="Cdis";char cdis2[]="cdis";char cend1[]="Cend";char cend2[]="cend";char clr1[]="Cclr";char clr2[]="cclr";char cmv1[]="Cmv";char cmv2[]="cmv";char cuname1[]="Cuname";char cuname2[]="cuname";while(flag){char Cho[100]={0};char Cho2[6];int num=0;/*主菜单*/printf("-----------------------------------\n");printf("---------M E N U----------\n");printf("-----------------------------------\n");printf("Cdir . Show the Detail of Dir and files.\n");printf("Ccopy . Copy the file.\n");printf("Cerase . Erase(Delete) the file.\n");printf("Cdis . The Echo of your input words\n");printf("Cclr . Clear the Screen.\n");printf("Cmv . Move Or Rename the file.\n");printf("Cuname . Show CPU Info.\n");printf("Cend . Quit.\n");printf("\n");printf("\n");printf("Please Enter The Command:");scanf("%s",&Cho2);/*下面这一段将对用户输入的字符串第一个空格前的内容进行判定,确定功能号,在转入对应的Case分支决定用户本次所使用的功能.*/if(strcmp(Cho2,cdir1)==0||strcmp(Cho2,cdir2)==0)//首字母大小写均可识别{num=1;}else if(strcmp(Cho2,ccopy1)==0||strcmp(Cho2,ccopy2)==0){num=2;}else if(strcmp(Cho2,cerase1)==0||strcmp(Cho2,cerase2)==0){num=3;}else if(strcmp(Cho2,cdis1)==0||strcmp(Cho2,cdis2)==0){num=4;}else if(strcmp(Cho2,cend1)==0||strcmp(Cho2,cend2)==0){num=5;}else if(strcmp(Cho2,clr1)==0||strcmp(Cho2,clr2)==0){num=6;}else if(strcmp(Cho2,cmv1)==0||strcmp(Cho2,cmv2)==0){num=7;}else if(strcmp(Cho2,cuname1)==0||strcmp(Cho2,cuname2)==0){num=8;}else{printf("ERROR COMMAND,TRY AGAIN!\n");}switch(num){case(1):Cdir();break;//功能1,启动Cmd调用dir \b检查目录case(2):Ccopy();getchar();break;//功能2,复制一个文件到另一个目录case(3):Cerase();break;//功能3,删除一个指定路径的文件case(4):Cdis();break;//功能4,回显用户输入的字符串内容case(5):Cend();break;//功能5,结束程序case(6):system("cls");break;//功能6,清屏case(7):Cmv();break;//功能7,移动一个文件,如果路径不变只改变名字,则变为重命名功能case(8):system("systemInfo");break;//功能8,显示计算机详细信息}}}三.Windows命令与Linux命令的不同本程序的功能有8个,其中Cdir和Linux下的ls基本区别不大,但是ls 后面有很多参数,这是和Windows在cmd下调用dir不太一样的地方。
Ccopy和Linux下的Cp命令没有什么区别。
Cerase和Linux的rm是有区别的,Linux删除的文件是无法补救的,因此在删除之前会有提示是否要真的删除,rm –r可以连同文件的子目录都删除,这点和windows下的rmdir类似。