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

📄 mi.c

📁 模拟unix文件系统的混合索引
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
作者:王佳
时间:2006-6
地点:山东建筑大学
内容:模拟unix文件系统的混合索引
*/

#include <stdio.h>
#include <time.h>

#define NULL 0
#define NULLINDX -1
#define FNAMELEN 11

#define CAP_SUM 102400 /*模拟磁盘容量(Byte)*/
#define BLOCK_SIZE 16 /*盘块大小(Byte)*/
#define FREE '-' /*空闲占位符*/
#define BLOCK_SUM_NUM 6400/*总盘块数100*(1024/16)*/
#define FTYPE_A 'a'
#define FTYPE_B 'b'

#define EMPTY '1' /*位图空盘块*/
#define FULL  '0' /*位图已用盘块*/
#define MAP_ROW_NUM 80
#define MAP_COLLUM_NUM 80

#define DIR_ITEM_NUM 100
#define INDEX_ITEM_NUM 100

typedef struct index{/*文件索引块*/
	int num;/*编号*/
	unsigned long int len;/*文件长度*/
	char type;/*类型*/
	char ModiTime[27];/*文件建立/最后修改的时间(yymmddhhmmss)*/
	long iAddrDir0[8];/*直接索引*/
	long iAddrDir1;/*一级索引*/
	long iAddrDir2;/*二级索引*/
	long iAddrDir3;/*三级索引*/
	char used;
}I,*pI;
I findex[INDEX_ITEM_NUM];



typedef struct directory{
	char fname[FNAMELEN];
	int inum;
	char used;
}Dir,*pDir;
Dir fdir[DIR_ITEM_NUM];


char *cmd[5]={"create","earse","read","write","ask"};

char map[MAP_ROW_NUM][MAP_COLLUM_NUM];


void initIndx(){
	int i,j;
	for(i=0;i<INDEX_ITEM_NUM;i++){
		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;
	}
	printf("\nIndex               [ok]");
}

void initDir(){
	int i=0;
	for(;i<DIR_ITEM_NUM;i++){
		strcpy(fdir[i].fname,"");
		fdir[i].inum=NULLINDX;
		fdir[i].used='0';
	}
	printf("\nDirectory           [ok]");
}

void initMap(){
	int i=0,j;
	for(;i<MAP_ROW_NUM;i++){
		for(j=0;j<MAP_COLLUM_NUM;j++){
			map[i][j]=EMPTY;
			/*if(i%80==0)printf("\n");
			printf("%c",map[i][j]);*/
		}
	}
	printf("\nMap                 [ok]");
}

void initEnvi(){
	FILE *fp=NULL;
	long i=0;
	if(!fexist("disk.c")){
		fp=fopen("disk.c","w+");
		for(;i<CAP_SUM;i++){
			fputc(FREE,fp);
		}
		printf("\ndisk.c              [ok]");
		fclose(fp);
	}
	initIndx();
	initDir();
	initMap();
}
void printFList(){
	int i,j,l;
	printf("\n\nMODIFYTIME                    SIZE\tFILENAME   TYPE");
	for(i=0;i<DIR_ITEM_NUM;i++){
		if(fdir[i].used=='0')continue;
		/*
		l=strlen(findex[fdir[i].inum].ModiTime);
		findex[fdir[i].inum].ModiTime[--l]='\0';
		*/
		
		printf("\n%-30s%ldByte\t%-11s%c",
			findex[fdir[i].inum].ModiTime,
			findex[fdir[i].inum].len,
			fdir[i].fname,
			findex[fdir[i].inum].type
			);
		if(i&10==0)getchar();

	}
}

void printFileInfo(int idir){
	printf("\n%-30s%ldByte\t%-11s%c\n",
		findex[fdir[idir].inum].ModiTime,
		findex[fdir[idir].inum].len,
		fdir[idir].fname,
		findex[fdir[idir].inum].type
		);
}
/*
void cmtime(char &strtime){
	int i;
	i=strlen(strtime);
	strtime[--i]='\0';
}
*/
void printfile(char fname[]){
	FILE *fp=NULL;
	int i=0,j=0;
	if(fexist(fname)){
		fp=fopen(fname,"r");
		if(strcmp(fname,"index.c")==0){
			for(i=0;i<INDEX_ITEM_NUM;i++){
				fseek(fp,i*sizeof(I),0);
				fread(&findex[i],sizeof(I),1,fp);
				findex[i].num=i;
				if(findex[i].used=='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;
				}


				printf(
					"\n%d %c %ld %s %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld  %c",
					findex[i].num,
					findex[i].type,
					findex[i].len,
					findex[i].ModiTime,
					findex[i].iAddrDir0[0],
					findex[i].iAddrDir0[1],
					findex[i].iAddrDir0[2],
					findex[i].iAddrDir0[3],
					findex[i].iAddrDir0[4],
					findex[i].iAddrDir0[5],
					findex[i].iAddrDir0[6],
					findex[i].iAddrDir0[7],
					findex[i].iAddrDir1,
					findex[i].iAddrDir2,
					findex[i].iAddrDir3,
					findex[i].used
				);
				if(i%10==0){printf("\n");getchar();}
			}
		}
		if(strcmp(fname,"dir.c")==0){
			for(i=0;i<DIR_ITEM_NUM;i++){
				fseek(fp,i*sizeof(Dir),0);
				fread(&fdir[i],sizeof(Dir),1,fp);
				printf("%s %d %c",fdir[i].fname,fdir[i].inum,fdir[i].used);
				if(i%10==0){getchar();printf("\n");}/**/
			}
		}
		if(strcmp(fname,"map.c")==0){
			for(i=0;i<MAP_ROW_NUM;i++){
				for(j=0;j<MAP_COLLUM_NUM;j++){
					map[i][j]=fgetc(fp);
					printf("%c",map[i][j]);
				}
			}
		}
	}
	fclose(fp);
}

void loadfile(char fname[]){
	FILE *fp=NULL;
	int i=0,j=0;
	if(fexist(fname)){
		fp=fopen(fname,"r");
		if(strcmp(fname,"index.c")==0){
			for(i=0;i<INDEX_ITEM_NUM;i++){
				fseek(fp,i*sizeof(I),0);
				fread(&findex[i],sizeof(I),1,fp);
				findex[i].num=i;
				if(findex[i].used=='0'){
					strcpy(findex[i].ModiTime,"");
					findex[i].type='a';
					for(j=0;j<8;j++)findex[i].iAddrDir0[j]=NULLINDX;
					findex[i].iAddrDir1=NULLINDX;
					findex[i].iAddrDir2=NULLINDX;
					findex[i].iAddrDir3=NULLINDX;
				}
			}
		}
		if(strcmp(fname,"dir.c")==0){
			for(i=0;i<DIR_ITEM_NUM;i++){
				/*fscanf(fp,"%s%d%d",fdir[i].fname,&fdir[i].inum,&fdir[i].used);*/
				fseek(fp,i*sizeof(Dir),0);
				fread(&fdir[i],sizeof(Dir),1,fp);
				fdir[i].inum=i;
				/*printf("%s %d %c",fdir[i].fname,fdir[i].inum,fdir[i].used);
				if(i%10==0){getchar();printf("\n");}*/
			}
		}
		if(strcmp(fname,"map.c")==0){
			for(i=0;i<MAP_ROW_NUM;i++){
				for(j=0;j<MAP_COLLUM_NUM;j++){
					map[i][j]=fgetc(fp);
					/*printf("%c",map[i][j]);*/
				}
			}
		}
	}
	else{
		initEnvi();
		fp=fopen(fname,"w+");
		rewind(fp);
		if(strcmp(fname,"index.c")==0){
			for(i=0;i<INDEX_ITEM_NUM;i++){
				fwrite(&findex[i],sizeof(I),1,fp);
			}
		}
		if(strcmp(fname,"dir.c")==0){
			for(i=0;i<DIR_ITEM_NUM;i++){
				fwrite(&fdir[i],sizeof(Dir),1,fp);
				/*fprintf(fp,"%s%d%d",fdir[i].fname,fdir[i].inum,fdir[i].used);*/
			}
		}
		if(strcmp(fname,"map.c")==0){
			for(i=0;i<MAP_ROW_NUM;i++){
				for(j=0;j<MAP_COLLUM_NUM;j++){
					fputc(map[i][j],fp);
				}
			}
		}
	}
	printf("\n%-20s[ok]",fname);
	fclose(fp);
};


int fexist(char fname[]){
	FILE *fp=NULL;
	if((fp=fopen(fname,"r"))==NULL){
		fclose(fp);
		printf("\n\"%s\" can not be opened",fname);
		return(0);
	}
	return(1);
}

int scanMap(unsigned bnum){
	int i,j;
	for(i=0;i<MAP_ROW_NUM;i++){
		for(j=0;j<MAP_COLLUM_NUM;j++){
			if(map[i][j]==EMPTY)bnum--;
			if(bnum==0)return(1);
		}
	}
	return(0);
}
int scanDir(){
	int i;
	for(i=0;i<DIR_ITEM_NUM;i++){
		if(fdir[i].used=='0')return(i);
	}
	return(-1);
}
int scanIndex(){
	int i;
	for(i=0;i<INDEX_ITEM_NUM;i++){
		if(findex[i].used=='0')return(i);
	}
	return(-1);
}

void writeDir(int idir){
	FILE *fp=NULL;
	if((fp=fopen("dir.c","r+"))==NULL){
		printf("\nopen failed when writing dir.c");
	}
	fseek(fp,idir*sizeof(Dir),0);
	fwrite(&fdir[idir],sizeof(Dir),1,fp);
	/*fprintf(fp,"%s%d%d",fdir[idir].fname,fdir[idir].inum,fdir[idir].used);
	*/
	fclose(fp);
}
void writeIndex(int iIndex){
	FILE *fp=NULL;
	if((fp=fopen("index.c","r+"))==NULL){
		printf("\nopen failed when writing index.c");
	}

	fseek(fp,iIndex*sizeof(I),0);
	fwrite(&findex[iIndex],sizeof(I),1,fp);
	/*fprintf(fp,"%s%d%d",fdir[idir].fname,fdir[idir].inum,fdir[idir].used);
	*/
	fclose(fp);
}
/***** create 文件部分*********************************/
FILE *cfp;
void mdfmap(int row,int col){
	FILE *fp=NULL;
	int bnum=row*MAP_COLLUM_NUM+col;
	map[row][col]=FULL;
	if((fp=fopen("map.c","r+"))==NULL){
		printf("\nopen failed when writing map.c");
	}

	fseek(fp,bnum*sizeof(char),0);
	fwrite(&map[row][col],sizeof(char),1,fp);
	/*fprintf(fp,"%s%d%d",fdir[idir].fname,fdir[idir].inum,fdir[idir].used);
	*/
	fclose(fp);
}
void alloBlk0(int iIndex,int bnum){
	int i,j;
	int tbnum=0;
	for(i=0;i<MAP_ROW_NUM;i++){
		for(j=0;j<MAP_COLLUM_NUM;j++){
			if(bnum==0)return;
			if(map[i][j]==EMPTY){
				findex[iIndex].iAddrDir0[tbnum]=i*80+j;
				mdfmap(i,j);
				bnum--;
				printf("\niAddrDir0[%d]->%ld",tbnum,findex[iIndex].iAddrDir0[tbnum]);
				tbnum++;
			}
		}
	}
}
int alloBlkIndex(long iblknum,int ibnum1){
/*	FILE *fp;*/
	int i,j;
	int tbnum=0;
	long iblkaddr=iblknum*BLOCK_SIZE;/*16B,fseek要写入磁盘的位置,根据块号计算物理地址*/
	int datablkaddr;
/*
	if((fp=fopen("disk.c","r+"))==NULL){
		printf("\ndisk visit failed when writing file index block!");
		return;
	}

	printf("\nwrite disk");
*/	for(i=0;i<MAP_ROW_NUM;i++){
		for(j=0;j<MAP_COLLUM_NUM;j++){
			if(ibnum1==0)return;
			if(map[i][j]==EMPTY){
				fseek(cfp,iblkaddr+(tbnum*sizeof(int)),0);
				datablkaddr=i*80+j;
				fwrite(&datablkaddr,sizeof(int),1,cfp);
				mdfmap(i,j);
				printf("(%d)",datablkaddr);
				/*getchar();*/
				ibnum1--;
				/*printf("\niAddrDir0[%d]--%ld",tbnum,findex[iIndex].iAddrDir0[tbnum]);*/
				tbnum++;
			}
		}
	}
/*	fclose(fp);*/
}
void  alloBlk1(int iIndex,unsigned bnum){
	int i,j;
	int bnum1;
	bnum1=bnum-8;
	bnum=8;
	/*先分8个直接索引*/
	alloBlk0(iIndex,bnum);
	/*找一个索引快*/
	for(i=0;i<MAP_ROW_NUM;i++){
		for(j=0;j<MAP_COLLUM_NUM;j++){
			if(map[i][j]==EMPTY){
				findex[iIndex].iAddrDir1=i*80+j;
				mdfmap(i,j);
				printf("\niAddrDir1->%ld",findex[iIndex].iAddrDir1);
				/*把余下的块找到盘块并写入一级索引*/
				alloBlkIndex(findex[iIndex].iAddrDir1,bnum1);
				return;
			}
		}
	}
}

/*读二级索引第一索引块纪录*/
long readiItem(long prv,int inum){
	/*FILE *fp;*/
	long iblkaddr=prv*BLOCK_SIZE;/*fseek要写入磁盘的位置,根据块号计算物理地址*/
	int item;
	long litem;
	/*
	if((fp=fopen("disk.c","r+"))==NULL){
		printf("\ndisk visit failed when writing FIB!");
		return(-1);
	}
	*/
	fseek(cfp,iblkaddr+((long)inum*sizeof(int)),0);
	fread(&item,sizeof(int),1,cfp);
	if(item==3584)item=13;
	if(item==2826)item=10;
	litem=(long)item;
	printf("\nindex item:%ld->",litem);
	/*getchar();fclose(fp);*/
	return(litem);
}
void alloBlk2(int iIndex,int bnum2){
	 int i,j;
	 int bnum,ibnum;
	 bnum=bnum2-16;
	 alloBlk1(iIndex,16);
	 /*分配一个索引盘块,找8块索引快,并给上一个索引块赋值*/
	 for(i=0;i<MAP_ROW_NUM;i++){
		for(j=0;j<MAP_COLLUM_NUM;j++){
			if(map[i][j]==EMPTY){
				findex[iIndex].iAddrDir2=i*80+j;
				mdfmap(i,j);
				printf("\niAddrDir2->%ld",findex[iIndex].iAddrDir2);
				alloBlkIndex(findex[iIndex].iAddrDir2,8);
				goto out;
			}
		}
	}
out:

	ibnum=bnum/8;
	if(bnum%8>0)ibnum++;/*余下盘块的盘块地址需要纪录到几个索引块中*/
	for(i=0;i<ibnum-1;i++)/*读第i条二级索引中第一索引块的纪录*/
		alloBlkIndex(readiItem(findex[iIndex].iAddrDir2,i),8);
	bnum=bnum-8*i;
	alloBlkIndex(readiItem(findex[iIndex].iAddrDir2,i),bnum);
	printf("\n2 level index allot success!");
}

void alloBlk3(int iIndex,int bnum3){
	int i,j,k;
	int bnum,ibnum;
	long temp;
	/*int a,b;*/
	bnum=bnum3-80;
	alloBlk2(iIndex,80);
	for(i=0;i<MAP_ROW_NUM;i++){
		for(j=0;j<MAP_COLLUM_NUM;j++)
			if(map[i][j]==EMPTY){
				findex[iIndex].iAddrDir3=i*80+j;
				mdfmap(i,j);
				printf("\niAddrDir3->%ld",findex[iIndex].iAddrDir3);
				alloBlkIndex(findex[iIndex].iAddrDir3,8);
				goto out;
			}
	}
out:
	for(i=0;i<8;i++)
		alloBlkIndex(readiItem(findex[iIndex].iAddrDir3,i),8);
	for(i=0;i<8;i++)
		for(j=0;j<8;j++)
			/*for(k=0;k<8;k++)*/{
				if(bnum<=0)return;
				/*printf("\n%d %d:",i,j);*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -