📄 filesys.c
字号:
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;
}
//获取文件名
sign=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目录名过长\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;
}
//获取文件名
sign=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("不存在该文件!\n");
return 0;
}
}
else
{
printf("不存在该文件!\n");
return 0;
}
//要删除的不能是目录
if(temp->isdir!=0)
{
printf("ERROR!该命令只能删除文件,不可删除目录!\n");
return 0;
}
//如仍有用户使用该文件,则不能删除
if(temp->i_nlink!=0)
{
printf("还有用户共享了该文件,不能删除!\n");
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;
}
//要删除的不能是文件
if(temp->isdir!=1)
{
printf("ERROR!该命令只能删除目录,不可删除文件!\n");
return 0;
}
//若要删除的目录不为空,则提示用户是否删除
if(temp->child)
{
printf("\n该目录不为空,您确定要删除吗? Y/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;
//指定目录不为空,显示其所有子目录及文件名
tp=tp->child;
while(tp)
{
if(tp->isdir)
printf(" <DIR> %s\n",tp->filename);
else
printf(" <FILE> %s\n",tp->filename);
tp=tp->sibling_next;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -