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

📄 os.cpp

📁 模拟文件系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
////////////////////////////////////////////////////////////
//  编译工具:Visual c++ 6.0                               //
//                                                        //
//  作者:~小楚*smill~ 、蓝色的天空                        //
//  邮件:qvb20974151@163.com                              //
//                                                        //
//  复制、传播请保留作者信息,谢谢!                       //
//                                                        //
////////////////////////////////////////////////////////////
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h> 
void fileCreate(char *fileName,int fileLenght);  //创建文件,文件最大长度为1万
void fileDel(char *fileName);                    //删除文件
void fileRead(char *fileName,int postion,int lenght);
void fileWrite(char *fileName,int position,char *s);      //函数声明
void fileAsk(char *fileName);                    //查询文件属性
void fileType(char *fileName);                   //显示文件内容
void fileRen(char *fileName,char *newName);      //重命名文件
void fileDir();                                  //列出所有文件
void fileClose(char *fileName);                  //关闭一个文件
int  requestDisk(int *startPosition,int *maxLength); //分配磁盘空间
/////////////////////////////////
//模拟磁盘空间
char disk[10000]; 

///////////////////////////////
//磁盘空间管理 
struct freeDiskTable 
{
	int start;   //开始位置
	int length;  //占用长度
	int maxLength;  //最大长度
	int useFlag;    //使用标志,1为占用,0为空闲
};
//////////////////////////////////
//文件表
struct fileTable
{
	char fileName[20];  //文件名字
	int start;          //开始位置
	int length;         //文件长度
	int maxLength;      //最大长度
    char fileKind[8];   //文件种类,此默认为txt
	struct tm *timeinfo; //文件创建时间
};
////////////////////////////////
//打开文件表
struct openFileTable
{
	char fileName[20];   //文件名字
	char fileKind[8];    //文件类型
	int start;           //文件开始位置
	int length;          //文件长度
	int maxLength;       //最大长度
	int openCount;       //打开文件的进程数
	struct tm *timeinfo; //文件创建时间
};
//////////////////////////////
typedef struct freeDiskTable LinDataType; //定义链表的数据类型
#include "LinList.h"               //链表操作集合
SLNode *freeDiskTableHead;         //定义磁盘分配表链表 头指针
#define MaxSize 100                //定义线性表 最大长度
typedef struct fileTable SeqDataType; //定义线性表数据类型

#include "SeqList.h"           //线性表操作集合
SeqList L; //文件表,模拟文件操作嘛,文件数不多,故可以用 线性表,简化操作^_^
struct openFileTable OFT[10];  //打开文件表数组
int OFT_count=0;               //打开文件表占用长度
void main()
{
	struct orderTable  //命令表
	{
		char name[8];  
	};
	char orderInput[30];   //存储用户输入的命令字符串
	char orderName[8];     //命令名字
	char fileName[20];    //命令参数1,是文件名字
	char parameter2[6];   //命令参数2,是个数字
	char parameter3[30];  //命令参数3,是字符串或数字
	struct orderTable u[9];  //命令表
	int i=0;                
	int flag=0;             //用户输入串 读写位置 标志
	int flagOrder=-1;
	/////////////////////////////////////
    
	LinListInitiate(&freeDiskTableHead);//磁盘空间分配键表初始化
	struct freeDiskTable temp; 
	temp.length=0;
	temp.maxLength=10000;
	temp.start=0;
	temp.useFlag=0;
	if(!LinListInsert(freeDiskTableHead,0,temp))
	{
		printf("初始磁盘空闲表失败!");
		system("pause");
		exit(0);
	}
	/////////////////////////////////////
	//文件表初始化
	SeqListInitiate(&L); //初始化 文件表

	/////////////////////////////////////
	for(i=0;i<2;i++)           
	for(int j=0;j<2;j++)
	{
		system("color fc");
		printf("\n\n\n\n\n\n\n\n\n                   作者:XXX 操作系统课程设计\n");
		for(int k=0;k<30000000;k++);
		system("cls");
		system("color f3");
		printf("\n\n\n\n\n\n\n\n\n                   作者:XXX 操作系统课程设计\n");
		for(k=0;k<30000000;k++);
		system("cls");
	}
	system("color 17");     //设置背景色 和 前景色
////////////////////////////////////////////////////////////
//初始化命令表
	strcpy(u[0].name,"create");
	strcpy(u[1].name,"delete");
	strcpy(u[2].name,"read");
	strcpy(u[3].name,"write");
	strcpy(u[4].name,"ask");
	strcpy(u[5].name,"type");
	strcpy(u[6].name,"ren");
	strcpy(u[7].name,"dir");
	strcpy(u[8].name,"close");
////////////////////////////////////////////////////////////
	while(1)
	{
		printf("\n");
		printf("|******************************************************|\n");
		printf("|* create-创建 delete-删除 read-读取  write-写入      *|\n");
		printf("|* ask-查询    type-显示   ren-重命名 dir-显示文件    *|\n");
		printf("|* close-关闭文件                                     *|\n");
		printf("|* 输入'命令 ?'获得帮助,例如'create ?',exit-退出程序 *|\n");
		printf("|******************************************************|\n");
		printf("请输入命令:>");
		fflush(stdin);      //清空缓冲区
		gets(orderInput);   //获取用户输入串
		if(!strcmp(orderInput,"exit"))exit(0); //当用户输入 exit 退出程序
		system("cls");     //清屏
		for(i=0;orderInput[i]!=' '&&orderInput[i]!='\0';i++)//以空格为界 分解用户输入串
		{
			orderName[i]=orderInput[i];
		}
		flag=i;//保存读写指针
		if(flag>6)        //命令名长度 小于6
		{
			printf("输入的命令有误,请重新输入!\n");
			continue ;
		}
		orderName[i]='\0';

		flagOrder=-1;  //初始化标志位,flagOrder 指明命令在命令表中的位置
		for(i=0;i<9;i++)
		{
			if(!strcmp(orderName,u[i].name))
			{
				flagOrder=i;   //记录命令的位置,以便访问
				break;
			}
		}
		if(flagOrder==-1)
		{
			printf("你输入的命令有误!请重新输入!\n");
			continue ;
		}
		/////////////////////////////////////////////////////
		//以空格为界,分解字符串,分解出第一个字符串放到fileName中
		for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
		{
			fileName[i-flag-1]=orderInput[i];
		}
		fileName[i-flag-1]='\0'; //为字符串数组 置一个结束标志
		/////////////////////////////////////////////////////
		flag=i;                   //下一个字符串 读写指针
		if(!strcmp(fileName,"?")) //显示命令帮助
		{
			switch(flagOrder)
			{
			case 0: 
				printf("创建一个文件 格式 create [filename][filelength]\n");
				printf("例如: create a1 1000 ,将创建名为a1,长度为1000字节的文件\n");
				break;
			case 1:
				printf("删除一个文件 格式 delete [filename] \n");
				printf("例如: delete a1,将删除名为a1的文件\n");
				break;
			case 2: 
				printf("读取一个文件 格式 read [filename][postion][length]\n");
				printf("例如: read a1 8 3,从a1文件第8个字节开始,显示3字节内容\n");
				break;
			case 3:
				printf("写一个文件   格式 write [fileName][postion][conten] \n");
				printf("例始: write a1 15 test,从a1文件第15字节开始写入 test 字符串\n");
				break;
			case 4:
				printf("显示文件的属性,格式 ask [filename]\n");
			    printf("例如 ask a1 ,将显示文件 a1的属性\n");
				break;
            case 5:
				printf("显示文件的所有内容,格式 type [filename]\n");
				printf("例如 type a1,将显示文件 a1的所有内容\n");
				break;
			case 6:
				printf("重命名一个文件,格式 ren [oldFileName][newFileName]\n");
				printf("例如ren a1 b1 ,将a1改名为b1\n");
				break;
			case 7:
				printf("显示所有文件,例如 dir,将显示所有文件\n");
				break;
			case 8:
				printf("关闭文件,格式 close [fileName]\n");
				printf("例如,close a1,将关闭文件a1\n");
				break;
			default:
				printf("命令错误");
			}
			getch();
		}
		else
		{
			switch(flagOrder)//对相应的命令 进行参数处理
			{
			case 0:
				{
					int Temp[4]={1,10,100,1000};
					int sum=0;
					int len=0;
					for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
					{
					parameter2[i-flag-1]=orderInput[i];
					}
					parameter2[i-flag-1]='\0'; //为字符串数组 置一个结束标志
					flag=i; 
					len=strlen(parameter2); //求字符串数组的长度
					for(i=0;i<len;i++)  //把第二个参数 字符串变成整数
					sum=sum+((int)parameter2[len-i-1]-48)*Temp[i];
					fileCreate(fileName,sum); //将命令和参数 传给建文件模块执行
				}
				break;
			case 1:
				
					fileDel(fileName); //删除文件
			     	break;
			case 2:
				{
					int Temp[4]={1,10,100,1000};
					int sum=0;
					int len=0;
					int sum2=0;
					//////////////////////////////////////////////////////////
					for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
					{
					parameter2[i-flag-1]=orderInput[i];
					}
					parameter2[i-flag-1]='\0';
					flag=i; 
					len=strlen(parameter2); //求字符串数组的长度
					for(i=0;i<len;i++)  //把第二个参数 字符串变成整数
					sum=sum+((int)parameter2[len-i-1]-48)*Temp[i];
					///////////////////////////////////////////////////////////
					for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
					{
					parameter3[i-flag-1]=orderInput[i]; //把第三个参数变成整型
					}
					parameter3[i-flag-1]='\0';
					flag=i; 
					len=strlen(parameter3);
					for(i=0;i<len;i++)
						sum2=sum2+((int)parameter3[len-i-1]-48)*Temp[i];
					fileRead(fileName,sum,sum2); //调用读文件模块

				}
				break;
			case 3:
				{
					int Temp[4]={1,10,100,1000};
					int sum=0;
					int len=0;
					//////////////////////////////////////////////////////////
					for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
					{
					parameter2[i-flag-1]=orderInput[i];
					}
					parameter2[i-flag-1]='\0';
					flag=i; 
					len=strlen(parameter2); //求字符串数组的长度
					for(i=0;i<len;i++)  //把第二个参数 字符串变成整数
					sum=sum+((int)parameter2[len-i-1]-48)*Temp[i];
					///////////////////////////////////////////////////////////
					for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
					{
					parameter3[i-flag-1]=orderInput[i]; //获取第三个参数,为字符串
					}
					parameter3[i-flag-1]='\0';
					flag=i; 
					//////////////////////////////////////////////////////////
					fileWrite(fileName,sum,parameter3); //调用写文件模块
				}
                break;
			case 4:
					fileAsk(fileName); //查询文件属性
					break;
			case 5:
				fileType(fileName);    //显示文件内容
				break;
			case 6:
				{
					for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
					{
						parameter2[i-flag-1]=orderInput[i];
					}
					parameter2[i-flag-1]='\0';
					flag=i; 
					fileRen(fileName,parameter2);
				}
				break;
			case 7:
				fileDir();
				break;
			case 8:
				fileClose(fileName);
				break;
			default:
				printf("错误!没有可执行的命令");
			}
		}

	}
}
//以上主函数,主函数进行数据结构的定义 分析用户输入的命令。
//提供命令帮助。把命令和参数,传递给执行模块
//////////////////////////////////////////////////////////////////////
void fileCreate(char *fileName,int fileLength)//没有写到打开文件表
{

	int i=0;
	time_t rawtime;
	int startPosition=0; //文件开始位置,等磁盘分配函数 返回值
	int maxLength=fileLength;
	struct fileTable temp;
	for(i=0;i<L.size;i++)
	if(!strcmp(fileName,L.list[i].fileName)) //判断是否重名,如果重名直接返回
	{
		printf("文件重名,请取别的名字!\n");
		return ; //文件重名,退出创建函数
	}
    if(!requestDisk(&startPosition,&maxLength))
	{
		printf("申请磁盘空间失败!无法建立文件!\n");
		return ; //申请磁盘空间失败,退出创建函数
	}
	strcpy(temp.fileName,fileName); 
	strcpy(temp.fileKind,"txt"); //设置文件类型为 txt
	temp.length=0;               //创建的时候,还没写入内容,是空文件,长度设为0
	temp.maxLength=fileLength;  //文件的最大长度
	temp.start=startPosition;   //文件的开始位置
	
	time(&rawtime); //获取时间
	temp.timeinfo=localtime(&rawtime); //把时间写到结构体里去

	if(!SeqListInsert(&L,L.size,temp)) //把文件 插入到文件表
	{
		printf("插入文件表失败!\n");
		system("pause");
		exit(0); //把文件插入到 文件表,如果失败,退出程序
	}

⌨️ 快捷键说明

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