文件系统的C语言实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

⽂件系统的C语⾔实现#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define MEM_D_SIZE 1024*1024
#define DISKSIZE 256
#define MSD 5
#define DISK_NUM MEM_D_SIZE/DISKSIZE
#define FATSIZE DISK_NUM*sizeof(struct fatitem)
#define MOFN 5
#define ROOT_DISK_NO 1+FATSIZE/DISKSIZE
#define ROOT_DISK_SIZE sizeof(struct direct)
struct fatitem
{
int item;
char em_disk;
};
struct direct
{
struct FCB
{
char name[9];
char property;
int size;
int firstdisk;
int next;
int sign;
}directitem[MSD+2];
};
struct opentable
{
struct opentableitem
{
char name[9];
int firstdisk;
int size;
}openitem[MOFN];
int cur_size;
};
struct fatitem *fat;
struct direct *root;
struct direct *cur_dir;
struct opentable u_opentable;
int fd=-1;
char *bufferdir;
char *fdisk;
void initfile();
void format();
void enter();
void halt();
int create(char *name);
int open(char *name);
int close(char *name);
int write(int fd,char *buf,int len);
int read(int fd,char *buf,int len);
int del(char *name);
int cd(char *name);
void print();
void initfile()
{
fdisk=(char *)malloc(MEM_D_SIZE*sizeof(char)); format();
free(fdisk);
}
void format()
{
int i;
FILE *fp;
fat=(struct fatitem *)(fdisk+DISKSIZE);
fat[0].item=-1;
fat[0].em_disk='1';
for(i=1;i<ROOT_DISK_NO-1;i++)
{
fat[i].item=i+1;
fat[i].em_disk='1';
}
fat[ROOT_DISK_NO-1].item=-1;
fat[ROOT_DISK_NO-1].em_disk='1';
fat[ROOT_DISK_NO].item=-1;
fat[ROOT_DISK_NO].em_disk='1';
for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)
{
fat[i].item=-1;
fat[i].em_disk='0';
}
root=(struct direct *)(fdisk+DISKSIZE+FATSIZE); root->directitem[0].sign=1;
root->directitem[0].firstdisk=ROOT_DISK_NO; strcpy(root->directitem[0].name,".");
root->directitem[0].next=root->directitem[0].firstdisk; root->directitem[0].property='1';
root->directitem[0].size=ROOT_DISK_SIZE;
root->directitem[1].sign=1;
root->directitem[1].firstdisk=ROOT_DISK_NO; strcpy(root->directitem[1].name,"..");
root->directitem[1].next=root->directitem[1].firstdisk; root->directitem[1].property='1';
root->directitem[1].size=ROOT_DISK_SIZE;
for(i=2;i<MSD+2;i++)
{
root->directitem[i].sign=0;
root->directitem[i].firstdisk=-1;
strcpy(root->directitem[i].name,"");
root->directitem[i].next=-1;
root->directitem[i].property='0';
root->directitem[i].size=0;
}
if((fp=fopen("data.txt","wb"))==NULL)
{
printf("Error:Can not open file!\n");
return;
}
if(fwrite(fdisk,MEM_D_SIZE,1,fp)!=1)
printf("Error:File write error!\n");
{
int i;
FILE *fp;
fdisk=(char *)malloc(MEM_D_SIZE*sizeof(char)); if((fp=fopen("data.txt","rb"))==NULL)
{
printf("Error:Can not open file!\n");
return;
}
fread(fdisk,MEM_D_SIZE,1,fp);
fat=(struct fatitem *)(fdisk+DISKSIZE);
root=(struct direct *)(fdisk+DISKSIZE+FATSIZE); fclose(fp);
for(i=0;i<MOFN;i++)
{
strcpy(u_opentable.openitem[i].name,"");
u_opentable.openitem[i].firstdisk=-1;
u_opentable.openitem[i].size=0;
}
u_opentable.cur_size=0;
cur_dir=root;
bufferdir=(char *)malloc(sizeof(char));
strcpy(bufferdir,"C:");
}
void halt()
{
int i;
FILE *fp;
if((fp=fopen("data.txt","wb"))==NULL)
{
printf("Error:Can not open file!\n");
return;
}
if(fwrite(fdisk,MEM_D_SIZE,1,fp)!=1)
printf("Error:File write error!\n");
fclose(fp);
free(fdisk);
for(i=0;i<MOFN;i++)
{
strcpy(u_opentable.openitem[i].name,"");
u_opentable.openitem[i].firstdisk=0;
u_opentable.openitem[i].size=0;
}
u_opentable.cur_size=0;
}
int create(char *name)
{
int i,j;
if(strlen(name)>8)
return(-1);
for(i=2;i<MSD+2;i++)
{
if(cur_dir->directitem[i].firstdisk==-1)
break;
}
for(j=2;j<MSD+2;j++)
{
if(!strcmp(cur_dir->directitem[j].name,name)) break;
if(u_opentable.cur_size>=MOFN)
return (-3);
if(j<MSD+2)
return(-4);
for(j=ROOT_DISK_NO+1;j<DISK_NUM;j++)
if(fat[j].em_disk=='0')
break;
fat[j].em_disk='1';
strcpy(cur_dir->directitem[i].name,name);
cur_dir->directitem[i].firstdisk=j;
cur_dir->directitem[i].size=0;
cur_dir->directitem[i].next=j;
cur_dir->directitem[i].property='0';
fd=open(name);
return 0;
}
int open(char *name)
{
int i,j;
for(i=2;i<MSD+2;i++)
if(!strcmp(cur_dir->directitem[i].name,name))
break;
if(i>=MSD+2)
return(-1);
for(j=0;j<MOFN;j++)
if(!strcmp(u_opentable.openitem[j].name,name))
break;
if(j<MOFN)
return(-2);
if(u_opentable.cur_size>=MOFN)
return(-3);
for(j=0;j<MOFN;j++)
if(u_opentable.openitem[j].firstdisk==-1)
break;
u_opentable.openitem[j].firstdisk=cur_dir->directitem[i].firstdisk; strcpy(u_opentable.openitem[j].name,name);
u_opentable.openitem[j].size=cur_dir->directitem[i].size;
u_opentable.cur_size++;
return (j);
}
int close(char *name)
{
int i;
for(i=0;i<MOFN;i++)
{
if(!strcmp(u_opentable.openitem[i].name,name))
break;
}
if(i>=MOFN)
return(-1);
strcpy(u_opentable.openitem[i].name,"");
u_opentable.openitem[i].firstdisk=-1;
u_opentable.openitem[i].size=0;
u_opentable.cur_size--;
fd=-1;
return 0;
}
int write(int fd,char *buf,int len)
char * first;
int ilen1,ilen2,modlen,temp;
item=u_opentable.openitem[fd].firstdisk;
for(i=2;i<MSD+2;i++)
if(cur_dir->directitem[i].firstdisk==item)
break;
temp=i;
while(fat[item].item!=-1)
item=fat[item].item;
first=fdisk+item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE;
if((DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE)>len)
{
strcpy(first,buf);
u_opentable.openitem[fd].size=u_opentable.openitem[fd].size+len;
cur_dir->directitem[temp].size=cur_dir->directitem[temp].size+len;
}
else
{
for(i=0;i<(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);i++)
first[i]=buf[i];
ilen1=len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);
ilen2=ilen1/DISKSIZE;
modlen=ilen1%DISKSIZE;
if(modlen>0)
ilen2=ilen2+1;
for(j=0;j<ilen2;j++)
{
for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)
if(fat[i].em_disk=='0')
break;
if(i>=DISK_NUM)
return(-1);
first=fdisk+i*DISKSIZE;
if(j==ilen2-1)
{
for(k=0;k<len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE)-j*DISKSIZE;k++) first[k]=buf[k];
}
else
{
for(k=0;k<DISKSIZE;k++)
first[k]=buf[k];
}
fat[item].item=i;
fat[i].em_disk='1';
fat[i].item=-1;
}
u_opentable.openitem[fd].size=u_opentable.openitem[fd].size+len;
cur_dir->directitem[temp].size=cur_dir->directitem[temp].size+len;
}
return 0;
}
int read(int fd,char *buf,int len)
{
char *first;
int i,j;
int item;
int ilen1,modlen;
item=u_opentable.openitem[fd].firstdisk;
ilen1=len/DISKSIZE;
modlen=len%DISKSIZE;
if(modlen!=0)
{
ilen1=ilen1+1;
}
first=fdisk+item*DISKSIZE;
for(i=0;i<ilen1;i++)
{
if(i==ilen1-1)
{
for(j=0;j<len-i*DISKSIZE;j++)
buf[i*DISKSIZE+j]=first[j];
}
else
{
for(j=0;j<len-i*DISKSIZE;j++)
buf[i*DISKSIZE+j]=first[j];
item=fat[item].item;
first=fdisk+item*DISKSIZE;
}
}
return 0;
}
int del(char *name)
{
int i,cur_item,item,temp;
for(i=2;i<MSD+2;i++)
if(!strcmp(cur_dir->directitem[i].name,name)) break;
cur_item=i;
if(i>=MSD+2)
return(-1);
if(cur_dir->directitem[cur_item].property!='0') return(-3);
for(i=0;i<MOFN;i++)
if(!strcmp(u_opentable.openitem[i].name,name)) return(-2);
item=cur_dir->directitem[cur_item].firstdisk; while(item!=-1)
{
temp=fat[item].item;
fat[item].item=-1;
fat[item].em_disk='0';
item=temp;
}
cur_dir->directitem[cur_item].sign=0;
cur_dir->directitem[cur_item].firstdisk=-1; strcpy(cur_dir->directitem[cur_item].name,""); cur_dir->directitem[cur_item].next=-1;
cur_dir->directitem[cur_item].property='0';
cur_dir->directitem[cur_item].size=0;
return 0;
}
int mkdir(char* name)
struct direct *cur_mkdir;
if(strlen(name)>8)
return(-1);
for(i=2;i<MSD+2;i++)
{
if(cur_dir->directitem[i].firstdisk==-1)
break;
}
if(i>=MSD+2)
return(-2);
for(j=2;j<MSD+2;j++)
{
if(!strcmp(cur_dir->directitem[j].name,name))
break;
}
if(j<MSD+2)
return(-3);
for(j=ROOT_DISK_NO+1;j<DISK_NUM;j++)
if(fat[j].em_disk=='0')
break;
fat[j].em_disk='1';
strcpy(cur_dir->directitem[i].name,name);
cur_dir->directitem[i].firstdisk=j;
cur_dir->directitem[i].size=ROOT_DISK_SIZE;
cur_dir->directitem[i].next=j;
cur_dir->directitem[i].property='1';
cur_mkdir=(struct direct*)(fdisk+cur_dir->directitem[i].firstdisk*DISKSIZE); cur_mkdir->directitem[0].sign=0;
cur_mkdir->directitem[0].firstdisk=cur_dir->directitem[i].firstdisk;
strcpy(cur_mkdir->directitem[0].name,".");
cur_mkdir->directitem[0].next=cur_mkdir->directitem[0].firstdisk;
cur_mkdir->directitem[0].property='1';
cur_mkdir->directitem[0].size=ROOT_DISK_SIZE;
cur_mkdir->directitem[1].sign=0;
cur_mkdir->directitem[1].firstdisk=cur_dir->directitem[0].firstdisk;
strcpy(cur_mkdir->directitem[1].name,"..");
cur_mkdir->directitem[1].next=cur_mkdir->directitem[1].firstdisk;
cur_mkdir->directitem[1].property='1';
cur_mkdir->directitem[1].size=ROOT_DISK_SIZE;
for(i=2;i<MSD+2;i++)
{
cur_mkdir->directitem[i].sign=0;
cur_mkdir->directitem[i].firstdisk=-1;
strcpy(cur_mkdir->directitem[i].name,"");
cur_mkdir->directitem[i].next=-1;
cur_mkdir->directitem[i].property='0';
cur_mkdir->directitem[i].size=0;
}
return 0;
}
int rmdir(char* name)
{
int i,j,item;
struct direct *temp_dir;
if(!strcmp(cur_dir->directitem[i].name,name)) break;
}
if(cur_dir->directitem[i].property!='1')
return(-3);
if(i>=MSD+2)
return(-1);
temp_dir=(struct direct
*)(fdisk+cur_dir->directitem[i].next*DISKSIZE); for(j=2;j<MSD+2;j++)
{
if(temp_dir->directitem[j].next!=-1)
break;
}
if(j<MSD+2)
return(-2);
item=cur_dir->directitem[i].firstdisk;
fat[item].em_disk='0';
cur_dir->directitem[i].sign=0;
cur_dir->directitem[i].firstdisk=-1;
strcpy(cur_dir->directitem[i].name,"");
cur_dir->directitem[i].next=-1;
cur_dir->directitem[i].property='0';
cur_dir->directitem[i].size=0;
return 0;
}
void dir()
{
int i;
for(i=0;i<MSD+2;i++)
{
if(cur_dir->directitem[i].firstdisk!=-1)
{
printf("%s\t",cur_dir->directitem[i].name);
if(cur_dir->directitem[i].property=='0')
printf("%d\t\t\n",cur_dir->directitem[i].size); else
printf("\t<DIR>\t\n");
}
}
}
int cd(char *name)
{
int i,j,item;
char *str,*str1;
char *temp,*point,*point1;
struct direct *temp_dir;
temp_dir=cur_dir;
str=name;
str1=strchr(str,'\');
while(str1!=NULL)
{
temp=(char *)malloc(sizeof(char));
for(i=0;i<str1-str;i++)
temp[i]=str[i];
temp[i]='{fckeditor}';
if(!strcmp(temp_dir->directitem[j].name,temp)) break;
}
if(j>=MSD+2)
return(-1);
item=temp_dir->directitem[j].firstdisk;
temp_dir=(struct direct *)(fdisk+item*DISKSIZE); str=str1+1;
str1=strchr(str,'\');
}
str1=str1+strlen(str);
temp=(char *)malloc(sizeof(char));
for(i=0;i<(int)strlen(str);i++)
temp[i]=str[i];
temp[i]='{fckeditor}';
for(j=0;j<MSD+2;j++)
{
if(!strcmp(temp_dir->directitem[j].name,temp)) break;
}
if(temp_dir->directitem[j].property!='1')
return(-2);
if(j>=MSD+2)
return(-1);
item=temp_dir->directitem[j].firstdisk;
temp_dir=(struct direct
*)(fdisk+item*DISKSIZE);
if(!strcmp("..",name))
{
if(cur_dir->directitem[j].sign!=1)
{
point=strchr(bufferdir,'\');
while(point!=NULL)
{
point1=point+1;
point=strchr(point1,'\');
}
*(point1-1)='{fckeditor}';
}
}
else if(!strcmp(".",name))
{
bufferdir=bufferdir;
}
else
{
bufferdir=strcat(bufferdir,"\");
bufferdir=strcat(bufferdir,name);
}
cur_dir=temp_dir;
return 0;
}
void show()
void print()
{
printf("*******************************************************************************\n"); printf("\t\t Welcome to MY DOS file system! \n");
printf("*******************************************************************************\n"); printf("\t\t退出⽂件系统 halt \n");
printf("\t\t创建⽂件 create ⽂件名\n");
printf("\t\t打开⽂件 open ⽂件名\n");
printf("\t\t关闭⽂件 close ⽂件名\n");
printf("\t\t打开⽂件 open ⽂件名\n");
printf("\t\t写⽂件 write \n");
printf("\t\t读⽂件 read \n");
printf("\t\t删除⽂件 del ⽂件名\n");
printf("\t\t创建⼦⽬录 mkdir ⽬录名\n");
printf("\t\t删除⼦⽬录 rmdir ⽬录名\n");
printf("\t\t显⽰当前⽬录的⼦⽬录 dir \n");
printf("\t\t更改当前⽬录 cd ⽬录名\n");
printf("*******************************************************************************\n"); }
void main()
{
FILE *fp;
char ch;
char a[100];
char code[11][10];
char name[10];
int i,flag,r_size;
char *contect;
contect=(char *)malloc(sizeof(char));
if((fp=fopen("data.txt","rb"))==NULL)
{
printf("You have not format!\nDo you want format?(y/n)");
scanf("%c",&ch);
if(ch=='y')
{
initfile();
printf("Successfully format!\n");
}
else
return;
}
enter();
print();
show();
strcpy(code[0],"halt");
strcpy(code[1],"create");
strcpy(code[2],"open");
strcpy(code[3],"close");
strcpy(code[4],"write");
strcpy(code[5],"read");
strcpy(code[6],"del");
strcpy(code[9],"dir");
strcpy(code[10],"cd");
while(1)
{
scanf("%s",a);
for(i=0;i<11;i++)
{
if(!strcmp(code[i],a))
break;
}
switch(i)
{
case 0:
halt();
return;
case 1:
scanf("%s",name);
flag=create(name);
if(flag==-1)
printf("Error:\nThe length of name is too long!\n"); else if(flag==-2)
{
printf("Error:\nThe direct item is already full!\n");
}
else if(flag==-3)
{
printf("Error:\nThe number of open file is too much!\n"); }
else if(flag==-4)
printf("Error:\nThe name is already in the direct!\n"); else
printf("Successfully create a file!\n");
show();
break;
case 2:
scanf("%s",name);
fd=open(name);
if(fd==-1)
printf("Error:\nThe open file not exist!\n");
else if(fd==-2)
printf("Error:\nThe file have already opened!\n");
else if(fd==-3)
printf("Error:\nThe number of open file is too much!\n"); else
printf("Successfully opened!\n");
show();
break;
case 3:
scanf("%s",name);
flag=close(name);
if(flag==-1)
printf("Error:\nThe file is not opened!\n");
else
printf("Successfully closed!\n");
show();
break;
case 4:
if(fd==-1)
printf("Error:\nThe file is not opened!\n");
else
{
printf("Please input the file contect:");
scanf("%s",contect);
flag=write(fd,contect,strlen(contect));
if(flag==0)
printf("Successfully write!\n");
else
printf("Error:\nThe disk size is not enough!\n");
}
show();
break;
case 5:
if(fd==-1)
printf("Error:\nThe file is not opened!\n");
else
{
printf("Please input the size of read:");
scanf("%d",&r_size);
flag=read(fd,contect,r_size);
if(flag==-1)
printf("Error:\nThe size is over the length of the file!\n");
else
{
printf("Successfully read!\nthe contect is:");
for(i=0;i<r_size;i++)
printf("%c",contect[i]);
}
}
show();
break;
case 6:
scanf("%s",name);
flag=del(name);
if(flag==-1)
printf("Error:\nThe file not exist!\n");
else if(flag==-2)
printf("Error:\nThe file is opened.please first close it!");
else if(flag==-3)
printf("Error:\nThe delete is not the file!\n");
else
printf("Successfully delete!\n");
show();
break;
case 7:
scanf("%s",name);
flag=mkdir(name);
if(flag==-1)
printf("Error:\nThe length of name is too long!\n");
else if(flag==-2)
printf("Error:\nThe direct item is already full!\n");
else if(flag==-3)
printf("Error:\nThe name is already in the direct!\n");
else if(flag==0)
printf("Successfully make direct!\n");
show();
break;
case 8:
scanf("%s",name);
flag=rmdir(name);
if(flag==-1)
printf("Error:\nThe direct not exist!\n");
else if(flag==-2)
printf("Error:\nThe direct have son direct,please first remove the son direct!\n");
else if(flag==-3)
printf("Error:\nThe remove is not direct!\n"); else if(flag==0)
printf("Successfully remove direct!\n"); show();
break;
case 9:
dir();
show();
break;
case 10:
scanf("%s",name);
flag=cd(name);
if(flag==-1)
printf("Error:\nThe path no correct!\n"); else if(flag==-2)
printf("Error:\nThe opened is not direct!\n"); show();
break;
default:
printf("Error!不是内部命令,请重新输⼊!\n"); show();
};
}
return;
}。

相关文档
最新文档