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

📄 os.cpp

📁 模拟文件系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	printf("成功创建文件!\n\n");
	printf("===========================================\n");
	printf("文件名    长度    最大长度   类型  开始位置\n");//显示刚建立的文件
	printf("%s     ",temp.fileName);
	printf("%d       ",temp.length);
	printf("%d      ",temp.maxLength);
	printf("%s    ",temp.fileKind);
	printf("%d    ",temp.start);
	printf("\n===========================================\n");
	printf("create进程打开了文件%s,关闭请用close命令!\n\n",fileName);
	//写到打开文件表
	strcpy(OFT[OFT_count].fileName,temp.fileName);
	strcpy(OFT[OFT_count].fileKind,temp.fileKind);
	OFT[OFT_count].length=temp.length;
	OFT[OFT_count].maxLength=temp.maxLength;
	OFT[OFT_count].start=temp.start;
	OFT[OFT_count].openCount=1;
	OFT[OFT_count].timeinfo=temp.timeinfo;
	OFT_count++;                    //打开表 记录的是文件数 
	//printf("count%d",OFT_count);

}
void fileDel(char *fileName)
{
	int i;
	int flag=0;    
	int k=0;       //记录文件在 文件表中的位置
	SLNode *p;    //磁盘空间分配表 指针
	SeqDataType x; //存储被删除的结点,无特殊意义
	for(i=0;i<OFT_count;i++) //判断是否被别的进程占用,若被占用,打印出错,直接返回
	   if(!strcmp(fileName,OFT[i].fileName))
		{
			printf("别的进程占用文件!无法删除!");
			return ;
		}
	for(i=0;i<L.size;i++)//从文件表里查找到要删除的文件,若查找不到,直接返回
	{
		if(!strcmp(fileName,L.list[i].fileName))
		{
			flag=1;
			k=i;
			break;
		}
	}
	if(flag==0)
	{
		printf("无此文件!");
		return ;
	}
	if(flag==1)//查找到文件后,把磁盘空间置为空闲,之后从文件表中删除
	{
		for(p=freeDiskTableHead;p->next!=NULL;p=p->next)
		{
			if(p->next->data.start==L.list[k].start)
			{
				p->next->data.useFlag=0;
				printf("成功删除!\n");
				break;
			}
		}
		SeqListDelete(&L,k,&x);//从文件表中删除
	}
}
void fileRead(char *fileName,int position,int length)
{
	int i;
	int flag=0;
	int k=0;
	for(i=0;i<OFT_count;i++)   //查找文件打开表,如果存在,则不需要再查找文件表
	{
		if(!strcmp(fileName,OFT[i].fileName))
		{
			k=i;
			flag=1;
			OFT[i].openCount++;//多个进程打开,计算器加1
			break;
		}
	}
	if(flag!=1) //文件不在打开表,找到它,并写到打开表最后
	{
		for(i=0;i<L.size;i++)
		{
			if(!strcmp(fileName,L.list[i].fileName)) //找到文件,写到文件打开表
			{
				strcpy(OFT[OFT_count].fileName,L.list[i].fileName);
				strcpy(OFT[OFT_count].fileKind,L.list[i].fileKind);
				OFT[OFT_count].length=L.list[i].length;
				OFT[OFT_count].maxLength=L.list[i].maxLength;
				OFT[OFT_count].start=L.list[i].start;
				OFT[OFT_count].timeinfo=L.list[i].timeinfo;
				OFT[OFT_count].openCount++;
				k=OFT_count;
				//OFT_count=1;//初次打开,赋值为1
				flag=1; //标志在打开文件表里
			}
		}
	}
	if(flag==1)
	{
		if(position<0||position+length>OFT[k].length)
		{
			printf("读取参数错误,请检查参数!\n");
			return ;
		}
		for(i=0;i<length;i++)
			printf("%c",disk[OFT[k].start+position+i-1]); //读取内容
		printf("\nread进程打开了文件%s,关闭请用close命令!\n\n",fileName);
	}

}
void fileWrite(char *fileName,int position,char *s)//找到文件,写到打开表,根据打开表操作
{
	int i=0;
	int len=0; //计算写入字串长度,跟原来长度相加,如果超过最大长度,就失败
	int k=0;   //如果在 打开表里打到记录,则记录位置
	int flag=0; //如果flag=1,说明在打开表里找到了,不用在文件表里找了
	len=strlen(s);
	for(i=0;i<OFT_count;i++)
	{
		if(!strcmp(fileName,OFT[i].fileName))
		{
			k=i;
			flag=1;
			OFT[i].openCount++;//多个进程打开,计算器加1
			break;
		}
	}
	if(flag!=1) //文件不在打开表,找到它,并写到打开表最后
	{
		for(i=0;i<L.size;i++)
		{
			if(!strcmp(fileName,L.list[i].fileName)) //找到文件,写到文件打开表的最后
			{
				strcpy(OFT[OFT_count].fileName,L.list[i].fileName);
				strcpy(OFT[OFT_count].fileKind,L.list[i].fileKind);
				OFT[OFT_count].length=L.list[i].length;
				OFT[OFT_count].maxLength=L.list[i].maxLength;
				OFT[OFT_count].start=L.list[i].start;
				OFT[OFT_count].timeinfo=L.list[i].timeinfo;
				OFT[OFT_count].openCount++;
				k=OFT_count;                  //记录在文件打开表中的位置
				flag=1; //标志在打开文件表里
				
			}
		}
	}
	if(1==flag)  //如果在打开表里 找到文件,则不用再找文件表
	{
		if(OFT[k].length+len>OFT[k].maxLength)
		{
			printf("超过文件最大长度,写入失败!\n");
			return ;
		}
		else if(position<0||position>OFT[k].length)
		{
			printf("插入位置非法!请检查参数\n");
			return ;
		}
		else
		{
			int j=0;
			for(i=OFT[k].length-1;i>=OFT[k].start+position;i--)
			disk[i+len]=disk[i];  //给插入的字符串 空出位置
			for(i=OFT[k].start+position;i<OFT[k].start+position+len;i++,j++)
			disk[i]=s[j];       //写进磁盘
			for(i=0;i<L.size;i++)     //改变文件长度
			{
				if(!strcmp(fileName,L.list[i].fileName))
				{
					L.list[i].length=L.list[i].length+len;  //设置文件长度
					break;
				}
			}
            OFT[k].length=OFT[k].length+len;   //同时更新打开文件表中文件的长度
			printf("成功写入!\n");
			printf("write进程打开了文件%s,关闭请用close命令!\n\n",fileName);
		}
	}
	else
	printf("无此文件,请输入正确的文件名!");
}
void fileAsk(char *fileName)
{
	int i;
	int flag=0;
	for(i=0;i<OFT_count;i++)    //如果在打开表里 找到文件,则不用再找文件表
	{
		if(!strcmp(fileName,OFT[i].fileName))
		{
			printf("文件名:%s\n",OFT[i].fileName);
			printf("类型:%s\n",OFT[i].fileKind);
			printf("长度:%d\n",OFT[i].length);
			printf("打开进程数:%d\n",OFT[i].openCount);
			printf("创建时间:%s\n",asctime(OFT[i].timeinfo));
			flag=1;
			break;
		}
	}
	if(flag!=1)
	{
		for(i=0;i<L.size;i++)  //从文件表里查找文件
		{
			if(!strcmp(fileName,L.list[i].fileName))
			{
				printf("文件名:%s\n",L.list[i].fileName);
				printf("类型:%s\n",L.list[i].fileKind);
				printf("长度:%d\n",L.list[i].length);
				printf("创建时间:%s\n",asctime(L.list[i].timeinfo));
				flag=1;
				break;
			}

		}
	}
	if(flag==0)
	printf("无此文件!\n");
}
void fileType(char *fileName)
{
	int i;
	int flag=0;
	int k=0;
	for(i=0;i<OFT_count;i++)
	{
		if(!strcmp(fileName,OFT[i].fileName))
		{
			k=i;
			flag=1;
			OFT[i].openCount++;//多个进程打开,计算器加1
			break;
		}
	}
	if(flag!=1) //文件不在打开表,找到它,并写到打开表最后
	{
		for(i=0;i<L.size;i++)
		{
			if(!strcmp(fileName,L.list[i].fileName)) //找到文件,写到文件打开表
			{
				strcmp(OFT[OFT_count].fileName,L.list[i].fileName);
				strcmp(OFT[OFT_count].fileKind,L.list[i].fileKind);
				OFT[OFT_count].length=L.list[i].length;
				OFT[OFT_count].maxLength=L.list[i].maxLength;
				OFT[OFT_count].start=L.list[i].start;
				OFT[OFT_count].timeinfo=L.list[i].timeinfo;
				OFT[OFT_count].openCount++;
				k=OFT_count;
				//OFT_count=1;//初次打开,赋值为1
				flag=1; //标志在打开文件表里
			}
		}
	}
	if(flag==1)
	{
		for(i=0;i<OFT[k].length;i++)
			printf("%c",disk[OFT[k].start+i]); //显示全部内容
		if(OFT[k].length==0)
			printf("文件为空,无内容显示!\n");
	printf("\n===========================================\n");
	printf("\ncreate进程打开了文件%s,关闭请用close命令!\n\n",fileName);
	//	printf(",,,,\n");
	//	printf("OFT[k].length %d\n",OFT[k].length);
	}
	else
		printf("无此文件,请检查文件名!\n");
}
void fileRen(char *fileName,char *newName)
{
	int i=0;
	int flag=0;
	for(i=0;i<OFT_count;i++) //若还有别的进程打开文件,刚不能重命名
	   if(!strcmp(fileName,OFT[i].fileName))
		{
			printf("别的进程占用文件!无法重命名!\n");
			return ;
		}
	for(i=0;i<L.size;i++)   //在文件表里找到,并重命名
		if(!strcmp(fileName,L.list[i].fileName))
		{
			strcpy(L.list[i].fileName,newName);
			flag=1;
			break;
		}
	if(flag==1)
		printf("重命名成功!\n");
	else
		printf("重命名失败!无此文件\n");

}
void fileDir()
{
	int i;
	if(L.size==0)  //文件表的 大小为0,说明没有文件
	{
		printf("磁盘无文件!\n");
		return ;
	}
	for(i=0;i<L.size;i++)   //打印所有文件名
		printf("%s\n",L.list[i].fileName); 

}
void fileClose(char *fileName)
{
	int i;
	int flag=0;
	int j;
	for(i=0;i<OFT_count;i++)
	{
		if(!strcmp(fileName,OFT[i].fileName)) //在文件打开表里找到,把打开数减1,
			                                  //如果计数为0,显示关闭成功!
		{
			OFT[i].openCount--;
			flag=1;
			if(OFT[i].openCount==0)
			{
				for(j=i;j<OFT_count;j++)
					OFT[j]=OFT[j+1]; //删除要关闭的文件
				OFT_count--;
				printf("成功关闭文件!\n");
			}
			else
				printf("计数器减1\n");
			break;
		}
	}
	if(flag==0)
		printf("此文件没有打开!\n");

}
///////////////////////////////
//磁盘空间管理 操作
int requestDisk(int *startPosistion,int *maxLength)
{
	struct freeDiskTable temp;
	int flag=0; //分配成功与否标志
	int k=0; //记录插入位置
    SLNode *p=NULL;
	for(p=freeDiskTableHead;p->next!=NULL;p=p->next)
	{
		k++;//记录位置,在空闲结点之后插入结点
		if(p->next->data.useFlag==0&&p->next->data.maxLength>=*maxLength)
		{
			temp.length=0;
			temp.maxLength=p->next->data.maxLength-*maxLength;
			temp.start=p->next->data.start+*maxLength;
			temp.useFlag=0;     //分解节点
			//=========================================
			p->next->data.maxLength=*maxLength;
			p->next->data.useFlag=1;   //设置分配的空间标志位
			*startPosistion=p->next->data.start;
			flag=1;//成功分配
			break;
			
		}
	
	}

    if(1==flag)  //成功分配空间,返回成功标志
	{
		if(!LinListInsert(freeDiskTableHead,k,temp))
		{
			printf("失败!\n");
			system("pause");
			exit(0);
		}
	return 1;
	}
	else
		return 0;
}
///////////////////////////////////////////////////

⌨️ 快捷键说明

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