⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mi.c

📁 模拟unix文件系统的混合索引
💻 C
📖 第 1 页 / 共 2 页
字号:
				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 + -