操作系统命令接口设计

操作系统命令接口设计

直接上代码
注意:本系统类似cmd使用c语言自建命令解析器
如果你要复制粘贴,请使用vc6.0运行否则将出现各种问题导致无法运行

#include<windows.h>
#include <time.h>
#include<string.h>
#include<stdio.h>

DWORD dwTotalFileNum=0;
//
//获取系统时间
void GetTime()
{
	int sec, min, hour, MonthDay, month, year, WeekDay;//参数定义
	struct tm * timeptr;
	//struct tm {                //时钟结构
	//int tm_sec;         /* 秒,范围从 0 到 59        */
	//int tm_min;         /* 分,范围从 0 到 59        */
	//int tm_hour;        /* 小时,范围从 0 到 23        */
	//int tm_mday;        /* 一月中的第几天,范围从 1 到 31    */
	//int tm_mon;         /* 月,范围从 0 到 11        */
	//int tm_year;        /* 自 1900 年起的年数        */
	//int tm_wday;        /* 一周中的第几天,范围从 0 到 6    */
	//int tm_yday;        /* 一年中的第几天,范围从 0 到 365    */
	//int tm_isdst;       /* 夏令时                */
    //};
	char weekdayString[10];
	time_t calendar;   //日历时间类
	time(&calendar);//获取系统时间  &引用且返回 time()计算当前日历时间
	timeptr = localtime(&calendar);//转化为当地时间 location()把时间设为本地时区并转化为时钟结构
	year = timeptr->tm_year;//时钟结构体赋值赋值给相应变量
	month = timeptr->tm_mon;
	MonthDay = timeptr->tm_mday;
	WeekDay = timeptr->tm_wday;
	hour = timeptr->tm_hour;
	min = timeptr->tm_min;
	sec = timeptr->tm_sec;
	switch(WeekDay)
	{
	    case 01: strcpy(weekdayString,"Monday");break;
		case 02: strcpy(weekdayString,"Tuesday");break;
		case 03: strcpy(weekdayString,"Wednesday");break;
		case 04: strcpy(weekdayString,"Thursday");break;
		case 05: strcpy(weekdayString,"Friday");break;
		case 06: strcpy(weekdayString,"Saturday");break;
		case 07: strcpy(weekdayString,"Sunday");break;
	}
	printf("%4d-%02d-%02d %s %02d:%02d:%02d\n", 1900 + year, 1 + month, MonthDay, weekdayString, hour, min, sec);
}

//回显字符串
void ReviewString()
{
	char a[100];
	printf("请输入字符串\n");
	scanf("%s",a);
	printf("%s\n",a);
}

//创建目录
void CreateCatalogue()
{
	char a[30]; //在当前目录下创建子目录
	LPSTR szDirPath;  //注意再次新建的时候由于之前已经成功新建,就会提示创建失败 LPSTR是Win32和VC++所使用的一种字符串数据类型
	printf("请输入要创建目录的名称:\n");
	scanf("%s",a);
	szDirPath=a;
	if(!CreateDirectory(szDirPath,NULL))
			//函数原型:
				//BOOL CreateDirectory(
				//	LPCWSTR lpPathName,
				//	LPSECURITY_ATTRIBUTES lpSecurityAttributes
				// pPathName:长指针,指向一个空结束的字符串,该字符串指定要创建的目录的路径。);
	
	{
		printf("创建目录%s失败\n",szDirPath);
		return;
	}
	printf("创建目录%s成功\n",szDirPath);

}
//
//显示当前目录
void DisplayCatalogue()
{
	CHAR szCurrentDirectory[MAX_PATH];//用于储存当前路径,MAX_PATH是C语言运行时库中通过#define指令定义的一个宏常量,它定义了编译器所支持的最长全路径名的长度。
	DWORD dwCurDirPathlen;//当前路径的长度,也用于判断获取是否成功
	dwCurDirPathlen=GetCurrentDirectory(MAX_PATH,szCurrentDirectory);//获取当前路径
	//函数原型为
	//	DWORDGetCurrentDirectory(
	//		DWORDnBufferLength,// size of directory buffer 缓冲区的长度
	//		LPTSTRlpBuffer// directory buffer 指定一个预定义字串,用于装载当前目录
	//	);
	if(dwCurDirPathlen==0)
	{	
		printf("获取当前目录失误。\n");
		return;
	}
	printf("进程当前目录为%s\n",szCurrentDirectory);

}

//修改路径
void ChangeCatalog()
{
	CHAR szCurrentDirectory[MAX_PATH];//用于储存当前路径
	CHAR NewCurrentDirectory[MAX_PATH];
	DWORD dwCurDirPathlen;//当前路径的长度,也用于判断获取是否成功
	dwCurDirPathlen=GetCurrentDirectory(MAX_PATH,szCurrentDirectory);//获取当前路径
	printf("进程当前目录为%s\n",szCurrentDirectory);
	printf("输入新的路径");
	scanf("%s",NewCurrentDirectory);
	lstrcpy(szCurrentDirectory,NewCurrentDirectory);
	if(!SetCurrentDirectory(szCurrentDirectory))
	{
		printf("修改新路径失败");
		return ;
	}
	printf("修改后进程当前目录为%s\n",szCurrentDirectory);
	

}

//显示目录结构
DWORD DisplayAllFileCatalogue(LPSTR szPath)
{
	CHAR szFilePath[MAX_PATH];
	WIN32_FIND_DATA FindFileData;
//	WIN32_FIND_DATA结构描述了一个由FindFirstFile, FindFirstFileEx, 或FindNextFile函数查找到的文件信息,
//
//typedef struct _WIN32_FIND_DATA {
//
//   DWORD dwFileAttributes; //文件属性
//
//   FILETIME ftCreationTime; // 文件创建时间
//
//   FILETIME ftLastAccessTime; // 文件最后一次访问时间
//
//   FILETIME ftLastWriteTime; // 文件最后一次修改时间
//
//   DWORD nFileSizeHigh; // 文件长度高32位
//
//   DWORD nFileSizeLow; // 文件长度低32位
//
//   DWORD dwReserved0; // 系统保留
//
//   DWORD dwReserved1; // 系统保留
//
//   TCHAR cFileName[ MAX_PATH ]; // 长文件名
//
//   TCHAR cAlternateFileName[ 14 ]; // 8.3格式文件名
//
//} WIN32_FIND_DATA, *PWIN32_FIND_DATA;
	HANDLE hListFile; //定义句柄类型
	CHAR szFullPath[MAX_PATH];
	lstrcpy(szFilePath,szPath);
	lstrcat(szFilePath,"\\*");//该函数将字符串lpString2附加在另一个字符串lpString1后面。
	hListFile=FindFirstFile(szFilePath,&FindFileData);
	if(hListFile==INVALID_HANDLE_VALUE)
	{
		printf("错误:%d",GetLastError());//取得上一个函数操作时所产生的错误代码并输出报错
		return 1;
	}
	else
	{
		do
		{
			if(lstrcmp(FindFileData.cFileName,TEXT("."))==0||lstrcmp(FindFileData.cFileName,TEXT(".."))==0)
			{//过滤本级目录和父级目录
				continue;
			}
			wsprintf(szFullPath,"%s\\%s",szPath,FindFileData.cFileName);
			dwTotalFileNum++;
			printf("\n%d\t%s\t",dwTotalFileNum,szFullPath);
			if(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
				//判断目标文件的文件属性是否与文件夹属性一致,即判断该目标是否为文件夹
			{
				printf("<DIR>");
				DisplayAllFileCatalogue(szFullPath);
			}

		}
		while(FindNextFile(hListFile,&FindFileData));
	}
	return 0;
}

void DisplayAllCatalogue()
{
	int argc=1;
	if(argc==2)
	{
		DisplayAllFileCatalogue(NULL);
	}
	else
	{
		CHAR szCurrentPath[MAX_PATH];
		GetCurrentDirectory(MAX_PATH,szCurrentPath);
		DisplayAllFileCatalogue(szCurrentPath);
	}
	printf("\n");

}
///
//列目录
DWORD EnumerateFileInDrectory(LPSTR szPath)
{
	WIN32_FIND_DATA FindFileData;
	HANDLE hListFile;
	CHAR szFilePath[MAX_PATH];
	//构造代表子目录和文件夹路径的字符串,使用通配符"*"
	lstrcpy(szFilePath,szPath);
	lstrcat(szFilePath,"\\*");
	hListFile=FindFirstFile(szFilePath,&FindFileData);//查找第一个文件\目录,获得查找句柄
	//判断句柄
	if(hListFile==INVALID_HANDLE_VALUE)
	{
		printf("错误:%d",GetLastError());
		return 1;
	}
	else
	{
		do
		{
			/*if(lstrcmp(FindFileData.cFileName,TEXT("."))==0||lstrcmp(FindFileData.cFileName,TEXT(".."))==0)
			{
			continue;
			}*/
			//打印文件名,目录名
			printf("   %s\t\t",FindFileData.cFileName);
			//判断文件属性,是否为加密文件或者文件夹
			if(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_ENCRYPTED)
			{ 
				printf("<加密>");
			}
			//判断文件属性,是否为隐藏文件或者文件夹
			if(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_HIDDEN);
			{
				printf("<隐藏>");
			}
			//判断文件属性,是否为目录
			if(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY);
			{
				printf("<DIR>");
			}
			printf("\n");
		}
		while(FindNextFile(hListFile,&FindFileData));
	}
	return 0;
}

void DisplayFile()
{
	int argc=1;
	if(argc==2)
	{
		EnumerateFileInDrectory(NULL);
	}
	else
	{
		CHAR szCurrentPath[MAX_PATH];
		GetCurrentDirectory(MAX_PATH,szCurrentPath);
		EnumerateFileInDrectory(szCurrentPath);
	}
	printf("\n");

}
///
//删除文本文件
void MyDeleteFile()
{
	char str[20];
	CHAR szCurrentPath[MAX_PATH];
	GetCurrentDirectory(MAX_PATH,szCurrentPath);
	printf("请输入要删除文件名\n");
	scanf("%s",str);
	strcat(szCurrentPath,"\\");
	strcat(szCurrentPath,str); 
	if(!DeleteFile(szCurrentPath))
	printf("删除文件失败!");
	else
	printf("删除文件成功!");
}
/
//显示版本信息
void ShowVersion()
{
	printf("                 +++++++++++++++++++++++++++++++++++++++++++++\n");
	printf("                 +   Mcrosoft Windows XP [版本2019.0.1]      +\n");
	printf("                 +                                           +\n");
	printf("                 +++++++++++++++++++++++++++++++++++++++++++++\n");
}

//清屏功能
void ClearScreen()
{  

	system("cls");
}

//
//删除目录,也就是删除文件夹
void MyDeleteCatalogue()
{
	char str[20];
	CHAR szCurrentPath[MAX_PATH];
	GetCurrentDirectory(MAX_PATH,szCurrentPath);
	printf("请输入要删除目录名称\n");
	scanf("%s",str);
	strcat(szCurrentPath,"\\");
	strcat(szCurrentPath,str); 
	if(RemoveDirectory(szCurrentPath)==0)
	printf("删除目录%s失败!\n",szCurrentPath);
	else
	printf("删除目录%s成功!\n",szCurrentPath);
}

//显示文本信息
void ShowFileMessage()
{
	FILE *fp;
	char str[20];
	char ch;
	printf("请输入要打开的文本名称:\n");
	scanf("%s",str);	
	if((fp=fopen(str,"rt"))==NULL) 
	{ 
		printf("\n打开文件失败%s!",str); 
		exit(1); 
	} 
	ch=fgetc(fp); 
	while(ch!=EOF) 
	{ 
		putchar(ch); 
		ch=fgetc(fp); 
	} 
	printf("\n");
	fclose(fp);

}
///
//打印文档
void PrintFile()
{
	char b[256];
	FILE *fp;
	fp = fopen("a.txt","wt+");
	printf("输入要打印的内容:");
	scanf("%s",b);
	fprintf(fp,b);
	fclose(fp);
	printf("打印文档内容%s成功!\n",b);
}
//
void RenameFile()  //对文件重命名
{
	char oldname[30],newname[30];
	int result;
	printf("请输入要修改的文件的名称:\n");
	scanf("%s",oldname);
	printf("请输入新的文件名称:\n");
	scanf("%s",newname);
	result= rename( oldname , newname );
	if ( result == 0 )
	puts ( "文件重命名成功!" );
	else
	perror( "文件重命名失败!" );
}
///
void Help()
{
	
	
	printf("\n*************************************************************************\n");
	printf("*  显示时间日期 st     |回显字符串 rn   |创建目录 nm    |删除目录 cm    *\n");
	printf("*  显示当前目录 sd     |更改路径 ch     |删除文件 cw    |打印文本 dy    *\n");
	printf("*  文件重新命名 na     |显示文本 dt     |显示版本 sm    |显示目录结构 ml*\n");
	printf("*  清除当前显示内容 cl |列目录 lm       |帮助 help      |退出  esc      *\n");
	printf("*************************************************************************\n");

}
///

void  guide()
{
	char tr[10];
	printf("请输入help进入操作指南");
	scanf("%s",tr);
	if(stricmp(tr,"help")==0)
	Help();

}

///
void Esc() //退出
{
	exit(1);
}

//比较输入的字符串指令是否合法
int cmp_char()
{
	char ch[10];
	printf("\n请输入相应的操作指令:");
	scanf("%s",ch);
	if(stricmp(ch,"st")==0) return 1;
	else if(stricmp(ch,"rn")==0) return 2;
	else if(stricmp(ch,"nm")==0) return 3;
	else if(stricmp(ch,"cm")==0) return 4;
	else if(stricmp(ch,"sd")==0) return 5;
	else if(stricmp(ch,"ch")==0) return 6;
	else if(stricmp(ch,"cw")==0) return 7;
	else if(stricmp(ch,"dy")==0) return 8;
	else if(stricmp(ch,"na")==0) return 9;
	else if(stricmp(ch,"dt")==0) return 10;
	else if(stricmp(ch,"sm")==0) return 11;
	else if(stricmp(ch,"ml")==0) return 12;
	else if(stricmp(ch,"cl")==0) return 13;
	else if(stricmp(ch,"esc")==0) return 14;
	else if(stricmp(ch,"help")==0) return 15;
	else if(stricmp(ch,"lm")==0) return 16;
	else return 0;

}

///
//命令解释器
void Command_interpreter()
{
	int a;
	char ar[10];
	printf("\n请输入help了解操作指南:");
	scanf("%s",ar);
	if(stricmp(ar,"help")==0)
	Help();
	while(1)
	{
		a=cmp_char();
		switch(a)
		{
		case 1: GetTime();break;
		case 2: ReviewString();break;
		case 3: CreateCatalogue();break;
		case 4: MyDeleteCatalogue();break;
		case 5: DisplayCatalogue();break;
		case 6: ChangeCatalog();break;
		case 7: MyDeleteFile();break;
		case 8: PrintFile();break;
		case 9: RenameFile();break;
		case 10: ShowFileMessage();break;
		case 11: ShowVersion();break;
		case 12: DisplayAllCatalogue();break;
		case 13: ClearScreen(); guide();break;
		case 14: Esc();break;
		case 15: Help();break;
		case 16: DisplayFile();break;
		case 0: printf("无法识别的指令,请输入正确的指令!\n");break;
		default:break;
		}
	}
}


void main()
{    
	int i=0,j=3;
	char d[10];
	printf("\n                               欢迎进入此系统               \n");
	ShowVersion();
	printf("请输入cmd进入命令解释器:");
	scanf("%s",d);
	for(i=0;i<2;i++)
	{
		if(stricmp(d,"cmd")==0)
		{
			Command_interpreter();
		}
		else
		{
			j=j-1;
			printf("你还有%d次机会!",j);
			printf("请输入cmd进入命令解释器:");
			scanf("%s",d);
		}
	}
	printf("连续输入错误,退出程序!");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值