📄 mi.c
字号:
temp=readiItem(findex[iIndex].iAddrDir3,i);
temp=readiItem(temp,j);
/*temp=readiItem(temp,k);*/
if(bnum<=8){
alloBlkIndex(temp,bnum);
return;
}
else{
alloBlkIndex(temp,8);
bnum=bnum-8;
}
getchar();
}
}
/****************************************************/
/*****earse模块函数部分******************************/
FILE *efp;
int findfile(char fname[]){
int i=0;
for(;i<DIR_ITEM_NUM;i++){
if(fdir[i].used=='0')continue;
if(strcmp(fname,fdir[i].fname)==0)return(i);
}
printf("\nfile not exist!");
return(-1);
}
/*释放直接索引*/
void earseblock(long blkaddr){
FILE *fp;
char c='-';
char m='1';
int i;
long iblkaddr=blkaddr*BLOCK_SIZE;/*fseek要写入磁盘的位置,根据块号计算物理地址*/
for(i=0;i<16;i++){
fseek(efp,iblkaddr+(long)(i*sizeof(char)),0);
fwrite(&c,sizeof(char),1,efp);
}
if((fp=fopen("map.c","r+"))==NULL){
printf("\nmap.c open failed!");
return;
}
fseek(fp,blkaddr,0);
fwrite(&m,1,1,fp);
printf("(%ld)",blkaddr);
fclose(fp);
}
void earseindex0(int iIndex){
int i=0;
while(i<8){
if(findex[iIndex].iAddrDir0[i]==-1){
i++;
continue;
}
earseblock(findex[iIndex].iAddrDir0[i]);
findex[iIndex].iAddrDir0[i]=-1;
i++;
}
}
void earseindex1(int iIndex){
int i;
earseindex0(iIndex);
/*一级索引*/
for(i=0;i<8;i++){
earseblock(readiItem(findex[iIndex].iAddrDir1,i));
}
/*释放索引快*/
earseblock(findex[iIndex].iAddrDir1);
findex[iIndex].iAddrDir1=-1;
printf("\n1 level index earse over!");
}
void earseindex2(int iIndex){
int i,j;
long length;
length=findex[iIndex].len/16;
if(findex[iIndex].len%16!=0)length++;
earseindex1(iIndex);
/*2级索引*/
length=length-16;
for(i=0;i<8;i++){
for(j=0;j<8;j++){
if(length--==0) goto here;
/*printf("length:%d ",length);
printf(" %ld ",readiItem(findex[iIndex].iAddrDir2,i));
printf(" %ld ",readiItem(readiItem(findex[iIndex].iAddrDir2,i),j));*/
earseblock(readiItem(readiItem(findex[iIndex].iAddrDir2,i),j));
}
}
/*释放索引块*/
here:
for(i=0;i<8;i++){
earseblock(readiItem(findex[iIndex].iAddrDir2,i));
}
earseblock(findex[iIndex].iAddrDir2);
findex[iIndex].iAddrDir2=-1;
printf("\n2 level index earse over!");
}
void earseindex3(int iIndex){
int i,j,k;
long length;
length=findex[iIndex].len/16;
earseindex2(iIndex);
/*2级索引*/
length=length-80;
for(i=0;i<8;i++){
for(j=0;j<8;j++){
for(k=0;k<8;k++)
if(length--==0) goto here1;
earseblock(readiItem(readiItem(readiItem(findex[iIndex].iAddrDir3,i),j),k));/*释放数据块*/
}
}
here1:
/*释放索引快*/
for(i=0;i<8;i++){
for(j=0;j<8;j++)
earseblock(readiItem(readiItem(findex[iIndex].iAddrDir3,i),j));
}
for(i=0;i<8;i++){
earseblock(readiItem(findex[iIndex].iAddrDir3,i));
}
earseblock(findex[iIndex].iAddrDir3);
findex[iIndex].iAddrDir3=-1;
printf("\n3 level index earse over!");
}
void earseindex(int idir){
FILE *fp;
int j;
int i=fdir[idir].inum;
findex[i].num=i;
findex[i].used='0';
findex[i].type=FTYPE_A;
findex[i].len=0;
strcpy(findex[i].ModiTime,"");
for(j=0;j<8;j++)findex[i].iAddrDir0[j]=NULLINDX;
findex[i].iAddrDir1=NULLINDX;
findex[i].iAddrDir2=NULLINDX;
findex[i].iAddrDir3=NULLINDX;
if((fp=fopen("index.c","r+"))==NULL){
printf("\nindex.c open failed!");
return;
}
fseek(fp,i*sizeof(I),0);
fwrite(&findex[i],sizeof(I),1,fp);
fclose(fp);
}
void earsedir(int idir){
FILE *fp;
strcpy(fdir[idir].fname,"");
fdir[idir].inum=NULLINDX;
fdir[idir].used='0';
if((fp=fopen("dir.c","r+"))==NULL){
printf("\ndir.c open failed!");
return;
}
fseek(fp,idir*sizeof(Dir),0);
fwrite(&fdir[idir],sizeof(Dir),1,fp);
fclose(fp);
}
void earsefile(int idir){
/**/
int flennum;
int iIndex=fdir[idir].inum;
flennum=findex[iIndex].len/BLOCK_SIZE;
if(findex[iIndex].len%BLOCK_SIZE>0)flennum++;
if((efp=fopen("disk.c","r+"))==NULL){
printf("\ndisk visit failed when writing FIB!");
return;
}
cfp=efp;
if(flennum<=8){
earseindex0(iIndex);
}
else if(flennum>8&&flennum<=16){
earseindex1(iIndex);
}
else if(flennum>16&&flennum<=80){
earseindex2(iIndex);
}
else if(flennum>80&&flennum<=592){
earseindex3(iIndex);
}
earseindex(idir);
earsedir(idir);
fclose(efp);
}
/************************************************************/
/*****read 模块函数部分**************************************/
FILE *rfp;
int displyblkdata(long datablkaddr){
int i;
char c;
long dataaddr=datablkaddr*BLOCK_SIZE;;
printf("\n(%ld)",datablkaddr);
for(i=0;i<16;i++){
fseek(rfp,dataaddr+(i*sizeof(char)),0);
c=fgetc(rfp);
printf("%c",c);
if(c=='#'){
fclose(rfp);
return 1;
}
}
return 0;
}
void readfile(int idir){
int iIndex=fdir[idir].inum;
int i,j,k;
int blknum=findex[iIndex].len/BLOCK_SIZE;
if(findex[iIndex].len%BLOCK_SIZE>0)blknum++;
printf("\n-- file begin --");
printFileInfo(idir);
if((rfp=fopen("disk.c","r"))==NULL){
printf("\ndisk visit failed when writing FIB!");
return;
}
cfp=rfp;
/*读0级索引*/
for(i=0;i<8;i++){
if(findex[iIndex].iAddrDir0[i]==-1)goto rfend;
if(displyblkdata(findex[iIndex].iAddrDir0[i])||--blknum==0)goto rfend;
}
/*读1级索引blknum=blknum-8;*/
for(i=0;i<8;i++){
if(findex[iIndex].iAddrDir1==-1)goto rfend;
if(displyblkdata(readiItem(findex[iIndex].iAddrDir1,i))||--blknum==0)goto rfend;
}
/*读2级索引blknum=blknum-16;*/
for(i=0;i<8;i++){
for(j=0;j<8;j++){
if(findex[iIndex].iAddrDir2==-1)goto rfend;
if(displyblkdata(readiItem(readiItem(findex[iIndex].iAddrDir2,i),j))||--blknum==0)goto rfend;
}
}
/*读3级索引blknum=blknum-80;*/
for(i=0;i<8;i++){
for(j=0;j<8;j++){
for(k=0;k<8;k++){
if(findex[iIndex].iAddrDir3==-1)goto rfend;
if(displyblkdata(readiItem(readiItem(readiItem(findex[iIndex].iAddrDir2,i),j),k))||--blknum==0)goto rfend;
}
}
}
rfend:printf("\n-- file end --");
fclose(rfp);
}
/************************************************************/
/**** write 模块函数部分 **************************************/
typedef struct buffer{
char wbuf[2000];
int index;
int sum;
}buf,*pbuf;
buf wb;
FILE *wfp;
int writeblk(long datablkaddr){
int i;
long dataaddr=datablkaddr*BLOCK_SIZE;
printf("(%ld)",datablkaddr);
for(i=0;i<16;i++){
if(wb.index==wb.sum){
fseek(wfp,dataaddr+(i*sizeof(char)),0);
fputc(wb.wbuf[wb.index],wfp);
fclose(wfp);
return 1;
}
fseek(wfp,dataaddr+(i*sizeof(char)),0);
fputc(wb.wbuf[wb.index++],wfp);
}
return 0;
}
void writefile(idir){
char c;
int i=0,j,k,filelen;
int fblknum;
int iIndex=fdir[idir].inum;
wb.index=0;
wb.sum=0;
printf("\n>\n");
while(1){
if(wb.sum>findex[iIndex].len){
printf("\nfile size is not enough.");
wb.wbuf[--wb.sum]='#';
break;
}
if(wb.sum>=2000){
printf("\noverflow!");
break;
}
if((c=getchar())=='#'){
wb.wbuf[wb.sum]=c;
break;
}
wb.wbuf[wb.sum++]=c;
}
filelen=wb.sum;
fblknum=filelen/BLOCK_SIZE;
if(filelen%BLOCK_SIZE>0)fblknum++;
if((wfp=fopen("disk.c","r+"))==NULL){
printf("\ndisk visit failed when writing FIB!");
return;
}
cfp=wfp;
/*写0级索引*/
for(i=0;i<8;i++){
if(findex[iIndex].iAddrDir0[i]==-1)goto wfend;
if(writeblk(findex[iIndex].iAddrDir0[i]))goto wfend;
}
/*写1级索引*/
for(i=0;i<8;i++){
if(findex[iIndex].iAddrDir1==-1)goto wfend;
if(writeblk(readiItem(findex[iIndex].iAddrDir1,i)))goto wfend;
}
/*写2级索引*/
for(i=0;i<8;i++){
for(j=0;j<8;j++){
if(findex[iIndex].iAddrDir2==-1)goto wfend;
if(writeblk(readiItem(readiItem(findex[iIndex].iAddrDir2,i),j)))goto wfend;
}
}
/*写3级索引*/
for(i=0;i<8;i++){
for(j=0;j<8;j++){
for(k=0;k<8;k++){
if(findex[iIndex].iAddrDir3==-1)goto wfend;
if(writeblk(readiItem(readiItem(readiItem(findex[iIndex].iAddrDir2,i),j),k)))goto wfend;
}
}
}
wfend:printf("\n-- file end --");
fclose(wfp);
}
/************************************************************/
main(int agrc,char *agrv[]){
int icmd,l;
char filename[FNAMELEN];
unsigned long filesize=0;
unsigned blocknum=0;
time_t t;
int idir;
int iIndex;
char c;
/*printfile("dir.c");*/
loadfile("index.c");
loadfile("dir.c");
loadfile("map.c");
printFList();
strcpy(filename,agrv[2]);
for(icmd=0;icmd<5;icmd++){
if(strcmp(agrv[1],cmd[icmd])==0)break;
}
switch(icmd){
case 0 :/*create*/
/*
*获取文件名
printf("\n%s",filename);
*/
printf("\n\nsure to create new file?(y/n)");
if((c=getchar())=='n')break;
getchar();
printf("\nFile Size(Byte):");
scanf("%ld",&filesize);
getchar();
/*strcpy(filename,"WANGJIA");
getchar();
*计算文件所占盘块数
*/
blocknum=filesize/BLOCK_SIZE;
if(filesize%BLOCK_SIZE>0)blocknum++;
printf("\nFile Size:%ldByte\nNeed Block Num:%d",filesize,blocknum);
/*
*/
/*
*查找map 是否有足够的空闲盘块
*/
if(scanMap(blocknum)){
/*寻找空闲索引快*/
if((idir=scanDir())>=0){
if((iIndex=scanIndex())>=0){
printf("\nDir Item:%d\nIndex Item:%d",idir,iIndex);
strcpy(fdir[idir].fname,filename);
fdir[idir].inum=findex[iIndex].num;
fdir[idir].used='1';
findex[iIndex].used='1';
printf("\n\nFile Type:");
scanf("%c",&findex[iIndex].type);
getchar();
findex[iIndex].len=filesize;
time(&t);
strcpy(findex[iIndex].ModiTime,ctime(&t));
l=strlen(findex[iIndex].ModiTime);
findex[iIndex].ModiTime[--l]='\0';
/*检查文件请求的盘块数,进行盘块分配*/
if((cfp=fopen("disk.c","r+"))==NULL){
printf("\ndisk.c open failed!");
break;
}
if(blocknum<=8){
alloBlk0(iIndex,blocknum);
}
else if(blocknum>8&&blocknum<=16){
alloBlk1(iIndex,blocknum);
}
else if(blocknum>16&&blocknum<=80){
alloBlk2(iIndex,blocknum);
}
else if(blocknum>80&&blocknum<=592){
alloBlk3(iIndex,blocknum);
}
else{/*文件太大*/
printf("\nno enough disk block to be used!");
break;
}
writeDir(idir);
writeIndex(iIndex);
fclose(cfp);
}
}
}
printf("\ncreate over...");break;
case 1 :/*earse*/
/*strcpy(filename,"wangjia");从fdir中找到文件*/
if((idir=findfile(filename))<0){
goto endearse;
}
printFileInfo(idir);
earsefile(idir);
printFList();
endearse: printf("\nearse over...");
break;
case 2 :/*read*/
/*strcpy(filename,"wangjia");*/
if((idir=findfile(filename))<0){
goto endread;
}
readfile(idir);
endread: printf("\nread over...");
break;
case 3 :/*write strcpy(filename,"small");*/
if((idir=findfile(filename))<0){
goto endask;
}
printFileInfo(idir);
writefile(idir);
printf("\nwrite over...");
break;
case 4 :/*ask*/
if((idir=findfile(filename))<0){
goto endask;
}
printFileInfo(idir);
endask: printf("\nask over...");
break;
default: printf("\nd");
}
getchar();
/*printf("\n%d",BLOCK_SUM_NUM);*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -