📄 main.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 + -