阅读背景:

操作系统文件系统C语言实现的部分函数(一)

来源:互联网 
void startsys()
{
	int i;
	FILE *fp;
	char str[9];
	myvhard = (unsigned char *)malloc(SIZE*sizeof(char)); /*申请 1M空间*/
	if((fp=fopen("myfsys.dat","rb")) == NULL)
	{
		printf("myfsys文件系统不存在,现在开始创建文件系统\n");
		my_format();
		//fclose(fp);
		if((fp = fopen("myfsys.dat","w"))== NULL)
		{
			printf("open error!\n");
			exit(1);
		}
		strcpy(str,"10101010");
		fwrite(str,sizeof( char ),8,fp);
		fwrite(myvhard,SIZE,1,fp);
		fclose(fp);
	}
	else
	{
		fread(str, sizeof( char ), 8, fp );
		str[8] = '
void startsys()
{
	int i;
	FILE *fp;
	char str[9];
	myvhard = (unsigned char *)malloc(SIZE*sizeof(char)); /*申请 1M空间*/
	if((fp=fopen("myfsys.dat","rb")) == NULL)
	{
		printf("myfsys文件系统不存在,现在开始创建文件系统\n");
		my_format();
		//fclose(fp);
		if((fp = fopen("myfsys.dat","w"))== NULL)
		{
			printf("open error!\n");
			exit(1);
		}
		strcpy(str,"10101010");
		fwrite(str,sizeof( char ),8,fp);
		fwrite(myvhard,SIZE,1,fp);
		fclose(fp);
	}
	else
	{
		fread(str, sizeof( char ), 8, fp );
		str[8] = '\0';
		if(strcmp(str,"10101010") == 0)
		{
			//将上述缓冲区中的内容复制到内存中的虚拟磁盘空间中
			fread(myvhard,SIZE,1,fp);
		}
		else
		{
			printf("myfsys文件系统不存在,现在开始创建文件系统\n");
			my_format();
			fclose(fp);
			if((fp=fopen("myfsys.dat","w"))== NULL)
			{
				printf("open error!\n");
				exit(1);
			}
			strcpy(str,"10101010");
			fwrite(str,sizeof( char ),8,fp);
			fwrite(myvhard,SIZE,1,fp);
		}
		fclose(fp);
	}

	fat_f = (struct FAT *)(myvhard + BLOCKSIZE);  /*找到FAT表地址*/
	root = (struct FCB *)(myvhard + BLOCKSIZE * 5);/*找到根目录地址*/

	strcpy(currentdir,"Root:");
	lengthdir = 2;
	for(i = 0; i < MAXOPENFILE; i++)
	{
		strcpy(openfilelist[i].filename,"");
		openfilelist[i].topenfile = -1;
		openfilelist[i].dirno = 5;
	}

	struct FCB *cur_mkdir = root;
	strcpy(openfilelist[0].filename,cur_mkdir[0].filename);
	openfilelist[0].attribute = 0;
	openfilelist[0].data =0;
	openfilelist[0].time = 0;
	openfilelist[0].nextdirectory = 0;
	openfilelist[0].nextfile = -1;
	openfilelist[0].length = 0;

	openfilelist[0].diroff = -1;
	openfilelist[0].dirno = 5;
	openfilelist[0].topenfile = -2;
	fd = 0;
}

//格式化
void my_format()
{
	int i;
	block0 block;
	strcpy(block.information,"10101010 磁盘块大小:1024000 磁盘块数量: 1024 最多打开文件数:10\n");
	block.root = 5;
	block.startblock = (unsigned char *)(myvhard + BLOCKSIZE * 6);

	fat_f = (struct FAT*)(myvhard + BLOCKSIZE);
	for(i = 0; i < 6; i++)
		fat_f[i].id = END;
	for(; i < 1000 ;i++)
		fat_f[i].id = FREE;

	lengthdir = 0;
	root = (struct FCB *)(myvhard + BLOCKSIZE * 5);

	strcpy(root[0].filename,".");
	root[0].attribute = 0;
	root[0].data = 0;
	root[0].time = 12;
	root[0].nextdirectory = -1;
	root[0].nextfile = 1;
	root[0].length = 0;
	root[0].first = 0;
	lengthdir++;

	strcpy(root[1].filename,"..");
	root[1].attribute = 0;
	root[1].data = 0;
	root[1].time = 12;
	root[1].nextdirectory = -1;
	root[1].nextfile = -1;
	root[1].length = 0;
	root[1].first = 0;

	lengthdir++;
	for(i = 2 ; i < MAXFCB ; i++)
	{
		root[i].attribute = -1;
		root[i].nextdirectory = -1;
		root[i].nextfile = -1;
	}
}

int my_cd(char *dirname)
{
    int i,j;
	struct FCB *cur_mkdir = root;
	for(j = fd ; j >= 0 ; j--)
		if(openfilelist[j].attribute == 0)
			break;
	char dir = openfilelist[j].nextdirectory;

	if(dir == -1)
		return -1;  //no file frontdir

	int flag = 0;

	/*
	for(int i = 0; i < MAXOPENFILE; i++)
	{
		if(!strcmp(openfilelist[i].filename,dirname))
			return -2;  //
	}
	*/

	while(cur_mkdir[dir].nextfile != -1)
	{
		if(!strcmp(cur_mkdir[dir].filename,dirname) && cur_mkdir[dir].attribute == 0)
		{
			flag = 1;
			break;
		}
		dir = cur_mkdir[dir].nextfile;
	}
	if(!strcmp(cur_mkdir[dir].filename,dirname))
		flag = 1;
	if(flag == 0) //not find
		return -1;

	for(i = 0; i < MAXOPENFILE; i++)
	{
		if(openfilelist[i].topenfile == -1)
			break;
	}
	if(i == MAXOPENFILE)
		return -3; // openlist is full

	strcpy(openfilelist[i].filename,dirname);
	openfilelist[i].attribute = cur_mkdir[dir].attribute;
	openfilelist[i].data = cur_mkdir[dir].data;
	openfilelist[i].time = cur_mkdir[dir].time;
	openfilelist[i].nextdirectory = cur_mkdir[dir].nextdirectory;
	openfilelist[i].nextfile = cur_mkdir[dir].nextfile;
	openfilelist[i].length = cur_mkdir[dir].length;

	openfilelist[i].dirno = 5;
	openfilelist[i].topenfile = dir;
	openfilelist[i].fcbstate = 0;

	for(j = i-1 ;j >0 ; j--)
		if(openfilelist[i].topenfile != -1 && openfilelist[i].attribute == 0)
			break;
	openfilelist[i].diroff = j;

	fd = i;
	strcat(currentdir,"\\");
	strcat(currentdir,dirname);
	return 1;
}


'; if(strcmp(str,"10101010") == 0) { //将上述缓冲区中的内容复制到内存中的虚拟磁盘空间中 fread(myvhard,SIZE,1,fp); } else { printf("myfsys文件系统不存在,现在开始创建文件系统\n"); my_format(); fclose(fp); if((fp=fopen("myfsys.dat","w"))== NULL) { printf("open error!\n"); exit(1); } strcpy(str,"10101010"); fwrite(str,sizeof( char ),8,fp); fwrite(myvhard,SIZE,1,fp); } fclose(fp); } fat_f = (struct FAT *)(myvhard + BLOCKSIZE); /*找到FAT表地址*/ root = (struct FCB *)(myvhard + BLOCKSIZE * 5);/*找到根目录地址*/ strcpy(currentdir,"Root:"); lengthdir = 2; for(i = 0; i < MAXOPENFILE; i++) { strcpy(openfilelist[i].filename,""); openfilelist[i].topenfile = -1; openfilelist[i].dirno = 5; } struct FCB *cur_mkdir = root; strcpy(openfilelist[0].filename,cur_mkdir[0].filename); openfilelist[0].attribute = 0; openfilelist[0].data =0; openfilelist[0].time = 0; openfilelist[0].nextdirectory = 0; openfilelist[0].nextfile = -1; openfilelist[0].length = 0; openfilelist[0].diroff = -1; openfilelist[0].dirno = 5; openfilelist[0].topenfile = -2; fd = 0; } void startsys() { int i; FILE *fp; char str[



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: