📄 main.h
字号:
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 + -