📄 documentm.cpp
字号:
#include <stdio.h>
#include <iostream.h>
#include <string.h>
#include <ctype.h>
#include <malloc.h>
#define FILENAME_LEN 21
#define INPUT_LEN 81
#define COMMAND_LEN 11
//结点结构
struct FileNode
{
char filename[FILENAME_LEN];//文件名/目录名
int isdir;//目录文件识别标志
int i_nlink;//文件的链接数
int adr;//文件的地址
struct FileNode *parent, *child;//指向父亲的指针和指向左孩子的指针
struct FileNode *sibling_prev, *sibling_next;//指向前一个兄弟的指针和指向
//后一个兄弟的指针.
};
void Init();//初始化文件树
int ParseCommand();//接受输入的命令并把其分解成操作名和路径文件名
void ExecuteCommand();//执行命令
int cdComd();//处理cd命令
int editComd();//处理edit命令
int delComd();//处理del命令
int rdComd();//处理rd命令
int dirComd();//处理dir命令
int mdComd();//处理md命令
int FindPath(char *ph);//寻找参数ph所指向的路径
//从参数Para2中找到要建立或删除的文件、目录名,并把指针指向其父亲结点
int FindFilename(char Para2[]);
struct FileNode* CreateFileNode(char filename[],int isdir,int i_nlink);//创建结点
int GetInput(char* buffer,unsigned int buffer_len);//获取输入
int CheckCommand();//命令检查
int GetDir(int begin,char* path,char* curDir);//获取路径
void Trim(char* str);
struct FileNode * cp, *tp, *root,*upper;
char path[INPUT_LEN-COMMAND_LEN];//记录当前走过的路径
char curpath[INPUT_LEN-COMMAND_LEN],Para1[COMMAND_LEN],
Para2[INPUT_LEN-COMMAND_LEN],tmppath[INPUT_LEN-COMMAND_LEN];
char filename[FILENAME_LEN],dirname[FILENAME_LEN],tmp;
int i,j;
//主函数
int main()
{
Init();//初始化文件树
while(1)
{
if(ParseCommand())//分解命令
ExecuteCommand();//执行命令
}
}
//执行命令子函数
void ExecuteCommand()
{
int sign;
//根据参数Para1调用相应的功能处理模块
if(strcmp(Para1,"cd")==0)
sign=cdComd(); //cd命令
else if(strcmp(Para1,"edit")==0)
sign=editComd(); //edit命令
else if(strcmp(Para1,"del")==0)
sign=delComd(); //del命令
else if(strcmp(Para1,"dir")==0)
sign=dirComd(); //dir命令
else if(strcmp(Para1,"md")==0)
sign=mdComd(); //md命令
else if(strcmp(Para1,"rd")==0)
sign=rdComd(); //rd命令
else if(strcmp(Para1,"exit")==0)
exit(0); //exit命令
else
printf("命令错误,请重试\n"); //命令输入不正确,报错
}
//创建结点
struct FileNode* CreateFileNode(char filename[],int isdir,int i_nlink)
{
//申请结点空间
struct FileNode* node=(struct FileNode*)malloc(sizeof(struct FileNode));
//相应内容赋初值
strcpy(node->filename,filename);
node->isdir=isdir;
node->i_nlink=i_nlink;
node->parent=NULL;
node->child=NULL;
node->sibling_prev=NULL;
node->sibling_next=NULL;
return node;
}
//初始化文件树
void Init()
{
struct FileNode *bin,*usr,*unix,*etc;
strcpy(path,"/"); //根目录为当前目录
////////////////////////////////////////////////////////////////////////
/////////////////////创建初始目录结点///////////////////////////////////
bin = CreateFileNode("bin",1,0);
usr = CreateFileNode("usr",1,0);
unix = CreateFileNode("unix",0,0);
etc = CreateFileNode("etc",1,0);
root = cp = tp = CreateFileNode("/",1,0);
////////////////////////////////////////////////////////////////////////
/////////////////////创建初始目录结点结束///////////////////////////////
////////////////////////////////////////////////////////////////////////
/////////////////////初始目录赋值///////////////////////////////////////
root -> parent = NULL;
root -> child = bin;
root -> sibling_prev = root -> sibling_next = NULL;
bin -> parent = root;
bin -> child = NULL;
bin -> sibling_prev = NULL;
bin -> sibling_next = usr;
usr -> parent = NULL;
usr -> child = NULL;
usr -> sibling_prev =bin;
usr -> sibling_next = unix;
unix -> parent = NULL;
unix -> child = NULL;
unix -> sibling_prev = usr;
unix -> sibling_next = etc;
etc -> parent = NULL;
etc -> child = NULL;
etc -> sibling_prev = unix;
etc -> sibling_next = NULL;
////////////////////////////////////////////////////////////////////////
/////////////////////初始目录结点赋值结束///////////////////////////////
printf("***********************************************************************\n");
printf("***********************************************************************\n");
printf("***********************欢迎来到模拟文件管理系统************************\n");
printf("*********************** 信息安全0601班:吴建海*************************\n");
printf("***********************************************************************\n");
printf("你可以输入如下命令进行操作:\n");
printf("cd:类似dos的cd命令\n");
printf("edit:创建文件\n");
printf("del: 删除文件\n");
printf("rd:删除目录\n");
printf("dir:显示目录\n");
printf("md:创建目录\n");
}
//获取文件或目录名,并把指针指向其父亲结点
int FindFilename(char Para2[])
{
i=strlen(Para2)-1;
j=0;
while(Para2[i]!='/'&& i>=0)
{
filename[j]=Para2[i];
i--; j++;
}
filename[j]='\0';//获得逆序的文件或目录名,存入filename中
if(i<0) Para2[i+1]='\0';
else Para2[i]='\0';
j--;
//filename逆转,获得正确的文件或目录名
for(i=0;i<strlen(filename)/2;i++,j--)
{
tmp=filename[i];
filename[i]=filename[j];
filename[j]=tmp;
}
//查找路径
if(strlen(Para2)>0)
{
int sign=FindPath(Para2);
if(sign==0) return 0;
}
return 1;
}
//缓冲区安全输入子函数
//如果输入超过buffer_len,则截取前buffer_len-1长度的输入,
//buffer_len处字符用'/0'代替
int GetInput(char* buffer,unsigned int buffer_len)
{
int count=0;
while(count<buffer_len)
{
if((buffer[count]=getchar())==10)
{
buffer[count]='\0';
return count;
}
count++;
}
while(getchar()!=10);
buffer[buffer_len-1]='\0';
return -1;
}
//分解命令子函数
int ParseCommand()
{
char Inputs[INPUT_LEN];
int i=0,j=0,k=0,ch;
printf("%s>",path);
//获取输入
if(GetInput(Inputs,INPUT_LEN)==-1)
{
printf("输入行太长。\n");
return 0;
}
Para1[0]=Para2[0]='\0';
//获取参数Para1,即操作名
while(Inputs[i]!=' ' && Inputs[i]!='\0' && i<COMMAND_LEN-1)
{
Para1[i]=Inputs[i];
i++;
}//while
Para1[i]='\0';
//输入命令太长
if(i==(COMMAND_LEN-1))return 1;
//获取参数2,即路径文件名
if(Inputs[i]!='\0')
{
while(Inputs[i]==' ' && i<INPUT_LEN-1) i++;
j=0;
while(Inputs[i]!='\0' && i<INPUT_LEN-1)
{
Para2[j]=Inputs[i];
i++; j++;
}
Para2[j]='\0';
}
Trim(Para1);
Trim(Para2);
//将操作名全部转换成小写字母
for(k=0;k<strlen(Para1);k++)
{
ch=tolower((int)Para1[k]);
Para1[k]=ch;
}
return 1;
}
//cd功能处理子函数
int cdComd()
{
if(!CheckCommand())//命令检查
return 0;
if(strcmp(Para2,"..")==0)
{ //对cd ..命令的处理
int i;
while(cp->sibling_prev)
cp=cp->sibling_prev;//找到这一层最左边的结点
if(cp->parent)
{
cp=cp->parent;//找到父亲结点
}
else
{
return 0;
}
//对当前路径进行相应处理
i=strlen(path);
while(path[i]!='/'&& i>0) i--;
if(i!=0)
path[i]='\0';
else
path[i+1]='\0';
}
else
{
FindPath(Para2);//查找路径
}
return 1;
}
//命令格式处理子函数
void Trim(char* str)
{
int begin,end;
char* tmp;
begin=0;
end=strlen(str);
//找到字符串第一个非空格的位置
while(str[begin]==' ' && str[begin]!='\0')begin++;
//去除字符串尾部空格
while(str[--end]==' ');
str[end+1]='\0';
//除去空格
if(begin<end)
{
tmp=(char*)malloc((sizeof(char))*(end-begin+2));
strcpy(tmp,&str[begin]);
strcpy(str,tmp);
free(tmp);
}
}
//获取当前目录名子函数
int GetDir(int begin,char* path,char* curDir)
{
int i=0;
int len=strlen(path);
while(!((path[begin]=='\\' )|| (path[begin]=='/'))&&begin<len)
{
curDir[i++]=path[begin++];
}
curDir[i]='\0';
Trim(curDir);
return begin+1;
}
//查找路径子函数
int FindPath(char *ph)
{
struct FileNode *tp,*temp;
char oldpath[INPUT_LEN-COMMAND_LEN];
int i=0;
int sign=1;
if(strcmp(ph,"/")==0)
{ //ph是根目录
cp=root;
strcpy(path,"/");
return 1;
}
temp=cp;
strcpy(oldpath,path);//保存原路径和指针
if(ph[0]=='/')
{ //指针指向根目录的左孩子
cp=root->child;
i++;//滤过'/'
strcpy(path,"/");
}
else
{
if(cp!=NULL && cp!=root )
strcat(path,"/");
if(cp && cp->child)
{
if(cp->isdir)
cp=cp->child; //指针指向当前目录的左孩子
else
{
printf("路径错误!\n");
return 0;
}
}
}
while(i<=strlen(ph)&& cp)//继续查找指定路径,如遇到文件则报错
{
int j=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -