操作系统文件系统部分函数(二)

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

	if( strlen(dirname) > 10)
		return -1;
	//if(lengthdir == 32)
	//	return -2; //full

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

	if(dir == -1)
	{
		for(i = 0 ; i < MAXFCB ; i++)
		{
			if(cur_mkdir[i].attribute == -1)
				break;
		}
		if(i ==  MAXFCB)
			return -2;

		/*-------------填写目录项----------*/
		strcpy(cur_mkdir[i].filename,dirname);
		cur_mkdir[i].attribute = 0;
		cur_mkdir[i].data = 0;
		cur_mkdir[i].time = 12;
		cur_mkdir[i].nextdirectory = -1;
		cur_mkdir[i].nextfile = -1;
		cur_mkdir[i].length = 0;

		cur_mkdir[openfilelist[fd].topenfile].nextdirectory = i;
		openfilelist[fd].nextdirectory = i;
		openfilelist[fd].fcbstate = 1;
	}
	else
	{
		while(cur_mkdir[dir].nextfile != -1)
		{
			if(!strcmp(cur_mkdir[dir].filename,dirname))
				return -4;
			dir = cur_mkdir[dir].nextfile;
		}
		if(!strcmp(cur_mkdir[dir].filename,dirname))
			return -4;

		for(i = 0 ; i < MAXFCB ; i++)
		{
			if(cur_mkdir[i].attribute == -1)
				break;
		}
		if(i ==  MAXFCB)
			return -2;

		/*-------------填写目录项----------*/
		strcpy(cur_mkdir[i].filename,dirname);
		cur_mkdir[i].attribute = 0;
		cur_mkdir[i].data = 0;
		cur_mkdir[i].time = 12;
		cur_mkdir[i].nextdirectory = -1;
		cur_mkdir[i].nextfile = -1;
		cur_mkdir[i].length = 0;

		cur_mkdir[dir].nextfile = i;
		openfilelist[fd].fcbstate = 1;
	}
	lengthdir++;
	return 1;
}



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

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

	if(frontdir == dir)
		cur_mkdir[frontdir].nextdirectory = cur_mkdir[dir].nextfile;
	else
		cur_mkdir[frontdir].nextfile = cur_mkdir[dir].nextfile;
	cur_mkdir[dir].attribute = -1;

	if(cur_mkdir[dir].nextdirectory != -1) // file in the directory;
	{
		//delete brother nodes;
		dir = cur_mkdir[cur_mkdir[dir].nextdirectory].nextfile;
		while(dir != -1)
		{
			if(cur_mkdir[dir].attribute == 0)
				my_rmdir(cur_mkdir[dir].filename);
			else
				my_rm(cur_mkdir[dir].filename);
			dir = cur_mkdir[dir].nextfile;
		}
		if(cur_mkdir[dir].attribute == 0)
			my_rmdir(cur_mkdir[dir].filename);
		else
			my_rm(cur_mkdir[dir].filename);

		//delete this node;
		if(cur_mkdir[cur_mkdir[dir].nextdirectory].attribute == 0)
			my_rmdir(cur_mkdir[cur_mkdir[dir].nextdirectory].filename);
		else
			my_rm(cur_mkdir[cur_mkdir[dir].nextdirectory].filename);
	}
	lengthdir--;
	//删除当前目录
	return 1;
}


void my_ls(void)
{
    int 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 ;
	else
	{
		while(cur_mkdir[dir].nextfile != -1)
		{
			printf("%s\t\t",cur_mkdir[dir].filename);
			if(cur_mkdir[dir].attribute == 1) /*-文件-*/
				printf("%d\t\t\n",cur_mkdir[dir].length);
			else          /*-目录-*/
				printf("%d\t\t<DIR>\t\n",cur_mkdir[dir].length);
			dir = cur_mkdir[dir].nextfile;
		}
		printf("%s\t\t",cur_mkdir[dir].filename);
		if(cur_mkdir[dir].attribute == 1) /*-文件-*/
			printf("%d\t\t\n",cur_mkdir[dir].length);
		else          /*-目录-*/
			printf("%d\t\t<DIR>\t\n",cur_mkdir[dir].length);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值