/*
作者:王佳
时间: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[i