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

2020-04-21 07:38

}

for(i=(sys1.fatblocknum+sys1.resblocknum+sys1.rootblocknum);i

flag++;/*统计磁盘上为空数目*/

if(flag==0)

{ printf(\统计结果为0,则磁盘已满*/ return 0;

}

printf(\ printf(\ for(j=0;j<32;j++)

if(fil[j].firstblockaddr==0)

break; while(1)

{scanf(\输入目录项中文件的长度*/ n=(dir[j].filelen/BlockSize)+(dir[j].filelen%BlockSize?1:0); if(n<0||n>flag)/*文件长度小于0或大于空闲的空间 */ {printf(\ printf(\ } else break;

}

for(i=(sys1.fatblocknum+sys1.resblocknum+sys1.rootblocknum);i

{ if(fat1[i]==0) { k++;

if(flag2==0)

{ dir[j].firstblockaddr=i+1; flag2=1; } else

{ if(k>=n)/*n 文件长度*/ { fat1[m]=i+1; fat1[i]=-1; break; }else

fat1[m]=i+1;

}

m=i; } }

strcpy(dir[j].filename,filename); dir[j].filename[a]='\\0'; printf(\

scanf(\ printf(\

scanf(\

printf(\

scanf(\ return (1); }

int FDELETE(char *filename)/*删除文件 */ {int i,j,k,n,flag=0;

struct FCBBlock *p;/*文件控制块指针*/ p=fcb;

while(p)

{if(strcmp(filename,fil[p->fdtblockindex].filename)==0)/*目录项所在序号 */ {printf(\ return 0; } else

p=p->next; }

for(i=0;i<32;i++)/*查找要关闭的文件 */ if(strcmp(filename,fil[i].filename)==0) { flag=1; break; }

if(flag==0)

{printf(\return 0; }

j=fil[i].firstblockaddr; while(1)

{ k=fat1[j-1];

fseek(fp,(j-1)*BlockSize,0);/*将指针指向文件的第一个扇区的位置 */ fwrite(&fillchar,1,BlockSize,fp); fat1[j-1]=0; if(k==-1) break; else j=k; }

memset(&fil[i],0,DirSize); return 1; }

int FOPEN(char *filename)/*打开文件*/ { int i,j=0,k,flag=0;

struct FCBBlock *p,*q,*r; p=fcb;

for(i=0;i<32;i++)

if(strcmp(filename,fil[i].filename)==0)/*找到要打开的文件*/ { flag=1; break; }

if(flag==0)

{printf(\ return 0; } while(p) {j++;

if(strcmp(filename,fil[p->fdtblockindex].filename)==0) { printf(\ return 0; } q=p;

p=p->next;

}

if(fcb==NULL)

{ fcb=(struct FCBBlock *)malloc(sizeof(struct FCBBlock)); fcb->fileid=j+1;/*文件标示*/

fcb->filepos=0;/*文件读写指针 */

fcb->next=NULL;/*指向下一个文件控制指针 */ fcb->fdtblockindex=i; } else

{ r=(struct FCBBlock *)malloc(sizeof(struct FCBBlock)); r->fileid=j+1; r->filepos=0; r->next=NULL; r->fdtblockindex=i; q->next=r;

} /*f->next=NULL; */

return 1; }

long FGETLEN(int fileid)/*获取文件指针 */ { struct FCBBlock *p; p=fcb;

while(p)

{if(p->fileid==fileid)/*寻找要找的指针*/ return(p->filepos); p=p->next; }

printf(\ return(0); }

int FCLOSE(char *filename)/*关闭文件 */

{ int flag=0;

struct FCBBlock *f,*p; f=fcb;

if(strcmp(filename,fil[fcb->fdtblockindex].filename)==0) { flag=1; fcb=fcb->next; p=fcb; while(p) {p->fileid-=1; 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; char a[3];

struct FCBBlock *p; p=fcb; while(p)

{if(p->fileid==fileid)

break;

else

p=p->next; }

len=fil[p->fdtblockindex].filelen;/*文件长度*/

l=p->filepos;/*文件读写指针:该块在文件的相对位置*/ printf(\

printf(\

printf(\ scanf(\ if(a[0]=='n'||a[0]=='N') {printf(\

while(1)

{scanf(\

if(fil[p->fdtblockindex].filelen<(l+n))/*? */ printf(\ else

break; } } while(1)

{ if(n>fil[p->fdtblockindex].filelen) {printf(\

printf(\ scanf(\ } else

break; }

str=(char *)malloc(fil[p->fdtblockindex].filelen+1); m=(len/BlockSize)+(len%BlockSize?1:0); k=fil[p->fdtblockindex].firstblockaddr; if(m>1)

{ fseek(fp,(k-1)*BlockSize,0); fread(str,BlockSize,1,fp); k=fat1[k-1]; for(i=1;i<(m-1);i++)

{fseek(fp,fat1[k-1]*BlockSize,0);

fread(&str[i*BlockSize],BlockSize,1,fp); k=fat1[k-1]; }

fseek(fp,(k-1)*BlockSize,0);

fread(&str[i*BlockSize],len-i*BlockSize,1,fp); } else


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

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

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

马上注册会员

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