⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 简单模拟了操作系统文件系统的操作
💻 CPP
字号:
/*!
 * \file
 * \brief 命令的获取解析执行操作的定义 */
#include "yafs.h"
#include "yafs_mem.h"
#include "yafs_op.h"
#include <stdlib.h>
#include <vector>
#include <iostream>
#include <string>

using namespace std;

struct dir_entry_mem *dir;    //!<指向当前路径的指针

/*!
 * \brief 欢迎信息,包括此系统的命令 */
void welcome()
{
	printf( "%s", "欢迎使用Yet Another File System\n");
	printf( "%s", "作者:黄挺\n");
	printf( "%s", "命令:exit, mkdir, newfile, rm, ls, rename, cd, format\n");
	printf( "%s", "输入命令加空格加\"-help\"以获取该命令的帮助信息\n");
}

/*!
 * \brief 打印当前的目录路径 */
void getDirStr()
{
	struct dir_entry_mem *tmp = dir;
	string dirStr;

	while( tmp->dir.name[0] != '/' )
	{
		string tmpStr( tmp->dir.name );
		dirStr = "/" + dirStr + tmpStr;
		tmp = tmp->father;
	}

	dirStr = "root" + dirStr + ">:";
	printf( "%s", dirStr.c_str() );
}

/*!
 * \brief 执行ls操作 */
void ls()
{
	string result = "";
	list<struct dir_entry_mem>::iterator iter = dir->children.begin();
	iter++;
	iter++;

	while( iter != dir->children.end() )
	{
		string tmpStr( (*iter).dir.name );
		result = result + tmpStr +"   ";
		iter++;
	}

	printf("%s\n", result.c_str() );
}

/*!
 * \brief 判断用户输入的文件或者文件夹的名字包含非法字符 * @param name 用户输入的文件或者文件夹的名字 * @return 返回一个布尔值,若为真,则表示名字是合法的,若否,则表示名字中含有非法字符 */
bool isValidName( string name )
{
	char invalidChars[4] = { '/', '\\', '>', '<' };

	if( name =="." || name == "..")
		return false;

	for ( int i = 0; i < 4; i ++ )
	{
		if( name.find_first_of( invalidChars[ i ] ) != string::npos )
			return false;
	}

	return true;
}

/*!
 * \brief 在当前路径下新建一个文件夹 * @param name 文件夹的名字 */
void mkdir( string name )
{
	if( !isValidName( name ) )
	{
		printf( "%s", "非法的文件名,文件名中不能包含有/, \\, >, <\n");
		return;
	}

	newDir( dir, name.c_str() );
}

/*!
 * \brief 在当前目录下新建一个文件 * @param name 文件的名字 * @param len 文件的长度 */
void newfile( string name, int len )
{
	if( !isValidName( name ) )
	{
		printf( "%s", "非法的文件名,文件名中不能包含有/, \\, >, <\n");
		return;
	}

	newFile( dir, name.c_str(), len );
}

/*!
 * \brief 删除当前目录下指定文件名的文件或者文件夹 * @param name 文件或者文件夹的名字 */
void rm( string name )
{
	deleteFile( dir, name.c_str() );
}

/*!
 * \brief 重命名当前目录下指定文文件名的文件或者文件夹 * @param orgName 文件或者文件夹的原来的名字 * @param name 文件或者文件夹的新名字 */
void renamefile( string orgName, string name )
{
	if( !isValidName( name ) )
	{
		printf( "%s", "非法的文件名,文件名中不能包含有/, \\, >, <\n");
		return;
	}

	rename( dir, orgName.c_str(), name.c_str() );
}

/*!
 * \brief 改变当前路径 * @param name '.'表示当前路径本身,'..'表示父路径,其他表示当前路径下的自文件夹的文件名 */
void cd( string name )
{
	if( name == "." )
		return;

	if( name == "..")
	{
		if( dir->dir.name[0] == '/')
			return;

		dir = dir->father;
		return;
	}

	if( !isValidName( name ) )
	{
		printf( "%s", "非法的文件名,文件名中不能包含有/, \\, >, <\n");
		return;
	}

	list<dir_entry_mem>::iterator iter = dir->children.begin();

	while( iter != dir->children.end() )
	{
		string tmpStr( (*iter).dir.name );

		if( tmpStr == name && (*iter).dir.file_type == 2 )
		{
			dir = NULL;
			dir = &(*iter);
			return;
		}

		iter ++;
	}

	if( iter == dir->children.end() )
	{
		printf( "%s不是一个文件夹\n", name.c_str() );
		return;
	}
}

/*!
 * \brief 打印命令的帮助信息 * @param name 命令的名字 */
void printHelpInfo( string name )
{
	if( name == "exit" )
	{
		printf("功能:退出程序\n");
		return;
	}

	if( name == "format" )
	{
		printf("功能:格式化磁盘\n");
		return;
	}

	if( name == "ls" )
	{
		printf("功能:列出当前目录下的文件或者文件夹\n");
		return;
	}

	if( name == "cd" )
	{
		printf("功能:改变当前路径;格式:cd <路径名>;说明:路径名为“.”表示当前路径本身,“..”表示父路径\n");
		return;
	}

	if( name == "mkdir" )
	{
		printf("功能:在当前路径下新建一个文件夹;格式:mkdir <文件名>\n");
		return;
	}

	if( name == "newfile" )
	{
		printf("功能:在当前路径下新建一个文件夹;格式:newfile <文件名>\n");
		return;
	}

	if( name == "rm" )
	{
		printf("功能:删除当前路径下的一个文件或者文件夹;格式:rm <文件名>\n");
		return;
	}

	if( name == "rename" )
	{
		printf("功能:重命名当前路径下的一个文件或者文件夹;格式:rename <原文件名> <新文件名>\n");
		return;
	}
}

/*!
 * \brief 执行命令 * @param cmd 命令的名字 */
void exeCmd( char* cmd )
{
	vector<string> cmdStr;
	char *tokenPtr;
	tokenPtr = strtok( cmd, " ");

	while( tokenPtr != NULL )
	{
		string tmpStr( tokenPtr );
		cmdStr.push_back( tmpStr );
		tokenPtr = strtok( NULL, " ");
	}

	if( cmdStr.size() >= 2 )
	{
		if( cmdStr[ 1 ] == "-help")
		{
			printHelpInfo( cmdStr[ 0 ]);
			return;
		}
	}

	if( cmdStr[ 0 ] == "exit" )
		exit(0);

	if( cmdStr[ 0 ] == "ls" )
	{
		ls();
		return;
	}

	if( cmdStr[0] == "format" )
	{
		format();
		dir = NULL;
		dir = init();
		return;
	}

	if( cmdStr.size() >= 2 )
	{
		if( cmdStr[0] == "cd" )
		{
			cd( cmdStr[1] );
			return;
		}

		if( cmdStr[0] == "rm" )
		{
			rm( cmdStr[1] );
			return;
		}

		if( cmdStr[0] == "mkdir" )
		{
			mkdir( cmdStr[1] );
			return;
		}

		if( cmdStr[0] == "newfile" )
		{
			newfile( cmdStr[1], 1024 );
			return;
		}
	}

	if( cmdStr.size() >= 3 )
	{
		if( cmdStr[0] == "rename" )
		{
			renamefile( cmdStr[1], cmdStr[2] );
			return;
		}
	}

	printf("非法的命令\n");
}

/*!
 * \brief main函数 * @return */
int main()
{
	dir = init();
	const int cmdSize = 1024;
	char cmd[ cmdSize ];
	memset( cmd, 0, sizeof( char ) * cmdSize );
	welcome();
	getDirStr();

	while( cin.getline( cmd, cmdSize ) )
	{
		exeCmd( cmd );
		getDirStr();
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -