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 *binNode,*usrNode, *unixNode,*etcNode,*libNode,*userNode, *binNode2,*liuNode,*sunNode,*ftiNode; strcpy(path,\根目录写入当前路径 //创建文件树的结点
binNode=CreateFileNode(\ usrNode=CreateFileNode(\ unixNode=CreateFileNode(\ etcNode=CreateFileNode(\ libNode=CreateFileNode(\ userNode=CreateFileNode(\ binNode2=CreateFileNode(\ liuNode=CreateFileNode(\ sunNode=CreateFileNode(\ ftiNode=CreateFileNode(\ cp=tp=root=CreateFileNode(\ //结点相应内容赋值 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;
9
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;
10
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--;
for(i=0;i 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) { unsigned int count=0; while(count } count++; } while(getchar()!=10); buffer[buffer_len-1]='\\0'; return -1; } //改变目录函数 int cdComd() { if(!CheckCommand()) //命令检查 return 0; if(strcmp(Para2,\ //对cd..命令的处理 int i; 11 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; } //创建目录函数 int mdComd() { struct FileNode * temp,*tp; temp=CreateFileNode(\ int sign; if(strlen(Para2)==0) { //参数不能为空 printf(\命令格式有错误.\\n\ return 0; } if(strlen(Para2)>20) { //长度检查 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(\ return 0; } 12
相关推荐: