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

📄 filesystem.c

📁 用TC编写的文件管理系统
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "stdio.h"

#include "string.h"

#include "conio.h"

#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;

 

int 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);//可以同时设置文本的字符和背景颜色的函数 
//textattr(0|15);

 clrscr();   /*clear screen*/

 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,"creat")==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,"modify")==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.");

return 0;

}

//========================================================= 

void help(void)

{

printf("\nThe Command List\n");

printf("\nCd  Attrib  Creat  Modify  Read  Open  Cls  Delete  Exit  Close\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 + -