📄 文件系统.cpp
字号:
// 文件系统.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 + -