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

📄 file.c

📁 模拟文件系统实现的基本功能
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "stdio.h"
#include "string.h"
#include "conio.h"  /*borland C*/ /*getch()*/
#include "stdlib.h"
#define MAXNAME 25  /*the largest length of mfdname,ufdname,filename*/
#define MAXCHILD 50 /*the largest child*/
#define MAX (MAXCHILD*MAXCHILD) /*the size of fpaddrno*/

typedef struct  /*the structure of OSFILE*/
  {int  fpaddr;                /*file physical address*/
   int  flength;               /*file length*/
   int  fmode;   /*file mode:0-Read Only;1-Write Only;2-Read and Write(default);*/
   char fname[MAXNAME];        /*file name*/
  } OSFILE;

typedef struct     /*the structure of OSUFD*/
  {char ufdname[MAXNAME];   /*ufd name*/
   OSFILE ufdfile[MAXCHILD];   /*ufd own file*/
  }OSUFD;

typedef struct  /*the structure of OSUFD'LOGIN*/
  {char ufdname[MAXNAME];       /*ufd name*/
   char ufdpword[8];            /*ufd password*/
  } OSUFD_LOGIN;

typedef struct     /*file open mode*/
  {int ifopen;     /*ifopen:0-close,1-open*/
   int openmode;   /*0-read only,1-write only,2-read and write,3-initial*/
  }OSUFD_OPENMODE;

OSUFD *ufd[MAXCHILD];   /*ufd and ufd own files*/
OSUFD_LOGIN ufd_lp;

int ucount=0;  /*the count of mfd's ufds*/
int fcount[MAXCHILD];  /*the count of ufd's files*/
int loginsuc=0; /*whether login successfully*/
char username[MAXNAME];  /*record login user's name22*/
char dirname[MAXNAME];/*record current directory*/
int fpaddrno[MAX];  /*record file physical address num*/
OSUFD_OPENMODE ifopen[MAXCHILD][MAXCHILD]; /*record file open/close*/
int wgetchar; /*whether getchar()*/

FILE *fp_mfd,*fp_ufd,*fp_file_p,*fp_file;

void main()
{int i,j,choice1;
 char choice[50];  /*choice operation:dir,create,delete,open,delete,modify,read,write*/
 int choiceend=1;  /*whether choice end*/
 char *rtrim(char *str);  /*remove the trailing blanks.*/
 char *ltrim(char *str);  /*remove the heading blanks.*/
 void LoginF();  /*LOGIN FileSystem*/
 void DirF();  /*Dir FileSystem*/
 void CdF();  /*Change Dir*/
 void CreateF();  /*Create File*/
 void DeleteF(); /*Delete File*/
 void ModifyFM(); /*Modify FileMode*/
 void OpenF();  /*Open File*/
 void CloseF();  /*Close File*/
 void ReadF(); /*Read File*/
 void WriteF(); /*Write File*/
 void QuitF(); /*Quit FileSystem*/
 void help();
 if((fp_mfd=fopen("c:\\osfile\\mfd","rb"))==NULL)
   {fp_mfd=fopen("c:\\osfile\\mfd","wb");
	fclose(fp_mfd);
   }

 for(i=0;i<MAX;i++) fpaddrno[i]=0;
 textattr(BLACK*16|WHITE);
 clrscr();   /*clear screen*/
 printf("Welcome to the FileSystem!(Owed by ZhangJian&&ZhangYanFeng!)\n");
 LoginF();   /*user login*/
 clrscr();

 if(loginsuc==1)  /*Login Successfully*/
 {while (1)
 {wgetchar=0;
  if (choiceend==1)
  {printf("\n\nC:\\%s>",strupr(dirname));}
  else printf("Bad command or file name.\nC:\\%s>",strupr(username));
   gets(choice);
   strcpy(choice,ltrim(rtrim(strlwr(choice))));
   if (strcmp(choice,"dir")==0) choice1=1;
   else if(strcmp(choice,"create")==0) choice1=2;
   else if(strcmp(choice,"delete")==0) choice1=3;
   else if(strcmp(choice,"attrib")==0) choice1=4;
   else if(strcmp(choice,"open")==0) choice1=5;
   else if(strcmp(choice,"close")==0) choice1=6;
   else if(strcmp(choice,"read")==0) choice1=7;
   else if(strcmp(choice,"write")==0) choice1=8;
   else if(strcmp(choice,"exit")==0) choice1=9;
   else if(strcmp(choice,"cls")==0) choice1=10;
   else if(strcmp(choice,"cd")==0) choice1=11;
   else if(strcmp(choice,"help")==0) choice1=20;
   else choice1=12;
	 switch(choice1)
	   {case 1:DirF();choiceend=1;break;
	case 2:CreateF();choiceend=1;if(!wgetchar) getchar();break;
	case 3:DeleteF();choiceend=1;if(!wgetchar)getchar();break;
	case 4:ModifyFM();choiceend=1;if(!wgetchar) getchar();break;
	case 5:choiceend=1;OpenF();if (!wgetchar) getchar();break;
	case 6:choiceend=1;CloseF();if (!wgetchar) getchar();break;
	case 7:choiceend=1;ReadF();if (!wgetchar) getchar();break;
	case 8:choiceend=1;WriteF();if (!wgetchar) getchar();break;
	case 9:printf("\nYou have exited this system.");
		   QuitF();exit(0);break;
	case 10:choiceend=1;clrscr();break;
	case 11:CdF();choiceend=1;break;
	case 20:help();choiceend=1;break;
	default:choiceend=0;
	   }
	  }
}
else printf("\nAccess denied.");
}

void help(void)
{
printf("\nThe Command List\n");
printf("\nopen  create  write  read  delete  close  exit\n");
}
char *rtrim(char *str)  /*remove the trailing blanks.*/
{int n=strlen(str)-1;
 while(n>=0)
 {if(*(str+n)!=' ')
   {*(str+n+1)='\0';
	break;
   }
   else n--;
 }
 if (n<0) str[0]='\0';
 return str;
}

char *ltrim(char *str) /*remove the heading blanks.*/
{char *rtrim(char *str);
 strrev(str);
 rtrim(str);
 strrev(str);
 return str;
}

void LoginF()  /*LOGIN FileSystem*/
{char loginame[MAXNAME],loginpw[9],logincpw[9],str[50];
 int i,j,flag=1;
 char a[25];
 int findout; /*login user not exist*/
 char *rtrim(char *str);  /*remove the trailing blanks.*/
 char *ltrim(char *str);  /*remove the heading blanks.*/
 void InputPW(char *password);  /*input password,use '*' replace*/
 void SetPANo(int RorW);  /*Set physical address num*/
 while(1)
 {findout=0;
 printf("\n\nLogin Name:");
 gets(loginame);
 ltrim(rtrim(loginame));
 fp_mfd=fopen("c:\\osfile\\","rb");
 for(i=0;fread(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd)!=0;i++)
  if (strcmp(strupr(ufd_lp.ufdname),strupr(loginame))==0)
	{findout=1;
	 strcpy(logincpw,ufd_lp.ufdpword);
	}
 fclose(fp_mfd);
 if (findout==1)  /*user exist*/
	{printf("Login Password:");
	 InputPW(loginpw); /*input password,use '*' replace*/
	  if (strcmp(loginpw,logincpw)==0)
	 {strcpy(username,strupr(loginame));
	  strcpy(dirname,username);
	  fp_mfd=fopen("c:\\osfile\\","rb");
	  for(j=0;fread(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd)!=0;j++)
		{strcpy(str,"c:\\osfile\\");
		 strcat(str,ufd_lp.ufdname);
		 ufd[j]=(OSUFD*)malloc(sizeof(OSUFD));
		 strcpy(ufd[j]->ufdname,strupr(ufd_lp.ufdname));
		 fp_ufd=fopen(str,"rb");
		 fcount[j]=0;
		 for(i=0;fread(&ufd[j]->ufdfile[i],sizeof(OSFILE),1,fp_ufd)!=0;i++,fcount[j]++)
		   {ifopen[j][i].ifopen=0;
		   ifopen[j][i].openmode=4;}
		 fclose(fp_ufd);}
	  fclose(fp_mfd);
	  ucount=j;
		 SetPANo(0);
	 printf("\n\nLogin successful! Welcome to this FileSystem\n\n");
	 loginsuc=1;
	 return;}
	  else
	 {printf("\n\n");
	  flag=1;
	  while(flag)
	  {printf("Login Failed!  Password Error.  Try Again(Y/N):");
	  gets(a);
	  ltrim(rtrim(a));
	  if (strcmp(strupr(a),"Y")==0) {loginsuc=0;flag=0;}
	  else if(strcmp(strupr(a),"N")==0){loginsuc=0;flag=0;return;}
	  }
	 }
	  }
 else
	  {printf("New Password(<=8):");
	   InputPW(loginpw); /*input new password,use '*' replace*/
	   printf("\nConfirm Password(<=8):"); /*input new password,use '*' replace*/
	   InputPW(logincpw);
	  if (strcmp(loginpw,logincpw)==0)
	 {strcpy(ufd_lp.ufdname,strupr(loginame));
	  strcpy(ufd_lp.ufdpword,loginpw);
	  fp_mfd=fopen("c:\\osfile\\","ab");
	  fwrite(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd);
	  fclose(fp_mfd);
	  strcpy(username,strupr(loginame));
	  strcpy(dirname,loginame);
	  strcpy(str,"c:\\osfile\\");
	  strcat(str,username);
	  if((fp_ufd=fopen(str,"rb"))==NULL)
		{fp_ufd=fopen(str,"wb");
		 fclose(fp_ufd);
		}
	  fp_mfd=fopen("c:\\osfile\\","rb");
	  for(j=0;fread(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd)!=0;j++)
		{strcpy(str,"c:\\osfile\\");
		 strcat(str,ufd_lp.ufdname);
		 ufd[j]=(OSUFD*)malloc(sizeof(OSUFD));
		 strcpy(ufd[j]->ufdname,strupr(ufd_lp.ufdname));
		 fp_ufd=fopen(str,"rb");
		 for(i=0;fread(&ufd[j]->ufdfile[i],sizeof(OSFILE),1,fp_ufd)!=0;i++,fcount[j]++)
		   {ifopen[j][i].ifopen=0;
		   ifopen[j][i].openmode=4;}
		 fclose(fp_ufd);}
	  fclose(fp_mfd);
	  ucount=j;
	  SetPANo(0);
	  printf("\n\nLogin Successful! Welcome to this System\n\n");
	  loginsuc=1;
	  return;
	  }
	  else
	  {printf("\n\n");
	  flag=1;
	  while(flag)
	  {printf("Login Failed! Password Error. Try Again(Y/N):");
	  gets(a);
	  ltrim(rtrim(a));
	  if (strcmp(strupr(a),"Y")==0) {loginsuc=0;flag=0;}
	  else if(strcmp(strupr(a),"N")==0){loginsuc=0;flag=0;return;}
	  }
	  }
 }
 }
 }

void SetPANo(int RorW)  /*Set physical address num,0-read,1-write*/
{int i,j;
 if (RorW==0)
	{if((fp_file_p=fopen("c:\\osfile\\file\\file_p","rb"))==NULL)
	    {fp_file_p=fopen("c:\\osfile\\file\\file_p","wb");
	     fclose(fp_file_p);
	    }
	 fp_file_p=fopen("c:\\osfile\\file\\file_p","rb");
	 for(i=0;fread(&j,sizeof(int),1,fp_file_p)!=0;i++)
	   fpaddrno[j]=1;
	 /*for(i=1;i<MAX;i++)
	   if ((i%13)==0) fpaddrno[i]=1;*/
	}
 else
	{fp_file_p=fopen("c:\\osfile\\file\\file_p","wb");
	 /*for(i=1;i<MAX;i++)
	   if((i%13)==0) fpaddrno[i]=0;*/
	 for(i=0;i<MAX;i++)
	 if (fpaddrno[i]==1)
		fwrite(&i,sizeof(int),1,fp_file_p);
	 }
 fclose(fp_file_p);
}

void InputPW(char *password)  /*input password,use '*' replace*/
{int j;
 for(j=0;j<=7;j++)
	{password[j]=getch();
	 if ((int)(password[j])!=13)
	   {if((int)(password[j])!=8)
		  putchar('*');
		else
		  {if (j>0)
		{j--;j--;
		 putchar('\b');putchar(' ');putchar('\b');
		}
		else j--;
		  }
		}
	 else
	  {password[j]='\0';
	   break;
	  }
	}
 password[j]='\0';
}

void DirF()  /*Dir FileSystem*/
{int i,j,count=0;
 char sfmode[25],sfpaddr[25],str[25];
 int ExistD(char *dirname);  /*Whether DirName Exist,Exist-i,Not Exist-0*/
 clrscr();
 if (strcmp(strupr(ltrim(rtrim(dirname))),"")!=0)
 {printf("\n\nC:\\%s>dir\n",dirname);
  printf("\n%14s%16s%14s%10s%18s\n","FileName","FileAddress","FileLength","Type","FileMode");
  j=ExistD(dirname);
 for(i=0;i<fcount[j];i++)
   {if ((i%16==0)&&(i!=0))
	 {printf("\nPress any key to continue..");
	 getch();
	 clrscr();
	 printf("\n%14s%16s%14s%10s%18s\n","FileName","FileAddress","FileLength","Type","FileMode");
	 }
	itoa(ufd[j]->ufdfile[i].fpaddr,str,10);
	strcpy(sfpaddr,"file");
	strcat(sfpaddr,str);
	if (ufd[j]->ufdfile[i].fmode==0) strcpy(sfmode,"Read Only");
	else if(ufd[j]->ufdfile[i].fmode==1) strcpy(sfmode,"Write Only");
	else if(ufd[j]->ufdfile[i].fmode==2)strcpy(sfmode,"Read And Write");
	else strcpy(sfmode,"Protect");
	printf("%14s%16s%14d%10s%18s\n",ufd[j]->ufdfile[i].fname,sfpaddr,ufd[j]->ufdfile[i].flength,"<FILE>",sfmode);
   }
 printf("\n %3d file(s)\n",fcount[j]);}
 else
 {printf("\n\nC:\\>dir\n");
  printf("\n%14s%18s%8s\n","DirName","OwnFileCount","Type");
  for(i=0;i<ucount;i++)
   {if ((i%16==0)&&(i!=0))
	 {printf("\nPress any key to continue...");
	 getch();
	 clrscr();
	   printf("\n%14s%18s%8s\n","DirName","OwnFileCount","Type");
	}
	printf("%14s%18d%8s\n",ufd[i]->ufdname,fcount[i],"<UFD>");
	count=count+fcount[i];
   }
  printf("\n %3d dir(s),%5d file(s)\n",ucount,count);
 }
}

int ExistD(char *dirname)  /*Whether DirName Exist,Exist-i,Not Exist-0*/
{int i;
 int exist=0;
 for(i=0;i<ucount;i++)
   if (strcmp(strupr(ufd[i]->ufdname),strupr(dirname))==0)
	  {exist=1;
	   break;
	  }
 if (exist) return(i);
 else return(-1);
}

void CdF() /*Exchange Dir*/
{char dname[MAXNAME];
 char *rtrim(char *str);  /*remove the trailing blanks.*/
 char *ltrim(char *str);  /*remove the heading blanks.*/
 int ExistD(char *filename);  /*Whether FileName Exist,Exist-i,Not Exist-0*/
 printf("\nPlease input DirName (cd..-Previous dir; DirNAME-cd [DirNAME]):");
 gets(dname);
 ltrim(rtrim(dname));
 if (ExistD(dname)>=0)  strcpy(dirname,strupr(dname));
 else if(strcmp(strupr(dname),"CD..")==0)  strcpy(ltrim(rtrim(dirname)),"");
 else printf("\nError.\'%s\' does not exist.\n",dname);
}

void CreateF()  /*Create File*/
{int fpaddrno,flag=1,i;
 char fname[MAXNAME],str[50],str1[50],strtext[255],a[25];
 char fmode[25];

 char *rtrim(char *str);  /*remove the trailing blanks.*/
 char *ltrim(char *str);  /*remove the heading blanks.*/
 int FindPANo();  /*find out physical address num*/
 int WriteF1(); /*write file*/
 int ExistF(char *filename);  /*Whether FileName Exist,Exist-i,Not Exist-0*/
 int ExistD(char *dirname);
 if (strcmp(strupr(dirname),strupr(username))!=0)
 {printf("\nError. You must create file in your own dir.\n");wgetchar=1;}
 else
 {
 printf("\nPlease input FileName:");
 gets(fname);
 ltrim(rtrim(fname));
 if (ExistF(fname)>=0)
   {printf("\nError. Name \'%s\' has already existed.\n",fname);
	wgetchar=1;
   }
 else
   {printf("Please input FileMode(0-Read Only, 1-Write Only, 2-Read and Write, 3-Protect):");
	gets(fmode);
	ltrim(rtrim(fmode));
	if((strcmp(fmode,"0")==0)||(strcmp(fmode,"1")==0)||(strcmp(fmode,"2")==0)||(strcmp(fmode,"3")==0))
	  {fpaddrno=FindPANo();
	   if (fpaddrno>=0)
	 {i=ExistD(username);
	  strcpy(ufd[i]->ufdfile[fcount[i]].fname,fname);
	  ufd[i]->ufdfile[fcount[i]].fpaddr=fpaddrno;
	  ufd[i]->ufdfile[fcount[i]].fmode=atoi(fmode);
	  ifopen[i][fcount[i]].ifopen=0;
	  ifopen[i][fcount[i]].openmode=4;
	  strcpy(str,"c:\\osfile\\file\\file");
	  itoa(fpaddrno,str1,10);
	  strcat(str,str1);
	  fp_file=fopen(str,"wb");

⌨️ 快捷键说明

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