p=p->next; }
return flag; } p=f; f=f->next; while(f) {
if(strcmp(filename,fil[f->fdtblockindex].filename)==0) { flag=1;
p=f->next; /*p=p->next;*/ while(p) { p=p->next;
p->fileid-=1; } free(f); return flag; } p=f; f=f->next; } if(flag==0)
{ printf(\ return flag; } return 0; }
int FREAD(char *str, int n, int fileid) /*读文件*/
{ int m,i,j=0,k,l,len,n1,n2=0; struct FCBBlock *p; p=fcb;
while(p) /*查找要读的文件的fcb*/ {if(p->fileid==fileid) break; else
p=p->next; }
if(p==NULL) return 1;
len=fil[p->fdtblockindex].filelen; l=p->filepos; if((l+n)>len) return 2;
j=(l/BlockSize)+(l%BlockSize?1:0); /*求文件指针所在文件的相对块号*/
m=((l+n)/BlockSize)+((l+n)%BlockSize?1:0); k=fil[p->fdtblockindex].firstblockaddr;
for(i=1;i str=(char *)malloc((m-j+1)*BlockSize+1); /*分配读取的缓冲区*/ for(i=0;i<(m-j+1);i++) /*读文件*/ {fseek(fp,(k-1)*BlockSize,0); fread(&str[i*BlockSize],BlockSize,1,fp); k=fat1[k-1]; } str[n+l-(j-1)*BlockSize]='\\0'; /*截断多读的内容*/ if(l!=0) str=&str[l-(j-1)*BlockSize]; p->filepos=n+l; /*修改文件指针*/ printf(\ return 0; } int FWRITE(char *ptr, int n, int fileid) /*文件写*/ { long l; int m,i=0,j,k=0,num,flag=0,flag1=0,b,flag2=0; int n1,n2=0,n3,c; struct FCBBlock *p; char *st1,*st2; st1=(char *)malloc(BlockSize); p=fcb; while(p) /*查找文件的fcb*/ {if(p->fileid==fileid) break; else p=p->next; } if(p==NULL) return 1; l=p->filepos; n1=fil[p->fdtblockindex].firstblockaddr; while(n1!=-1) {n2++; m=n1-1; n1=fat1[n1-1]; } if((l+n)>n2*BlockSize) /*判断是否要追加空间*/ { n3=(l+n)/BlockSize+((l+n)%BlockSize?1:0)-n2; /*追加空间*/ for(i=(sys1.fatblocknum+sys1.resblocknum+sys1.rootblocknum);i if(fat1[i]==0) flag++; if(flag==0) { printf(\磁盘已满\ return 2; } if((l+n-fil[p->fdtblockindex].filelen)>flag*BlockSize) return 3; for(i=(sys1.fatblocknum+sys1.resblocknum+sys1.rootblocknum);i { if(fat1[i]==0) { k++; if(k>=n3) { fat1[m]=i+1; fat1[i]=-1; break; } else fat1[m]=i+1; m=i; } }} flag=0; k=0; n3=(l+n)/BlockSize+((l+n)%BlockSize?1:0); j=(l/BlockSize)+(l%BlockSize?1:0); /*求文件指针所在文件的相对块号*/ st2=(char *)malloc((n3-j+1)*BlockSize); if(l==0) j=1; num=fil[p->fdtblockindex].firstblockaddr; for(i=1;i if(!l%BlockSize) /*写第1块*/ {fseek(fp,(num-1)*BlockSize+l-(i-1)*BlockSize,0); fread(st2,BlockSize,1,fp); for(c=0;c fseek(fp,(num-1)*BlockSize+l-(i-1)*BlockSize,0); fwrite(st2,BlockSize,1,fp); num=fat1[num-1]; fflush(fp); } else { fseek(fp,(num-1)*BlockSize,0); fread(st2,BlockSize,1,fp); for(c=0;c st2[c+l-(j-1)*BlockSize]=ptr[c]; fseek(fp,(num-1)*BlockSize,0); fwrite(st2,BlockSize,1,fp); num=fat1[num-1]; fflush(fp); } for(i=1;i<(n3-j);i++) /*写第2块-倒数第2块*/ { fseek(fp,(num-1)*BlockSize,0); fwrite(st2+i*BlockSize,BlockSize,1,fp); num=fat1[num-1]; fflush(fp);