?? 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
//結(jié)點(diǎn)結(jié)構(gòu)
struct FileNode
{
char filename[FILENAME_LEN];//文件名/目錄名
int isdir;//目錄文件識別標(biāo)志
int i_nlink;//文件的鏈接數(shù)
int adr;//文件的地址
struct FileNode *parent, *child;//指向父親的指針和指向左孩子的指針
struct FileNode *sibling_prev, *sibling_next;//指向前一個(gè)兄弟的指針和指向
//后一個(gè)兄弟的指針.
};
void Init();//初始化文件樹
int ParseCommand();//接受輸入的命令并把其分解成操作名和路徑文件名
void ExecuteCommand();//執(zhí)行命令
int cdComd();//處理cd命令
int editComd();//處理edit命令
int delComd();//處理del命令
int rdComd();//處理rd命令
int dirComd();//處理dir命令
int mdComd();//處理md命令
int FindPath(char *ph);//尋找參數(shù)ph所指向的路徑
//從參數(shù)Para2中找到要建立或刪除的文件、目錄名,并把指針指向其父親結(jié)點(diǎn)
int FindFilename(char Para2[]);
struct FileNode* CreateFileNode(char filename[],int isdir,int i_nlink);//創(chuàng)建結(jié)點(diǎn)
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];//記錄當(dāng)前走過的路徑
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;
//主函數(shù)
int main()
{
Init();//初始化文件樹
while(1)
{
if(ParseCommand())//分解命令
ExecuteCommand();//執(zhí)行命令
}
}
//執(zhí)行命令子函數(shù)
void ExecuteCommand()
{
int sign;
//根據(jù)參數(shù)Para1調(diào)用相應(yīng)的功能處理模塊
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"); //命令輸入不正確,報(bào)錯
}
//創(chuàng)建結(jié)點(diǎn)
struct FileNode* CreateFileNode(char filename[],int isdir,int i_nlink)
{
//申請結(jié)點(diǎn)空間
struct FileNode* node=(struct FileNode*)malloc(sizeof(struct FileNode));
//相應(yīng)內(nèi)容賦初值
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,"/"); //根目錄為當(dāng)前目錄
////////////////////////////////////////////////////////////////////////
/////////////////////創(chuàng)建初始目錄結(jié)點(diǎn)///////////////////////////////////
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);
////////////////////////////////////////////////////////////////////////
/////////////////////創(chuàng)建初始目錄結(jié)點(diǎn)結(jié)束///////////////////////////////
////////////////////////////////////////////////////////////////////////
/////////////////////初始目錄賦值///////////////////////////////////////
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;
////////////////////////////////////////////////////////////////////////
/////////////////////初始目錄結(jié)點(diǎn)賦值結(jié)束///////////////////////////////
printf("***********************************************************************\n");
printf("***********************************************************************\n");
printf("***********************歡迎來到模擬文件管理系統(tǒng)************************\n");
printf("*********************** 信息安全0601班:吳建海*************************\n");
printf("***********************************************************************\n");
printf("你可以輸入如下命令進(jìn)行操作:\n");
printf("cd:類似dos的cd命令\n");
printf("edit:創(chuàng)建文件\n");
printf("del: 刪除文件\n");
printf("rd:刪除目錄\n");
printf("dir:顯示目錄\n");
printf("md:創(chuàng)建目錄\n");
}
//獲取文件或目錄名,并把指針指向其父親結(jié)點(diǎ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逆轉(zhuǎn),獲得正確的文件或目錄名
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;
}
//緩沖區(qū)安全輸入子函數(shù)
//如果輸入超過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;
}
//分解命令子函數(shù)
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';
//獲取參數(shù)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;
//獲取參數(shù)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);
//將操作名全部轉(zhuǎn)換成小寫字母
for(k=0;k<strlen(Para1);k++)
{
ch=tolower((int)Para1[k]);
Para1[k]=ch;
}
return 1;
}
//cd功能處理子函數(shù)
int cdComd()
{
if(!CheckCommand())//命令檢查
return 0;
if(strcmp(Para2,"..")==0)
{ //對cd ..命令的處理
int i;
while(cp->sibling_prev)
cp=cp->sibling_prev;//找到這一層最左邊的結(jié)點(diǎn)
if(cp->parent)
{
cp=cp->parent;//找到父親結(jié)點(diǎn)
}
else
{
return 0;
}
//對當(dāng)前路徑進(jìn)行相應(yīng)處理
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;
}
//命令格式處理子函數(shù)
void Trim(char* str)
{
int begin,end;
char* tmp;
begin=0;
end=strlen(str);
//找到字符串第一個(gè)非空格的位置
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);
}
}
//獲取當(dāng)前目錄名子函數(shù)
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;
}
//查找路徑子函數(shù)
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; //指針指向當(dāng)前目錄的左孩子
else
{
printf("路徑錯誤!\n");
return 0;
}
}
}
while(i<=strlen(ph)&& cp)//繼續(xù)查找指定路徑,如遇到文件則報(bào)錯
{
int j=0;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -