📄 file.c
字号:
//tangfilesystem
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "string.h"
#include "time.h"
#include "windows.h"
#define getpch(type) (type*)malloc(sizeof(type))
#define null 0
int flag=0;//用于退出系统的标志flag=1时候退出系统
int usernum=0;//用于记录当前的用户个数,限制用户超过10个
struct mfd{ //主文件目录
char uname[12]; //用户名
struct ufd *flink; //文件目录指针
struct mfd *unext;
}*mready=null,*mp,*ff;
typedef struct mfd MFD;
struct ufd{ //用户文件目录
char fname[12]; //文件名
int pcode ; //保护码
int length; //文件长度
struct ufd* fnext;
}*uready=null,*np;
typedef struct ufd UFD;
struct afd{ //运行文件目录
char openfname[12];//打开文件名
int openpcode; //打开保护码
int rpoint; //读指针
int wpoint; //写指针
}*arunning=null,*ap;
typedef struct afd AFD;
/***********查看相同的用户***********/
bool checkuser(MFD *mpc)
{
MFD *first ;
if(mready==null)
{
return FALSE;//没有相同的
}
else
{ first=mready;
while(first!=null)
{ if(strcmp(mpc->uname,first->uname)==0)return TRUE;
first=first->unext;
}
}
return FALSE;
}
/*****************查看相同文件*******************/
bool checkfile(UFD* npc)
{
UFD *second ;
second=mready->flink;
while(second!=null)
{ if((strcmp(npc->fname,second->fname)==0)&&(npc->pcode==second->pcode))return TRUE;
second=second->fnext;
}
return FALSE;
}
/****************帮助*********************/
void help()
{
printf("============命令提示帮助============\n");
printf("\tcreate\t\t创建文件\n");
printf("\tdelete\t\t删除文件\n");
printf("\tclose\t\t关闭文件\n");
printf("\topen\t\t打开文件\n");
printf("\tread\t\t读取文件\n");
printf("\twrite\t\t写入文件\n");
printf("\texit\t\t退出用户\n");
printf("\thelp\t\t命令帮助\n");
printf("====================================\n");
}
/**********************显示文件******************************/
void fprint(MFD *f)
{
UFD *f1;
f1=f->flink;
printf("\n用户 < %s >的文件目录",f->uname);
printf("\n文件名\t保护码\t长度\n");
printf("-------------------------\n");
if(f1==null) printf("文件目录为空!\n");
else{
while (f1!=null)
{ printf("%s\t%d\t%d\n",f1->fname,f1->pcode,f1->length);
f1=f1->fnext;
}
}
printf("-------------------------\n");
}
/*********************创建文件************************/
void createfile(MFD *f)
{
UFD *fp;
fp=f->flink;
if(fp==null)
{
np=getpch(UFD);
printf("文件名:");
scanf("%s",np->fname);
printf("保护码:");
scanf("%d",&np->pcode);
printf("文件长:");
scanf("%d",&np->length);
f->flink=np;
np->fnext=null;
}
else
{
while(fp->fnext!=null)
{ fp=fp->fnext;
}
np=getpch(UFD);
printf("文件名:");
scanf("%s",np->fname);
printf("保护码:");
scanf("%d",&np->pcode);
printf("文件长:");
scanf("%d",&np->length);
if(checkfile(np)) printf("相同文件已经存在,无法创建!\n");
else{
fp->fnext=np;
np->fnext=null;
}
}
//fprint(f);
}
/************************删除文件***************************/
void fdelete(MFD *f)
{
UFD *fp,*fq;
char dename[12];
fp=f->flink;
if(fp==null)
{
printf("没有文件可供删除!\n");
}
else
{
printf("文件名:");
scanf("%s",dename);
if(strcmp(dename,fp->fname)==0) f->flink=fp->fnext;
else
{fq=fp;
fp=fp->fnext;
while(fp!=null)
{ if(strcmp(dename,fp->fname)==0)
{
fq->fnext=fp->fnext;
break;
}
fq=fq->fnext;
fp=fp->fnext;
}
}
}
//fprint(f);
}
/**********************显示当前打开文件**********************/
void nowopenf(AFD* p)
{
printf("运行打开文件: %s 保护码:%d\n",p->openfname,p->openpcode);
}
/***********************打开文件***************************/
void open(MFD *f)
{
UFD *fp;
char oname[12];
int pc;
fp=f->flink;
if(fp==null)
{
printf("没有文件可供打开!\n");
}
else
{
printf("文件名:");
scanf("%s",oname);
printf("保护码:");
scanf("%d",&pc);
do {
if((strcmp(oname,fp->fname)==0)&&(fp->pcode==pc))
{
ap=getpch(AFD);
strcpy(ap->openfname,fp->fname);
ap->openpcode=fp->pcode;
ap->rpoint=0;
ap->wpoint=fp->length;
if(arunning==null) {arunning=ap;nowopenf(arunning);}
else printf("正在打开文件,不允许同时运行两个文件!\n");
break;
}
fp=fp->fnext;
}while(fp->fnext==null);
if(arunning==null) printf("文件不存在!\n");
}
}
/*****************关闭文件*************************/
void close()
{ if(arunning==null) printf("没有打开文件!\n");
else
{
printf("关闭运行文件:%s\n",arunning->openfname);
arunning=null;
}
}
/*******************读取文件***********************/
void read(MFD *f)
{
open(f);
if(arunning->openpcode==3) printf("文件不可读!\n");
else
{
printf("读取文件中....\n");
for((arunning->rpoint)=0;(arunning->rpoint)<(arunning->wpoint);(arunning->rpoint)++)
{
printf("> ");
Sleep(200);
}
printf("读取完毕!\n");
}
close();
}
/********************写入文件**********************/
void write(MFD *f)
{
int len,i;
UFD *fp;
fp=f->flink;
open(f);
if((arunning->openpcode==1)||(arunning->openpcode==3)) {printf("文件不可写!\n");close();}
else
{ printf("写入内容长度:");
scanf("%d",&len);
printf("写入文件中....\n");
for(i=arunning->wpoint;i<(arunning->wpoint+len);i++)
{
printf("> ");
Sleep(200);
}
arunning->wpoint=arunning->wpoint+len;
while(fp!=null)
{ if(strcmp(arunning->openfname,fp->fname)==0)
{fp->length=arunning->wpoint;
break;
}
fp=fp->fnext;
}
printf("写入完毕!\n");
close();
}
}
/***********************文件操作选择**********************/
void opfile(MFD *f)
{
char cmd[12];
while(1)
{
printf("输入命令:>\\");
scanf("%s",cmd);
if(strcmp(cmd,"create")==0) createfile(f); //创建命令
else if(strcmp(cmd,"delete")==0) fdelete(f); //删除命令
else if(strcmp(cmd,"read")==0) read(f); //读取命令
else if(strcmp(cmd,"write")==0) write(f); //写入命令
else if(strcmp(cmd,"open")==0) open(f); //打开命令
else if(strcmp(cmd,"close")==0) close(); //关闭命令
else if(strcmp(cmd,"view")==0) fprint(f); //查看命令
else if(strcmp(cmd,"exit")==0) break;
else if(strcmp(cmd,"help")==0) help(); //帮助命令
}
}
/*****************插入用户到用户队列*******************/
void uinsert()
{
MFD *first,*second;
if(mready==null)
{
mp->unext=mready;
mready=mp;
}
else
{ first=mready;
second=first->unext;
while(second!=null)
{ first=first->unext;
second=second->unext;
}
first->unext=mp;
}
usernum=usernum+1;//增加一个用户
}
/*********************添加多个用户*********************/
void uinit()
{
int i,n;
printf("请输入创建用户个数: ");
RE: scanf("%d",&n);
if(n>(10-usernum)) {printf("现在最多能创建的用户个数为%d,请重新输入创建个数:",(10-usernum));goto RE;}
else
{
for(i=0;i<n;i++)
{
RE2: printf("=====第%d个用户=====\n",i+1);
mp=getpch(MFD);
printf("用户名:");
scanf("%s",mp->uname);
mp->flink=null;
mp->unext=null;
if(checkuser(mp)) {printf("用户已经存在,请重新输入!\n");goto RE2;}
uinsert();
}
}
}
/*********************创建单个用户*********************/
void usercre()
{
if(usernum==10) printf("能创建的用户个数已经满,无法再创建用户!\n");
else{
printf("=====创建新用户=====\n");
mp=getpch(MFD);
printf("用户名:");
scanf("%s",mp->uname);
mp->flink=null;
mp->unext=null;
if(checkuser(mp)) printf("用户已经存在,无法创建!\n");
else uinsert();
}
}
/*******************显示用户**************************/
void uprint()
{
MFD *p=mready;
int j=1;
if(p==null)printf("当前没有用户!");
else{
while (p!=null)
{
printf("第%d个用户名是:",j);
printf("%s\n",p->uname);
p=p->unext;
j++;
}}
}
/*******************查询用户是否在列表中******************/
MFD* checkload(char name[12])
{
MFD *a;
a=mready;
while(a!=null)
{
if(strcmp(name,a->uname)==0)
{
printf("\n找到用户!\n") ;
return a;
}
a=a->unext;
}
printf("\n用户不存在!\n");
return null;
}
/********************登陆用户***********************/
MFD* load()
{char name[12];
MFD*f;
printf("\n请输入登陆用户名:");
scanf("%s",name);
f=checkload(name);
if(f!=null)
{
fprint(f);
return f;
}
else
return null;
}
/**********************主目录****************************/
void menu()
{int i;
REP:
printf("\t\t\t********** File System **********\n");
printf("\t\t\t\t1-用户登陆\n");
printf("\t\t\t\t2-创建单个用户\n");
printf("\t\t\t\t3-创建多个用户\n");
printf("\t\t\t\t4-查看所有用户\n");
printf("\t\t\t\t5-退出系统\n");
printf("\t\t\t*********************************\n");
scanf("%d",&i);
switch(i)
{
case 1:{
ff=load();
if(ff==null)goto REP;
opfile(ff);
break;
}
case 2:{usercre();goto REP;break;}
case 3:{ uinit();goto REP;break;}
case 4:{uprint() ; goto REP;break;}
case 5:{
flag=1;
if(arunning!=null)close();
break;}
}
}
/*********************主函数***********************/
void main ()
{
while(flag==0)
{
menu();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -