?? wjxt.txt
字號(hào):
#include <stdio.h>
#include <iostream.h>
#include <string.h>
#include <ctype.h>
//#include <malloc.h>
#include <stdlib.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 cdComd();
int editComd();
int delComd();
int rdComd();
int dirComd();
int mdComd();
int FindPath(char *ph);
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;
unsigned int i,j;//int i,j;
//????
int main()
{
Init();//??????hile(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;
}
//??????id Init()
{
struct FileNode *binNode,*usrNode,
*unixNode,*etcNode,*libNode,*userNode,
*binNode2,*liuNode,*sunNode,*ftiNode;
strcpy(path,"/"); //??д????·??
//????????? binNode=CreateFileNode("bin",1,0);
usrNode=CreateFileNode("usr",1,0);
unixNode=CreateFileNode("unix",0,0);
etcNode=CreateFileNode("etc",1,0);
libNode=CreateFileNode("lib",1,0);
userNode=CreateFileNode("user",1,0);
binNode2=CreateFileNode("bin",1,0);
liuNode=CreateFileNode("liu",1,0);
sunNode=CreateFileNode("sun",1,0);
ftiNode=CreateFileNode("fti",1,0);
cp=tp=root=CreateFileNode("/",1,0);
//????ě????
root->parent=NULL;
root->child=binNode;
root->sibling_prev=root->sibling_next=NULL;
binNode->parent=root;
binNode->child=NULL;
binNode->sibling_prev=NULL;
binNode->sibling_next=usrNode;
usrNode->parent=NULL;
usrNode->child=libNode;
usrNode->sibling_prev=binNode;
usrNode->sibling_next=unixNode;
unixNode->parent=NULL;
unixNode->child=NULL;
unixNode->sibling_prev=usrNode;
unixNode->sibling_next=etcNode;
etcNode->parent=NULL;
etcNode->child=NULL;
etcNode->sibling_prev=unixNode;
etcNode->sibling_next=NULL;
libNode->parent=usrNode;
libNode->child=liuNode;
libNode->sibling_prev=NULL;
libNode->sibling_next=userNode;
userNode->parent=NULL;
userNode->child=NULL;
userNode->sibling_prev=libNode;
userNode->sibling_next=binNode2;
binNode2->parent=NULL;
binNode2->child=NULL;
binNode2->sibling_prev=userNode;
binNode2->sibling_next=NULL;
liuNode->parent=libNode;
liuNode->child=NULL;
liuNode->sibling_prev=NULL;
liuNode->sibling_next=sunNode;
sunNode->parent=NULL;
sunNode->child=NULL;
sunNode->sibling_prev=liuNode;
sunNode->sibling_next=ftiNode;
ftiNode->parent=NULL;
ftiNode->child=NULL;
ftiNode->sibling_prev=sunNode;
ftiNode->sibling_next=NULL;
}
//???????????????????ǘ??
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;
}
//???凸?????????
//???????r_len???????buffer_len-1????????
//buffer_len?????0'??int GetInput(char* buffer,unsigned int buffer_len)
{
unsigned int count=0;//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,ch;
unsigned int k=0;//int k=0;
printf("%s>",path);
//????
if(GetInput(Inputs,INPUT_LEN)==-1)
{
printf("??А?????\n");
return 0;
}
Para1[0]=Para2[0]='\0';
//????????????
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;
//?????·?????f(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)
{ //??d ..ü?????
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 *temp;//struct FileNode *tp,*temp;
char oldpath[INPUT_LEN-COMMAND_LEN];
unsigned int i=0;//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;
if(ph[i]=='/'&& cp->child)
{
i++;//???
if(cp->isdir)
cp=cp->child;//????????
else
{
printf("·????!\n");
return 0;
}
strcat(path,"/");
}
//curpath ??????????????
while(ph[i]!='/'&& i<=strlen(ph))
{
curpath[j]=ph[i];
i++; j++;
}
curpath[j]='\0';
while((strcmp(cp->filename,curpath)!=0 || (cp->isdir!=1))&& cp->sibling_next!=NULL)
{
cp=cp->sibling_next;
}
if(strcmp(cp->filename,curpath)==0 )
{
if(cp->isdir==0)
{
strcpy(path,oldpath);
cp=temp;
printf("?????.\n");
return 0;
}
strcat(path,cp->filename);
}
if(strcmp(cp->filename,curpath)!=0 || cp==NULL)
{
strcpy(path,oldpath);
cp=temp;
printf("??·????\n");
return 0;
}
}
return 1;
}
//???????
int editComd()
{
//char tmp;
struct FileNode * temp=CreateFileNode("",0,0);
int sign;
struct FileNode *tp;
//·????????
if(strlen(Para2)==0)
{
printf("\nü????д?.\n");
return 0;
}
//?????
if(strlen(Para2)>50)
{
printf("\n???\n");
return 0;
}
//????
if (!(isalpha(Para2[0])||Para2[0]=='_'||Para2[0]=='\0'||Para2[0]=='/'))
{
printf("??????n");/* ???????'??'????'???????????'*/
return 0;
}
//?????ign=FindFilename(Para2);
if(sign==0)
return 0;
if(cp->isdir!=1)//??????????ǎ???? {
printf("you cannot edit a file in under a file!\n");
return 0;
}
//??????????別????????
tp=CreateFileNode("",1,0);
strcpy(tp->filename,filename);
tp->isdir=0;
tp->i_nlink=0;
if(cp->child==NULL)
{ tp->parent=cp;
tp->child=NULL;
cp->child=tp;
tp->sibling_prev=NULL;
tp->sibling_next=NULL;
}
else
{ temp=cp;
//?temp???????別??
temp=temp->child;
while(temp->sibling_next )//find the last sibing node
{
temp=temp->sibling_next;
if(strcmp(temp->filename,filename)==0&&temp->isdir==0)
{
printf("?????\n");//?????? return 0;
}
}//??????????
temp->sibling_next=tp;
tp->parent=NULL;
tp->child=NULL;
tp->sibling_prev=temp;
tp->sibling_next=NULL;
}
return 1;
}
//??????????
int mdComd()
{
// char tmp;
int sign;
struct FileNode * temp, *tp;
temp=CreateFileNode("",1,0);
//??????
if(strlen(Para2)==0)
{
printf("\nü????д?.\n");
return 0;
}
//?????
if(strlen(Para2)>50)
{
printf("\n?????);
return 0;
}
//????
if (!(isalpha(Para2[0])||Para2[0]=='_'||Para2[0]=='\0'||Para2[0]=='/'))
{
printf("??????д?n");/* ?????????'??'????'???????????'*/
return 0;
}
//??????
sign=FindFilename(Para2);
if(sign==0) return 0;
//??????????ǎ???? if(cp->isdir!=1)
{
printf("you cannot make a directory in under a file!\n");
return 0;
}
//?????????????別????????
tp=CreateFileNode(filename,1,0);
if(cp->child==NULL)
{ tp->parent=cp;
tp->child=NULL;
cp->child=tp;
tp->sibling_prev=NULL;
tp->sibling_next=NULL;
}
else
{ temp=cp;
//?temp???????別??
temp=temp->child;
while(temp->sibling_next )//find the last sibing node
{
temp=temp->sibling_next;
if(strcmp(temp->filename,filename)==0&&temp->isdir==1)
{
printf("?????\n");//?????? return 0;
}
}//??????????
temp->sibling_next=tp;
tp->parent=NULL;
tp->child=NULL;
tp->sibling_prev=temp;
tp->sibling_next=NULL;
}
return 1;
}
//??????
int delComd()
{
// char tmp;
int sign;
struct FileNode *temp;
//??????
if(strlen(Para2)==0)
{
printf("\nü????д?.\n");
return 0;
}
//?????ign=FindFilename(Para2);
if(sign==0) return 0;
//?temp??????? if(cp->child)
{
temp=cp->child;
while(temp->sibling_next && (strcmp(temp->filename,filename)!=0 || temp->isdir!=0))
temp=temp->sibling_next;
if(strcmp(temp->filename,filename)!=0)
{
printf("???攚????
return 0;
}
}
else
{
printf("???攚????
return 0;
}
//????????
if(temp->isdir!=0)
{
printf("ERROR!??????????????\n");
return 0;
}
//????????????????(temp->i_nlink!=0)
{
printf("?????????????????;
return 0;
}
//???
if(temp->parent==NULL)//?????????
{
temp->sibling_prev->sibling_next=temp->sibling_next;
if(temp->sibling_next)//????????????
temp->sibling_next->sibling_prev=temp->sibling_prev;
temp->sibling_prev=temp->sibling_next=NULL;
}//if
else//??????
{
if(temp->sibling_next)//????????????
temp->sibling_next->parent=temp->parent;
temp->parent->child= temp->sibling_next;
}//else
free(temp);
return 1;
}
//ü???????
int CheckCommand()
{
if(strlen(Para2)==0)
{
printf("ü??????????\n");
return 0;
}
return 1;
}
//??????
int rdComd()
{
// char tmp;
struct FileNode *temp;
char cmd[2];
//ü???
if(!CheckCommand())
return 0;
//??????
if(!FindFilename(Para2))
return 0;
//?temp??????? if(cp->child)
{
temp=cp->child;
while(temp->sibling_next && (strcmp(temp->filename,filename)!=0|| temp->isdir!=1))
temp=temp->sibling_next;
if(strcmp(temp->filename,filename)!=0)
{
printf("???攚????!\n");
return 0;
}
}
else
{
printf("???攚????!\n");
return 0;
}
//?????ǎ??temp->isdir!=1)
{
printf("ERROR!??????????????\n");
return 0;
}
//???????????????????????(temp->child)
{
printf("\n?????????????????/N \n");
GetInput(cmd,2);
if(strcmp(cmd,"n")==0||strcmp(cmd,"N")==0)
return 0;
}
//???
if(temp->parent==NULL)//?????????
{
temp->sibling_prev->sibling_next=temp->sibling_next;
if(temp->sibling_next)//????????????
temp->sibling_next->sibling_prev=temp->sibling_prev;
temp->sibling_prev=temp->sibling_next=NULL;
}//if
else//??????
{
if(temp->sibling_next)//????????????
temp->sibling_next->parent=temp->parent;
temp->parent->child= temp->sibling_next;
}//else
free(temp);
return 1;
}
//????????
int dirComd()
{
if(strlen(Para2)>0)
{
int sign=FindPath(Para2);//?鎰·??
if(sign==0)
{
return 0;
}
else
{
printf("\n%s>", path);
}
}
if(cp!=root)
printf(" <DIR> %s\n","..");
if(cp->child==NULL)
{
return 0;//????????
}
tp=cp;
//????????????????????????p=tp->child;
while(tp)
{
if(tp->isdir)
printf(" <DIR> %s\n",tp->filename);
else
printf(" <FILE> %s\n",tp->filename);
tp=tp->sibling_next;
}
return 0;//????
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -