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

📄 wenjian.c

📁 广东工业大学操作系统课程设计(全) 广东工业大学操作系统课程设计(全 )
💻 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;

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*/
 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.");
}

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");
      fclose(fp_file);

⌨️ 快捷键说明

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