⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filesys.c

📁 可在windows下模拟DOS文件系统,功能比较强实用好!
💻 C
📖 第 1 页 / 共 2 页
字号:
			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 + -