📄 file.h
字号:
{
for(;name[j]!='\0'&&k<2&&name[j]!='.';j++,k++)
tname[k]=name[j];
}
for(;k<2;k++)
tname[k]='/0';
if((d=search(pathname,8,&dn,&bn))==false) /*找到目录路径*/
{
printf("目录不存在,不能建立");
return(false);
}
b=-1;
fseek(fc,d*64L,SEEK_SET);
fread(buffer2,64L,1,fc); /*读出d盘块的内容*/
for(t=0;t<8;t++)
{
if(buffer2[t].name[0]==dname[0]&&buffer2[t].name[1]==dname[1]&&buffer2[t].name[2]==dname[2]&&buffer2[t].type[0]==tname[0]&&buffer2[t].type[1]==tname[1])
{/* 找到名字dname的文件,建立失败 */
printf("文件已经存在,不能建立\n");
return(false);
}
if(buffer2[t].name[0]=='$'&&b==-1)
b=t;
}/* for */
if(b==-1) /*没有空目录项,建立失败*/
{
printf("目录无空间\n");
return(false);
}
if((dd=allocate())==false) /*分配给建立目录的磁盘盘块dd*/
{
printf("建立文件失败\n");
return(false);
}
/*填写目录项*/
for(I=0;I<3;I++)
buffer2[b].name[I]=dname[I];
for(I=0;I<2;I++)
buffer2[b].type[I]=tname[I];
buffer2[b].attribute=attribute;
buffer2[b].address=dd;
buffer2[b].length=0;
fseek(fc,d*64L,SEEK_SET);
fwrite(buffer2,64L,1,fc);
/*填写已打开文件表*/
strcpy(x.name,name);
x.attribute=attribute;
x.number=dd;
x.length=0;
x.flag=1;
x.read.dnum=x.write.dnum=dd;
x.read.bnum=x.write.bnum=0;
iopen(&x);
}/*建立文件结束*/
open_file(char *name,int attribute)
{
OFILE x;
int dnum,bnum,last,I,d;
if((d=search(name,4,&dnum,&bnum))==false)
{
printf("文件不存在,打开操作失败\n");
return(false);
}
fseek(fc,dnum*64L,SEEK_SET); /*读出对应目录项*/
fread(buffer2,64,1,fc);
if((buffer2[bnum].attribute%2==1)&&attribute==1) /*对只读文件要求写*/
{
printf("文件不能写,打开失败");
return(false);
}
strcpy(x.name,name);
x.attribute=buffer2[bnum].attribute;
x.number=buffer2[bnum].address;
x.read.dnum=x.write.dnum=buffer2[bnum].address;
x.read.bnum=x.write.bnum=0;
x.flag=attribute;
if(attribute==1)
{
while(d!='\xff') /*寻找文件末尾*/
{
fseek(fc, d/64*64L,SEEK_SET);
fread(buffer1,64L,1,fc); /*读出dnum项所在FAT*/
last=d;
d=buffer1[d%64]; /*读出dnum块下一块内容赋给dnum*/
}/*while*/
x.write.dnum=last; /*填写写指针*/
fseek(fc,last*64L,SEEK_SET);
fread(buffer1,64L,1,fc);
for(I=0;I<64&&buffer1[I]!='#';I++);
x.write.bnum=I;
x.length=(buffer2[bnum].length-1)*64+I;
}
iopen(&x); /*填写已打开文件夹*/
}
close_file(char *name)
/*关闭文件函数*/
{
int I,dnum,bnum;
if((I=sopen(name))==-1)
{
printf(" 打开的文件中没有该文件,关闭失败\n");
return(false);
}
if(openfile.file[I].flag==1) /*写文件的追加文件结束符*/
{
fseek(fc,openfile.file[I].write.dnum*64L,SEEK_SET);
fread(buffer1,64,1,fc);
buffer1[openfile.file[I].write.bnum]='#';
fseek(fc,openfile.file[I].write.dnum*64L,SEEK_SET);
fwrite(buffer1,64,1,fc);
fputc('#',fc);
search(name,4,&dnum,&bnum);/*查找该文件目录位置*/
/*修改目录中的文件长度*/
fseek(fc,dnum*64L,SEEK_SET);
fread(buffer2,64,1,fc);
buffer2[bnum].length=openfile.file[I].length/64+1;
fseek(fc,dnum*64L,SEEK_SET);
fwrite(buffer2,64,1,fc);
}
/*在已打开文件表中删除该文件的登记项*/
if(openfile.length>1)
copen(&openfile.file[I],&openfile.file[openfile.length-1]);
openfile.length--;
}
deletefile(char *name) //删除文件
{
int dnum,bnum,t;
if((t=search(name,4,&dnum,&bnum))==false) /*查找文件*/
{
printf(" 文件不存在\n");
return(false);
}
if(sopen(name)!=-1) /*文件打开,不能删除*/
{
printf("该文件打开,不能删除\n");
return(false);
}
fseek(fc,dnum*64L,SEEK_SET);
fwrite(buffer2,64,1,fc);
buffer2[bnum].name[0]='$'; /*将该文件的目录置成空目录*/
fseek(fc,dnum*64L,SEEK_SET);
fwrite(buffer2,64,1,fc);
while(t!='\xff') /*通过FAT查找每一个盘块号,并依次删除*/
{
dnum=t;
fseek(fc,dnum/64*64,SEEK_SET);
fread(buffer1,64,1,fc);
t=buffer1[dnum%64];
buffer1[dnum%64]=0;
fseek(fc, dnum/64*64L, SEEK_SET);
fwrite(buffer1,64,1,fc);
}
}/*文件删除结束*/
md(char *name)
/*建立目录函数,目录路径名name*/
{
int dnum,bnum,I,j,last,k,s,d,t,tt,b,dd, flag,dn,bn;
char dname[3],pathname[20];
I=2; /*i=根目录的起始盘块号*/
/*将name分成两部分,目录路径pathname和目录名name*/
for(j=0;name[j]!='\0';j++) /*查找最后一个"/"*/
if(name[j]=='/')
s=j;
/*分离目录路径*/
for(j=0;j<s;j++)
pathname[j]=name[j];
pathname[j]='\0';
/*分离目录名*/
for(k=0,j=s+1;name[j]!='\0'&&k<3&&name[j]!='.';j++,k++)
dname[k]=name[j];
if(k==0)
{
printf("错误文件名或目录名\n");
return(false);
}
for(;k<3;k++)
dname[k]=' ';
if((d=search(pathname,8,&dn,&bn))==false) /*找到目录路径*/
{
printf("目录不存在,不能建立\n");
return(false);
}
b=-1;
/*确认该目录不存在的同时查找空目录项*/
fseek(fc,d*64L,SEEK_SET);
fread(buffer2,64L,1,fc); /*读出d盘块的内容*/
for(t=0;t<8;t++)
{
if(buffer2[t].name[0]==dname[0]&&buffer2[t].name[1]==dname[1]&&buffer2[t].name[2]==dname[2]&&buffer2[t].attribute==8)
{/*找到名字dname的目录,建立失败*/
printf("目录已经存在,不能建立\n");
return(false);
}
if(buffer2[t].name[0]=='$'&&b==-1)
b=t;
}/*for*/
if(b==-1) /*没有空目录项,不能建立*/
{
printf("目录无空间\n");
return(false);
}
if((dd=allocate())==false) /*分配给建立目录的磁盘块dd*/
{
printf("没有磁盘空间\n");
return(false);
}
/*填写目录项*/
for(I=0;I<3;I++)
buffer2[b].name[I]=dname[I];
buffer2[b].type[0]=buffer2[b].type[1]=' ';
buffer2[b].attribute=8;
buffer2[b].address=dd;
buffer2[b].length=0;
fseek(fc,d*64L,SEEK_SET);
fwrite(buffer2,64L,1,fc);
/*分给新建目录的盘块初始化*/
for(t=0;t<8;t++)
buffer2[t].name[0]='$';
fseek(fc,dd*64L,SEEK_SET);
fwrite(buffer2,64L,1,fc);
}/*建立目录结束*/
dir(char *name)
/*显示内容*/
{
int I,bnum,t,tt,dnum,dn,bn;
if((dnum=search(name,8,&dn,&bn))==false)/*找到目录路径*/
{
printf("目录不存在\n");
return(false);
}
printf("名称 扩展名 起始盘块 长度\n");
/*显示目录内容*/
fseek(fc,dnum*64L, SEEK_SET);
fread(buffer2,64L,1,fc);
for(t=0;t<8;t++) /*显示该盘块中目录项的内容*/
if(buffer2[t].name[0]!='$')
printf("%c%c%c %c%c %4d %7d\n",buffer2[t].name[0],buffer2[t].name[1],buffer2[t].name[2],buffer2[t].type[0],buffer2[t].type[1],buffer2[t].address,
buffer2[t].length);
}/*显示目录函数结束*/
rd(char *name) /*删除空目录*/
{
int dnum,bnum,flag,t,I;
if((t=search(name,8,&dnum,&bnum))==false) /*查找文件*/
{
printf("目录不存在\n");
return(false);
}
if(strcmp(name,"/")==0) /*根目录不能删除*/
{
printf(" 该目录为根目录,不能删除\n");
return(false);
}
fseek(fc,t*64L,SEEK_SET); /*判断该子目录是否为空目录*/
fread(buffer2,64,1,fc);
flag=1;
for(I=0;I<8;I++)
if(buffer2[bnum].name[0]!='$')flag=0;
if(flag==0) /*非空目录不能删除*/
{
printf("该目录为非空目录,不能删除\n");
return(false);
}
fseek(fc,dnum*64L,SEEK_SET); /*删除空目录*/
fread(buffer2,64,1,fc);
buffer2[bnum].name[0]='$'; /*将该文件的目录置成空目录*/
fseek(fc,dnum*64L,SEEK_SET);
fwrite(buffer2,64,1,fc);
fseek(fc,t/64*64,SEEK_SET); /*删除该子目录占用的盘块*/
fread(buffer1,64,1,fc);
t=buffer1[t%64];
buffer1[t%64]=0;
fseek(fc,t/64*64L,SEEK_SET);
fwrite(buffer1,64,1,fc);
}
typefile(char *name)/*显示文件内容*/
{
int I,dnum,dn,bn,t;
if((dnum=search(name,1,&dn,&bn))==false)
{
printf("文件不存在\n");
return(false);
}
if(sopen(name)!=-1)
{
printf("该文件打开,不能显示\n");
return(false);
}
// while(dnum!='\xff')
// {
fseek(fc,dnum*64L,SEEK_SET);
fread(buffer1,64,1,fc); /*读一个盘块到缓冲*/
for(t=0;t<64&&buffer1[t]!='#';t++) /*显示缓冲内容*/
putchar(buffer1[t]);
printf("\n");
// }
/*获得下一个盘块*/
fseek(fc,dnum/64*64L,SEEK_SET);
fread(buffer1,64,1,fc);
dnum=buffer1[dnum%64];
} /*显示文件函数结束*/
change(char *name,int attribute)
/*改变文件name的属性为attribute*/
{
int dnum,bnum;
if(search(name,1,&dnum,&bnum)==false) /*查找文件目录*/
{
printf("文件不存在\n");
return(false);
}
if(sopen(name)!=-1)
{
printf("该文件打开,不能改变文件属性\n");
return(false);
}
fseek(fc,dnum*64L,SEEK_SET);
fread(buffer2,64,1,fc); /*读出该目录所在盘块*/
buffer2[bnum].attribute=attribute; /*修改属性*/
fseek(fc,dnum*64L,SEEK_SET);
fwrite(buffer2,64,1,fc); /*写回磁盘*/
}
/*改变文件属性函数结束*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -