模拟实现单级目录的FAT文件系统(6)

2020-04-21 07:38

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


模拟实现单级目录的FAT文件系统(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:软件开发劳动计量方法与软件成本估算

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: