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

📄 main.h

📁 设计一个模拟的多用户多级目录的文件系统
💻 H
📖 第 1 页 / 共 2 页
字号:
		if((strcmp(drenow.name,mypath)==0)&&(drenow.kind=='d')&&(drenow.parent==nowlevel))
		{
			nowlevel=i;
			fclose(fp);
			if(strcmp(usernowpath,"\\")!=0)			//不是根目录就添加斜杠
			{
				strcat(usernowpath,"\\");
			}
			strcat(usernowpath,mypath);
		//	printf("当前路径:");
		//	printf("%s\n",usernowpath);
			return true;
		}
		i++;
	}
	//printf("Error:路径错误\n");
	fclose(fp);
	return false;

}



//进入路径完整版
void intopath()
{
	int tempnl=nowlevel;
	char tempunp[200];
	strcpy(tempunp,usernowpath);
	char wholepath[100];
	char name[15];
	printf("输入要进入的路径:");
	scanf("%s",&wholepath);
	int i=0;
		
	char cc=wholepath[i];
	while(cc!='\0')
	{
		int j=0;
		name[j]=cc;
		while(cc!='\0'&&cc!='\\')
		{
			name[j]=cc;
			j++;
			i++;
			cc=wholepath[i];
		}
		if(i!=0)
		{
			name[j]='\0';
			//printf("%s\n",name);
			if(!path(name))
			{
				printf("Error:路径输入错误,请核对\n");
				//如果路径错误,则还原
				nowlevel=tempnl;
				strcpy(usernowpath,tempunp);
				return;
			}
		}
		if(cc=='\0') break;
		i++;
		cc=wholepath[i];
	}
}



//删除文件,递归删除文件夹和文件夹里面的内容
//删除文件
bool remove(int p)
{
	bool isfind=false;
	int i=0;
	int temp=0;
	struct dreitem drecnow;
	FILE *fp;
	fp=fopen(usernowname,"rb+");
	long ep;
	fseek(fp,0,2);
	ep=ftell(fp);
	fseek(fp,0,0);
	while(ep!=ftell(fp))
	{
		fread(&drecnow,sizeof(struct dreitem),1,fp);
		if(drecnow.parent==p)
		{
			isfind=true;
			temp=p;
			remove(i);
		}
		i++;
	}
	if(!isfind)
	{
		drecnow.empty=0;
		strcpy(drecnow.name,"    ");
		drecnow.parent=-1;
		fseek(fp,p*sizeof(struct dreitem),0);
		fwrite(&drecnow,sizeof(struct dreitem),1,fp);
		fclose(fp);
		return true;
	}
	else
	{
		remove(temp);
		fclose(fp);
		return false;
	}	
}

void del()
{
	char name[15];
	printf("输入要删除的文件:");
	scanf("%s",name);
	findex *fb=fidx;//用于索引表
	findex *fi;
	fileb *fob=flink;//用于已打开文件链表
//	fileb *foi;
	if(fb==NULL||fb->next==NULL)//搜索索引表
	{
		printf("Error:没有此文件\n");
		return;
	}
	bool isit=true;
	while(fb!=NULL&&fb->next!=NULL)
	{
		fi=fb;
		fb=fb->next;
		if((strcmp(fb->name,name)==0)&&(fb->parent==nowlevel))
		{
			isit=false;
			if(remove(fb->number))
			{
				fi->next=fb->next;
				free(fb);
				printf("该文件已被删除\n");
				return;
			}
		}
	}
	if(isit)
	{
		printf("Error:没有此文件\n");
	}
	else
	{
		printf("该文件已被删除\n");
	}
}




//打开文件
void openfile()
{
	long ep;
	int i=0;
	FILE *fp;
	struct dreitem drenow;
	char name[15];
	printf("输入要打开的文件名:");
	scanf("%s",&name);
	
	struct fileb *fb=flink;
	while(fb!=NULL&&fb->next!=NULL)
	{
		fb=fb->next;
		if((strcmp(fb->name,name)==0)&&(fb->parent==nowlevel))
		{
			printf("Error:该文件已经打开\n");
			return;
		}
	}
	fp=fopen(usernowname,"rb");					//可用索引节点
	fseek(fp,0,2);
	ep=ftell(fp);
	fseek(fp,0,0);
	while(ep!=ftell(fp))
	{
		fread(&drenow,sizeof(struct dreitem),1,fp);
		if((strcmp(drenow.name,name)==0)&&(drenow.parent==nowlevel)&&(drenow.kind=='f'))
		{
			//添加到打开链表
			fileb *pb=getb(struct fileb);
			strcpy(pb->name,name);
			pb->parent=nowlevel;
			pb->next=NULL;
			pb->rex=0;
			pb->pride=drenow.pride;
			if(flink==NULL)
			{
				flink=getb(struct fileb);
				flink->next=pb;
			}
			else
			{
				pb->next=flink->next;
				flink->next=pb;
			}
			printf("文件已经打开\n");
			fclose(fp);
			//这里是否要更新显示已打开链表
			return;
		}
		i++;	
	}
	printf("Error:当前目录下无此文件,请核对\n");
	fclose(fp);

}

//显示当前打开文件列表
void disfilelist()
{
	if(flink==NULL||flink->next==NULL)
	{
		printf("当前打开文件队列空\n");
		return;
	}
	else
	{
		printf("当前打开文件队列如下:(文件名|父节点|读写权限|读写状态)\n");
		fileb *fb=flink;
		while(fb!=NULL&&fb->next!=NULL)
		{
			fb=fb->next;
			printf("%s|%d|%d|%d->",fb->name,fb->parent,fb->pride,fb->rex);
		}
		printf("**\n");
	}
}


//关闭文件
void closefile()
{
	char name[15];
	printf("输入要关闭的文件:");
	scanf("%s",&name);
	if(flink==NULL||flink->next==NULL)
	{
		printf("Error:该文件没有打开\n");
		return;
	}
	fileb *fb=flink;
	fileb *ffb=NULL;
	while(fb!=NULL&&fb->next!=NULL)
	{
		ffb=fb;
		fb=fb->next;
		if((strcmp(fb->name,name)==0)&&(fb->parent==nowlevel))
		{
			ffb->next=fb->next;
			free(fb);
			printf("文件已经关闭\n");
			return;
		}

	}
	printf("Error:当前路径下找不到你要关闭的文件,请确定文件名已经路径是否正确\n");
}

//读写文件,该文件必须先打开后才可以进行读写操作
void rwfile(int ch)		//读写文件,输入1为读文件,输入2为写文件
{
	char name[15];
	printf("要操作的文件名:");
	scanf("%s",&name);
	if(flink==NULL||flink->next==NULL)
	{
		printf("Error:该文件尚未打开\n");					//可以调用文件打开函数,以后先修改

		return;
	}
	fileb *fb=flink;
	while(fb!=NULL&&fb->next!=NULL)
	{
		fb=fb->next;
		if((strcmp(fb->name,name)==0)&&(fb->parent==nowlevel))
		{
			//char ch;
			if(fb->rex!=ch&&fb->rex!=0)
			{
				if(ch==2)
				{
					if(fb->pride!=1)
					{
						printf("Error:该文件只读,没有写权限\n");
						return;
					}
					else
					{
						printf("当前文件正在读进程,是否终止读进程进行写?(y OR n):");
					}
				}
				else
				{
					printf("当前文件正在写进程,是否终止写进程进行读?(y OR n):");
				}
				fflush(stdin);
				scanf("%c",&ch);
				if(ch=='y'||ch=='Y')
				{
					if(ch==2)
					{
						fb->rex=1;
						printf("文件正在读...\n");
					}
					else
					{
						fb->rex=2;
						printf("文件正在写...\n");
					}
				}
			}
			else
			{
				if(ch==2&&fb->pride!=1)
				{
					printf("Error:该文件只读,没有写权限\n");
					return;
				}
				fb->rex=ch;
				if(ch==1)
				{
					printf("文件正在读...\n");
				}
				else
				{
					printf("文件正在写...\n");
				}
			}
			return;
		}
	}
}

//设置共享
void setshare()
{
	printf("要共享的文件:");
}

//显示当前路径
void dispathlist()
{
	printf("%s\n",usernowpath);
//	printf("%d\n",nowlevel);
}

//注销
void logout()
{
	strcpy(usernowname,"  ");
	nowlevel=-1;
	fblk=NULL;
	fidx=NULL;
	strcpy(usernowpath,"\\");
	flink=NULL;
}
	
//修改用户类型
void setpride()
{
	char name[15];
	printf("输入用户名字:");
	scanf("%s",&name);
	if((strcmp("root",name)==0))//超级用户
	{
		printf("Error:超级管理员权限不可以更改\n");
		return ;
	}
	FILE *fp=NULL;
	struct user actuser;
	if(!(fp=fopen("user","rb+")))
	{
		printf("Error:用户表错误\n");
		return ;
	}
	rewind(fp);
	long np;
	while(!feof(fp))
	{
		np=ftell(fp);
		fread(&actuser,sizeof(struct user),1,fp);
		if((strcmp(actuser.name,name)==0))
		{
			if(actuser.pride==1)
			{
				int pp=1;
				printf("该用户是管理员\n输入0设置普通用户:");
				scanf("%d",&pp);
				if(pp==0)
				{
					actuser.pride=0;
				}
			}
			else if(actuser.pride==0)
			{
				int pp=0;
				printf("该用户是普通用户\n输入1设置为管理员:");
				scanf("%d",&pp);
				{
					if(pp==1)
					{
						actuser.pride=1;
					}
				}
			}
			fseek(fp,np,0);
			fwrite(&actuser,sizeof(struct user),1,fp);
			fclose(fp);
			return;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -