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

📄 os.c

📁 模拟文件系统的功能
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define get(type) (type *)malloc(sizeof(type))
typedef struct ufd UFD;
struct ufd
{	
	char filename[10];//文件名
	int protect;//文件操作码
	int length;//文件长度
	struct ufd *next;//指向下一文件
};

typedef struct mfd MFD;
struct mfd
{
	char username[10];//用户名
	UFD *file;//用户目录下的文件指针
	struct mfd *next;//下一个用户
};
typedef struct afd AFD;
struct afd
{
	char filename[10];//当前运行的文件名
	int protect;//当前运行的文件操作码
	int length;//长度
	char text[1024];//当前运行的文件内容
	struct afd *next;//下一个运行的文件
};
UFD *buffer;
MFD *buffer1;
void displayuseroption();
void displayfileoption();
void creatuser();
void deleteuser();
void selectuser();
void displayuser();
void displayopen();
void displayfile(MFD *pp);
void creatfile(MFD *qq);
void deletefile();
void openfile();
void readfile();
void writefile();
void displayproperty(MFD *pp);//显示属性
void deleteafd();
void closefile();
void renamefile();//改文件名
void renameuser();//改用户名
void copyfile(MFD *pp);  //复制文件
void pastefile(MFD *pp); //粘贴文件
void copyuser();//复制用户
void pasteuser();//粘贴用户

MFD *user=NULL,*currentuser = NULL;//记录当前选中的用户
AFD *currentopen = NULL;

void displayuseroption()                          //显示用户菜单,可以创建,删除,选择用户
{
	system("cls");
	char s;
	printf("\n\n\t\t=========== user menu ============");
	printf("\n\t\t   1:create new user  \n\t\t   2:delete user  \n\t\t");
	printf("   3:select one user to option  \n\t\t   4.display user list\n\t\t   5.rename user\n");
	printf("\t\t   6.copyuser \n\t\t   7.pasteuser \n\t\t   q:exit \n");
	printf("\n\t\t================================");
	printf("\n\t\tplease select user option:");
	scanf("%s",&s);
	switch(s)
	{
		case '1':	creatuser();	
					getchar();
					displayuseroption();
					break;  //创建新用户

		case '2':	deleteuser();	getchar();
					displayuseroption();
					break;    //删除用户
		case '3':	selectuser();
					getchar();
					displayfileoption();
					break;  //选择一个用户,以便对该用户进行操作

		case '4':	displayuser();	
					getchar();
					displayuseroption();
					break;

		case '5':	renameuser(); 	
					getchar();
					displayuseroption();
					break;
		case '6':   copyuser();
					getchar();
					displayuseroption();
					break;
		case '7':	pasteuser();

					break;

		case 'q':	exit(0);
					break;    //退出系统

		default :	displayuseroption();
					break;    //若输入的是其他的字符,则重返用户菜单
	}
}
void displayfileoption()                     //显示文件操作菜单
{
	system("cls");
	char s;
	displayfile(currentuser);
	printf("\n\n\t\t=========== file menu ============");
	printf("\n\n\t____________________________________");
	printf("\n\t...........   %s  .............\n",currentuser->username);
	printf("\t___________________________________ \n");
	printf("\n\t\n\t\t1.create new file  \n\t\t2.delete file");
	printf("\n\t\t3.open file  \n\t\t4.close file     \n\t\t5.read file      \n\t\t6.write file");
	printf("   \n\t\t7.rename file	\n\t\t8.display file property	\n\t\t");
	printf("   \n\t\t9:copy file     \n\t\t0.paste file   \n\t\tq:exit \n");
	printf("\n\n\tplease select file option:");
	scanf("%s",&s);
	switch(s)
	{
		case '1':creatfile(currentuser);break;     //创建文件
		case '2':deletefile();break;              //删除文件
		case '3':{openfile(); displayfileoption();}break;     //打开文件
		case '4':{closefile();displayfileoption();}break;       //关闭文件
		case '5':{readfile();getchar();displayfileoption();}break;        //读文件
		case '6':{writefile();displayfileoption();}break;          //写文件
		case '7': renamefile();	  break; 			//重命名文件
		case '8': displayproperty(currentuser); break;
		case '9': copyfile(currentuser); break;
		case '0': pastefile(currentuser); break;
		case 'q':{currentuser=NULL;deleteafd();displayuseroption();}break;       //退出,返回上一级菜单
		default :displayfileoption();break;      //非法输入,返回文件菜单
	}
}

void creatuser()       //创建新用户
{
	system("cls");
	int i;
	char s;
	MFD *second,*first=user;
	second=get(MFD);//分配MFD的空间给指针second
	for(i=1;first!=NULL;i++)// i 指示当前用户个数
		first=first->next;      //找到链表中的最后一个节点就是最后一个用户的节点
						//以便创建的新用户放在此用户的节点后面
	first=user;
	printf("\n\tcreate a new user......");
	printf("\n\t====input NO.%d user: ",i);
	scanf("%s",second->username);   //输入新用户的名字
	second->file=NULL;//新用户没文件
	second->next=NULL;//新用户的文件指针为空
	if(user==NULL)
	{
		user=second;  //若 user 为空,把P 复给user
	}
	else  //若user 不空,则以有旧用户存在
	{                                  
		while(first->next!=NULL)
		{            //寻找最后一个用户
			if(strcmp(second->username,first->username)==0)
			{             //比较,若系统中已经存在该用户,
				printf("\n\tthe user has exsit ! try again !\n\n");  //报出错
				getchar();
				displayuseroption();
			}
			first=first->next;
			 
		}
		first->next=second;        //second指向的为最后一个用户 
	}
	printf("\n\tcreate one more user?(y / n) ");        //输入下一个用户
	scanf("%s",&s);
	switch(s)
	{
		case 'y':creatuser();break;
		case 'n':displayuseroption();break;
		default :displayuseroption();break;
	}
}

void copyuser()//复制用户
{
	displayuser();
	char name[10];
	MFD *temp=user;
	printf("\ncopy user........");
	printf("\ninput the user you want to copy:");
	scanf("%s",name);
	while(temp!=NULL)
	{
		if(!strcmp(temp->username,name))
		{
			buffer1=get(MFD);
			//buffer1=temp;
			strcpy(buffer1->username,temp->username);
			buffer1->file=temp->file;
			buffer1->next=NULL;
			break;
		}
		temp=temp->next;
	}
	getchar();
	displayuseroption();
}

void pasteuser()//粘贴用户
{
	
	MFD *temp=user;
	displayuser();
	printf("\npaust user......");
	printf("\nbuffer1 content:%s\n",buffer1->username);
	if(temp)
	{
		while(temp->next!=NULL)
			temp=temp->next;
		temp->next=buffer1;
		printf("temp->next1:%s\n",temp->next->username);
	}
	else
	{
		user=buffer1;
	}
	displayuser();
	getchar();
}

void deleteuser()      //删除用户
{ 
	char n[10];
	MFD *p=user,*pre=NULL;
	printf("\ndelete user......");
	displayuser();
	if(!p){
		printf("\nTIP : no user! \n\t  please create a user first!\n");     //P为空,报错,必须先创建一个用户
	    getchar();
	    displayuseroption();
	}

	printf("\n\t====please input the user name you want to delete:");
	scanf("%s",n);
	while(p!=NULL)
	{
		if(strcmp(p->username,n)==0)    //寻找所要删除的用户
		{
			if(p==user)
			{
				user=user->next;    //若是第一个用户,则释放P
				free(p);
			}
			else
			{
				pre->next=p->next;     
				free(p);
			}
		break;
		}
		else
		{
			pre=p;
			p=p->next;
		}
   }
		if(p==NULL)     //找不到用户
		{
			printf("\n\nTIP:\n\tthe user is not exsit!");
			getchar();
		}

}


void selectuser()      //选择用户 ,以便对他的文件进行操作
{
	char n[10];
	MFD *p=user;
	printf("\nselect user......");
	displayuser();
	if(!p)
	{
		printf("\nTIP:\n\tthe user is not exist! \n\t please create a new user first!\n");   //没用户
	    getchar();
	    displayuseroption();
	}

	printf("\n\n\t select one user to option:");
	printf("\n\n====input the user name:");
	scanf("%s",n);      //输入用户名
	while(p!=NULL)
	{
		if(strcmp(p->username,n)==0)        //逐个比较寻找用户
		{
			currentuser=p;      //找到对应用户,把currentuser 指向该用户
			return;
		}
		else
		{
			p=p->next;       
		}
	}
	if(p==NULL)       //找不到用户
	{
		printf("\n\nTIP:\n\tthe user is not exist! !");

	}
}

void renameuser()//修改用户名
{
	char name[10],s;
	MFD *p=user;
	int flag=0;
	displayuser();
	printf("\n\tinput the user name you want to modify:");
	scanf("%s",name);
	while(p!=NULL)
	{
		if(strcmp(p->username,name)==0)
		{
			printf("input the new user name:");
			scanf("%s",name);
			printf("\nDo you really want to chang user<%s>into new user<%s>? <y|n>",p->username,name);
			scanf("%s",&s);
			switch(s)
			{
				case 'y':   strcpy(p->username,name);
							printf("\nmodify name success!\n");
							flag=1;
							break;
				case 'n':	break;
				default:	break;
			}
			if(flag)
				break;
		}
		else
			p=p->next;
	}
	if(p==NULL)
	{
		printf("\n\nTIP:\n\tthe user is not exist! !");
	}
}

void creatfile(MFD *create)        //创建文件
{
	char s,name[10];
	printf("\ncreate file......");
	UFD *temp,*n=create->file;         
	temp=get(UFD);
	if(n!=NULL)            //把n指向最后一个文件
	{
		while(n->next!=NULL)
			n=n->next;//查找最后一个文件节点
		n->next=temp;//为创建新文件分配UFD空间
	}
	else     //此用户还没创建文件
	{
		create->file=temp;
	}
	printf("\n\n\t create a new file!");
	 printf("\n\t====input the file name : ");     //输入文件名
	scanf("%s",name);
	strcpy(temp->filename,name);
	printf("\n\n\tinput the protect type:");
	printf("\n\t0  read only \n\t1  read&write");     //设置保护方式
	printf("\n\t====select (0 or 1):");
	scanf("%d",&temp->protect);
	if(temp->protect!=0&&temp->protect!=1)
	{ 
		printf("\n\t====please select again(0 or 1): ");
		scanf("%d",&temp->protect);
	}
 
	printf("\n\n\t====input the file length:");        //设置文件长度
	scanf("%d",&temp->length);
	temp->next=NULL;//输入完毕,此文件为最后一个文件,故此next指针为空
	printf("\n\tDo you want to create one more new file?(y / n) ");
	scanf("%s",&s);
	switch(s)
	{            
		case 'y':creatfile(currentuser);break;        //继续创建文件
		case 'n':displayfileoption();break;
		default :displayfileoption();break;
	}
}

void deletefile()      //删除文件
{
	char n[10];
	UFD *p=currentuser->file,*pre=NULL;

⌨️ 快捷键说明

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