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

📄 文件系统.cpp

📁 操作系统的文件系统程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 文件系统.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "string.h"
#include "conio.h"	
#include "stdlib.h"
#include "iostream.h"


#define MAXNAME 25  //文件名称的最大长度
#define MAXFILE 50 //子文件的最大个数
#define MAX (MAXFILE*MAXFILE) //最大的文件总数

typedef struct  //定义文件的类型
  {int  fileAddress;         //文件地址
   int  fileLength;        //文件长度
   //文件类型:
   //0-只读;1-只写;2-可读写(默认)
   int  fmode;          
   char fname[MAXNAME];   //文件名称
  } file;

typedef struct     //用户的文件结构
  {char userName[MAXNAME];   //用户名
   file userAllFile[MAXFILE]; //用户的所有文件
  }userFile;

typedef struct  //用户登陆信息
  {char userName[MAXNAME];       //用户名
   char userfilepword[8];            //用户密码
  } userLogin;

typedef struct     //文件的打开方式
  {int openflag;     //文件打开的标志,0-关,1-开
   //文件的读写类型
   //0-只读;1-只写;2-读写;3-初始
   int openmode;
  }userFile_OPENMODE;

userFile *userfile[MAXFILE];   //定义文件
userLogin userfile_lp;    //定义用户

int userCount=0;                      //当前用户个数
int fileCount[MAXFILE];               //所有用户对应的文件个数
int loginSucceed=0;               //是否登陆成功的标记
char username[MAXNAME];            //登陆用户名
char dirname[MAXNAME];             //姓名地址录
int fileAddressno[MAX];            //文件的物理地址号
userFile_OPENMODE openflag[MAXFILE][MAXFILE];//文件是否打开的标志

FILE *fp_mfd,*fp_ufd,*fp_file_p,*fp_file;

void inputPassword(char *p)
{
	for(int i=0;i<MAXNAME;i++)		//遍历输入的字符串
	{
		p[i]=getch();		    	//读入一个字符
		if((int)(p[i])!=13)		    //若不是返回
		{
			if((int)(p[i])!=8)  	//若不是换行
				putchar('*');   	//输出一个‘*’
			else if(i>0)	    	//如果是换行并且有输入
			{
				i-=2;		    	//j退去返回换行的两个字符
				putchar('\b');		//将前一个输出改为空格
				putchar(' ');
				putchar('\b');		//退回一格
			}
			else	i--;			//其他情况则退去返回的字符
		}
		else						//若读入是返回
		{
			p[i]='\0';				//则给字符串添加结束标记
			break;					//中止
		}
	}
	p[i]='\0';						//给字符串添加结束标记
	cout<<endl;
}

void setPathNumber(int i)
{
	int m,n;
	if(i==0)
	{
		if((fp_file_p=fopen("ownfile\\myfile\\file_p","rb"))==NULL)	//若以只读方式不能打开文件
		{
			fp_file_p=fopen("ownfile\\myfile\\file_p","wb");		//则以只写方式打开
			fclose(fp_file_p);									//关闭文件
		}
		fp_file_p=fopen("ownfile\\myfile\\file_p","rb");			//以只读方式打开文件
		while(fread(&n,sizeof(int),1,fp_file_p)!=0)		//将当前文件的物理地址数置1
			fileAddressno[n]=1;
	}
	else												//如果为写状态
	{
		fp_file_p=fopen("ownfile\\myfile\\file_p","wb");	//以只写方式打开文件
		for(m=0;m<MAX;m++)								//循环所有的用户文件
			if(fileAddressno[m]==1)							//若文件存在
				fwrite(&m,sizeof(int),1,fp_file_p);		//将其编号写进去
	}
	fclose(fp_file_p);					//关闭文件
}

void createNewUser()					//新建用户函数
{
	cout<<"Create new user"<<endl;
	fp_mfd=fopen("ownfile\\mfd","ab");	//以追加方式打开mfd文件
	cout<<"User name: ";			//提示输入用户名
	cin>>userfile_lp.userName;			//输入用户名
	cout<<"Password: "<<endl;				//提示输入密码
	inputPassword(userfile_lp.userfilepword);		//输入用户密码
	cout<<"Create new user succeed!"<<endl;
	fwrite(&userfile_lp,sizeof(userLogin),1,fp_mfd);	//写入mfd文件
	fclose(fp_mfd);					//关闭mfd文件
	
	char str[MAXNAME];
	strcpy(str,"ownfile\\");			//将文件路径复制到字符串
	strcat(str,userfile_lp.userName);	//将新用户名追加到路径后
	fp_mfd=fopen(str,"wb");			//新建用户文件
	fclose(fp_mfd);
}

void loginFile()
{	
	char login_name[MAXNAME];                                 //用户登录名
	char login_password[9];                                   //用户登录时输入的密码
	char login_correct_password[9];                           //用户正确的密码
	char str[50];                                             //记录文件系统的路径
	int i,j;                                                  //函数临时变量
	int name_found;                                           //标记登录用户名是否被找到,0-未找到,1-找到
	loginSucceed=0;
	while(loginSucceed!=1)
	{
		name_found=0;                                          //初始化用户名存在变量为找到
		loginSucceed=0;
		cout<<"login"<<endl;
		cout<<"please input your name:";
		cin>>login_name;

		fp_mfd = fopen("ownfile\\mfd","rb");
		for(i=0;fread(&userfile_lp,sizeof(userLogin),1,fp_mfd)!=0;i++)	//查找整个文件
		if(strcmp(strupr(userfile_lp.userName),strupr(login_name))==0)	//若输入用户名与文件中有匹配的
		{
			name_found=1;								//置标记为找到用户
			strcpy(login_correct_password,userfile_lp.userfilepword);		//将正确密码拷出
		} 
		if(name_found==1)
		{
			cout<<"Password: "<<endl;		//打印输入密码提示
			inputPassword(login_password);	//以*方式显示用户输入的密码
			if(strcmp(login_correct_password,login_password)==0)		//如果输入的密码与文件中密码相匹配
			{
				loginSucceed=1;
				strcpy(username,login_name);
				cout<<"login succeed"<<endl;
				strcpy(username,strupr(username));		//将登陆的用户名复制到系统已登陆用户变量
				strcpy(dirname,username);		    	//将用户名复制到用户路径变量
				fp_mfd=fopen("ownfile\\mfd","rb");		//以只读方式打开file文件夹
				for(i=0;fread(&userfile_lp,sizeof(userLogin),1,fp_mfd)!=0;i++)
				{
					strcpy(str,"ownfile\\");			//将基目录复制到文件路径
					strcat(str,userfile_lp.userName);	//将现有文件指针的用户名追加到文件路径后
					userfile[i]=(userFile*)malloc(sizeof(userFile));
					strcpy(userfile[i]->userName,strupr(userfile_lp.userName));	//将用户名复制到文件指针中的用户名
					fp_ufd=fopen(str,"rb");			//以只读方式打开用户对应的文件夹
					fileCount[i]=0;					//文件个数起始为0
					for(j=0;fread(&userfile[i]->userAllFile[j],sizeof(file),1,fp_ufd)!=0;j++,fileCount[i]++)	//读文件,将个数自加
					{
						openflag[i][j].openflag=0;		//文件设为关闭
						openflag[i][j].openmode=4;		//文件模式为缺省
					}
					fclose(fp_ufd);					//关闭文件
				}
				fclose(fp_mfd);			    	//关闭文件
				userCount=i;					//记录所有用户数
				setPathNumber(0);				    //设置物理地址
			}
			else cout<<"Login  failed.\nPassword error."<<endl;
		}
		else
			cout<<"Login  failed.\nUsername error."<<endl;
		cout<<endl;
	}
}

int existDirname(char *dname)                  //查找当前的路径是否存在
{
	int flag = -1;                             //查找结果初始化路径都不存在
	for(int i=0;i<userCount;i++)               //循环查抄所有用户
		if(strcmp(strupr(userfile[i]->userName),strupr(dname))==0)	//若找到匹配的
		{
			flag = i;                          //查找结果记录用户的位置号
			break;                             //跳出循环
		}
	return flag;                               //返回查找结果
}

void dirFile()
{
	char str[MAXNAME];
	char address[MAXNAME];
	cout<<"name\taddress\t\tlength\tmode"<<endl;
	int i = existDirname(dirname);
	for(int j=0;j<fileCount[i];j++)
	{
		itoa(userfile[i]->userAllFile[j].fileAddress,str,10);		//取物理地址
		strcpy(address,"ownfile");						//将其物理地址存入变量中
		strcat(address,str);
		cout<<userfile[i]->userAllFile[j].fname<<"\t"<<address;	//输出文件名与物理地址
		cout<<"\t"<<userfile[i]->userAllFile[j].fileLength<<"\t";
		if(userfile[i]->userAllFile[j].fmode==0)						//按照的文件
			cout<<"read only"<<endl;						//保护模式
		else if(userfile[i]->userAllFile[j].fmode==1)					//输出对应的
			cout<<"Write only"<<endl;						//字符串表达
		else if(userfile[i]->userAllFile[j].fmode==2)
			cout<<"Read and Write"<<endl;
		else 
			cout<<"Protect"<<endl;
	}
	cout<<fileCount[i]<<" file(s)"<<endl<<endl;		//输出文件总共个数
}

int existFile(char *fname)                     //查找当前的文件是否存在
{
	int flag = -1;                             //查找结果初始化都为不存在
	int j = existDirname(dirname);             //查找但前路径是否存在,并记录路径返回值
	for(int i=0;i<fileCount[j];i++)            //循环查抄所有的文件
		if(strcmp(strupr(userfile[j]->userAllFile[i].fname),strupr(fname))==0)	//若找到匹配的
		{
			flag=i;                            //查找结果记录文件的位置号
			break;                             //跳出循环
		}
	return flag;                               //返回查找结果
}

int findPath()
{
	for(int i=0;i<MAX;i++)
		if (fileAddressno[i]==0)
		{
			fileAddressno[i]=1;
			break;
		}
	if(i<MAX) return i;
	else return -1;
}

int write()
{
	int length=0;		//文件长度变量
	char c;				//临时读入变量
	cout<<"(End with '#')"<<endl;		//提示:输入以井号结束
	while((c=getchar())!='#')			//当输入的不是井号
	{
		fprintf(fp_file,"%c",c);		//写入文件
		if(c!='\n')						//若输入的不是回车
			length++;					//文件长度加1
	}
	fprintf(fp_file,"\n");				//在文件末打印回车
	return length;						//返回文件长度
}

void createFile()
{
	int i;
	int file_mode,file_add_num;
	char file_name[MAXNAME];                        //用于保存文件名
	char str[MAXNAME],str1[MAXNAME];
	cout<<"input file name:";
	cin>>file_name;                                 //读入文件名
	i = existFile(file_name);

	while(i!=-1)
	{
		cout<<"The file has existed."<<endl<<endl;
		cout<<"Input file name:";
		cin>>file_name;                                 //读入文件名
		i = existFile(file_name);
	}

	cout<<"0-read only,1-write only,2-read and write,3-proctect"<<endl;
	cout<<"input the file mode:";
	cin>>file_mode;
	while(file_mode<0 || file_mode>3)
	{
		cout<<"The file mode is not exist."<<endl<<endl;
		cout<<"0-read only,1-write only,2-read and write,3-proctect"<<endl;
		cout<<"input the file mode:";
		cin>>file_mode;
	}
	file_add_num=findPath();
	if(file_add_num!=-1)
	{
		i = existDirname(username);
		strcpy(userfile[i]->userAllFile[fileCount[i]].fname,file_name);	//将文件名复制到此用户文件中
		userfile[i]->userAllFile[fileCount[i]].fileAddress=file_add_num;		//文件的物理地址为被分配的地址
		userfile[i]->userAllFile[fileCount[i]].fmode=file_mode;			//文件模式为输入的模式
		openflag[i][fileCount[i]].openflag=0;					//文件状态为打开
		openflag[i][fileCount[i]].openmode=4;					//模式状态为初始化
		strcpy(str,"ownfile\\myfile\\file");				//将文件路径复制到字符串
		itoa(file_add_num,str1,10);						//给文件编号
		strcat(str,str1);					//将号码附加在文件名后
		fileCount[i]++;						//此成员文件数加1

		cout<<"Input the text: ";			//提示输入正文
		fp_file=fopen(str,"wb+");			//将文件以只写方式打开
		userfile[i]->userAllFile[fileCount[i]-1].fileLength=write();	//记录写入的文件长度
		fclose(fp_file);					//关闭文件
		cout<<file_name<<" has been created."<<endl;		//提示创建文件成功
	}
	else cout<<"Create file failed.\nDisk is full."<<endl;
	cout<<endl;
}

void deleteFile()
{
	char file_name[MAXNAME];                        //用于保存文件名
	char str[MAXNAME],str1[MAXNAME];
	int i,j,m;
	cout<<"input file name:";
	cin>>file_name;                                 //读入文件名
	i = existFile(file_name);
	while(i==-1)
	{
		cout<<"The file has not existed."<<endl<<endl;
		cout<<"input file name:";
		cin>>file_name;                                 //读入文件名
		i = existFile(file_name);
	}

	j = existDirname(dirname);
	if(openflag[j][i].openflag == 1)
		cout<<"Delete failed.\nThe file has been opened.Please close it."<<endl<<endl;
	else 
	{
		fileAddressno[userfile[j]->userAllFile[i].fileAddress] = 0;
		itoa(userfile[j]->userAllFile[i].fileAddress,str,10);
		for(m=i;m<fileCount[j]-1;m++)
		{
			strcpy(userfile[j]->userAllFile[m].fname,userfile[j]->userAllFile[m+1].fname);
			userfile[j]->userAllFile[m].fileAddress=userfile[j]->userAllFile[m+1].fileAddress;
			userfile[j]->userAllFile[m].fileLength=userfile[j]->userAllFile[m+1].fileLength;
			userfile[j]->userAllFile[m].fmode=userfile[j]->userAllFile[m+1].fmode;
			openflag[j][m]=openflag[j][m+1];
		}
		fileCount[j]--;
		strcpy(str1,"ownfile\\myfile\\file");		//取要删除的文件路径
		strcat(str1,str);						//取此文件的ID
		remove(str1);							//将其从系统中删除
		cout<<file_name<<" has been deleted."<<endl<<endl;		//提示文件已被删除
	}
}

void openFile()

⌨️ 快捷键说明

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