📄 filesystem_s.cpp
字号:
return true;
else{
cout<<"\n你无权对文件 "<<buffer<<" 执行此操作!";
flag=true;return false;}
}
}
}
}
}
//------------------------------------------------------------------------------------------------
bool QueryMod(bool BOOL)//查询权限
{//首先在用户目录下查找,如果找不到用户当前要进行操作的文件名
//则在其它注册用户目录下查找
FILE *fp,*fp1;
bool flag=false;
char user[50];
UFD *ufd = getspace(UFD);
strcpy(user,curuser->username);
strcat(user,".exe");
if((fp=fopen(user,"rb"))==NULL){//打开用户文件信息管理模块
// fclose(fp);
cout<<"\n操作出现错误,对此我们表示歉意!";return false;
}
else{//查找匹配的文件名,用户目录下的文件允许用户进行读写操作
while(1){
fread(ufd,sizeof(UFD),1,fp);
if(feof(fp)){//在当前用户文件管理模块中找不到匹配文件
//则继续在其它用户注册目录下查找
fclose(fp);
fp1=fopen("LOGIN.exe","rb");
elseuser = getspace(MFD);
bool BOOL_1=false;
while(1){
fread(elseuser,sizeof(MFD),1,fp1);//读其它用户信息
if(feof(fp1) && !BOOL_1)//全部用户都查找完
//但仍然没找到匹配的文件
return false;
if(elseuser != curuser){
if((BOOL_1==QueryModElse(BOOL,flag)))//查找
return true;
if(flag)
return false;
}
}
}
if(strcmp(ufd->filename,buffer)==0){//在当前用户注册目录下
//找到该文件,返回真值
fclose(fp);return true;
}
}
}
}
//------------------------------------------------------------------------------------------------
bool WriteRight(int len,bool BOOL)//查看是否已经正确地写入到该文件信息中
//是则返回真值
{
char user[50],outfile[50];
FILE *fp,*fp1;
strcpy(user,elseuser->username);
strcat(user,".exe");
if((fp=fopen(user,"rb"))==NULL){
// fclose(fp);
return false;
}
else{
UFD *ufd = getspace(UFD);
while(1){//在此用户目录下查找匹配文件
fread(ufd,sizeof(UFD),1,fp);
if(feof(fp)){
fclose(fp);return false;
}
if((strcmp(ufd->filename,buffer))==0){//找到要写入新的长度的文件
strcpy(outfile,"outfilelocate.exe");
if((fp1=fopen(outfile,"wb+"))==NULL){
cout<<"\n错误:写入文件长度出错_3。";
// fclose(fp1);
fclose(fp);return false;
}
else{
fclose(fp);
fp=fopen(user,"rb");//文件指针从新指向此用户文件信息管理模块开头
while(1){
fread(ufd,sizeof(UFD),1,fp);
if(feof(fp))
break;
if(strcmp(ufd->filename,buffer)==0){//找到匹配的文件
if(BOOL) ufd->length+=len; //在文件末追加内容的操作
else ufd->length =len; //覆盖原文件内容
}
fwrite(ufd,sizeof(UFD),1,fp1);
}
fclose(fp);fclose(fp1);
remove(user);
rename(outfile,user);
return true;
}
}
}
}
}
//------------------------------------------------------------------------------------------------
void WriteLengthToFile(int Len,bool BOOL)//将文件长度写入文件管理模块中
{//因为当前用户可以对其它用户的文件进行操作(只要权限允许)
//所以应该在整个文件系统目录下查找该文件的位置
FILE *fp;
if((fp=fopen("LOGIN.exe","rb"))==NULL){//不能打开文件
cout<<"\n写入文件长度错误_1!";
// fclose(fp);
return;
}
else{
elseuser = getspace(MFD);
while(1){
fread(elseuser,sizeof(MFD),1,fp);
if(feof(fp))
break;
else{
if(WriteRight(Len,BOOL)){//查看是否已经正确地写入到该文件信息中
fclose(fp);return;
}
}
}
cout<<"\n写入文件长度错误_2!";
fclose(fp);return;
}
}
//------------------------------------------------------------------------------------------------
void WriteFile()//向文件写入信息的操作
{
if(!QueryMod(true))//查询当前用户对该文件是否有写权
return;//对该文件没有写权则返回
char ch;
int i=0;
FILE *fp;
if((fp=fopen(buffer,"r"))==NULL)//查询该文件是否存在
{
cout<<"\n该文件不存在,请创建该文件后再写入。";
// fclose(fp);
return;
}
fclose(fp);
cout<<"\n请选择写入方式:"<<endl;
cout<<" 1、覆盖原文件 2、在原文件末尾写入 3、取消"<<endl;
cin>>ch;
cout<<"开始输入正文:"<<endl;
switch(ch)
{
case '1'://覆盖原文件
if((fp=fopen(buffer,"w"))==NULL)
cout<<"\n文件打开失败。";
else
{
ch=getchar();
while(ch!='#')//将新的文件内容写入到文件的磁盘位置中
{
i++;
fputc(ch,fp);
ch=getchar();
}
}
fclose(fp);
WriteLengthToFile(i,false);//将文件长度写入文件管理模块
break;
case '2':
if((fp=fopen(buffer,"a"))==NULL)
cout<<"\n文件打开失败。";
else
{
ch=getchar();
while(ch!='#')//将新的文件内容写入到文件的磁盘位置中
{
i++;
fputc(ch,fp);
ch=getchar();
}
}
fclose(fp);
WriteLengthToFile(i,true);//将文件长度写入文件管理模块
break;
default:
break;
}
}
//------------------------------------------------------------------------------------------------
void ReadFile()//读文件函数
{
if(!QueryMod(false))//查询当前用户是否有权读该文件
return;//没有读权,则返回
FILE *fp;
if((fp=fopen(buffer,"r"))==NULL)//打开该文件
{
cout<<buffer;
cout<<"\n该文件不存在。";
return;
}
else{
char ch;
ch=fgetc(fp);
while(ch!=EOF)//将该文件信息逐一输出到终端
{
putchar(ch);
ch=fgetc(fp);
}
cout<<endl;
}
fclose(fp);
}
//------------------------------------------------------------------------------------------------
void ChangeMod()//修改某文件的执行权限
{
int mod=40;
FILE *fp,*infile,*outfile;
char in[50],out[50];
UFD *ufd = getspace(UFD);
strcpy(in,curuser->username);
strcat(in,".exe");
strcpy(out,"outfilelocate.exe");
if((fp=fopen(in,"rb"))==NULL){
// fclose(fp);
cout<<"\n操作出现错误,对此我们表示歉意!";return;
}
else{
while(1){//查看该文件是否在当前用户的注册目录下
//任何用户无权修改不是自己目录下的文件的权限值
fread(ufd,sizeof(UFD),1,fp);
if(feof(fp)){//在当前目录下找不到该文件,说明该用户无权修改该文件权限
cout<<"\n你没有权限对文件 "<<buffer<<" 执行该操作!";
fclose(fp);return;
}
if(strcmp(ufd->filename,buffer)==0){//找到该文件,继续操作
fclose(fp);break;
}
}
}
bool flag1=true;
while(flag1)
{
cout<<"\n输入文件 "<<buffer<<" 的新的权限值:";
cin>>mod;//输入权限值
if(mod<30 || mod>33)
{//确保输入的权限值正确
cout<<"\n错误:权限值必须在30~33之间";
continue;
}
else{
char ch;
switch(mod){//告诉用户对该文件权限修改的结果,以便用户确认
case 30:
cout<<"\n当前权限设置:其他用户对"<<buffer<<"既没读权也没写权!";
break;
case 31:
cout<<"\n当前权限设置:其他用户对"<<buffer<<"没读权但有写权!";
break;
case 32:
cout<<"\n当前权限设置:其他用户对"<<buffer<<"有读权但没写权!";
break;
case 33:
cout<<"\n当前权限设置:其他用户对"<<buffer<<"既有读权也有写权!";
break;
default: break;
}
cout<<"\n确认按'Y',取消按'N':";
cin>>ch;
switch(ch){
case 'Y':
case 'y':flag1=false;break;
default: flag1=true;
}
}
}
//更新文件信息管理模块,相关操作类似上面,不在赘述
if((infile=fopen(in,"rb"))==NULL){
cout<<"\n操作出现错误,对此我们表示歉意!";fclose(infile);
return;
}
else{
if((outfile=fopen(out,"wb+"))==NULL){
cout<<"\n操作出现错误,对此我们表示歉意!";
fclose(infile);//fclose(outfile);
return;
}
else{
while(1)
{
fread(ufd,sizeof(UFD),1,infile);
if(feof(infile))
break;
if((strcmp(ufd->filename,buffer))==0)
ufd->safecode=mod;
fwrite(ufd,sizeof(UFD),1,outfile);
}
fclose(infile);fclose(outfile);
remove(in);
rename(out,in);
}
}
}
//------------------------------------------------------------------------------------------------
void Execute(int i,int len,int cmdset)//执行命令函数
{
int j=0;
for(;i<len;i++)
{
if(cmd[i]=='>'||cmd[i]==' '){
// buffer[i] = '\0';
break;
}
/* if(i==len-1)
{
buffer[j]=cmd[i];
buffer[j+1]='\0';
break;
}*/
buffer[j]=cmd[i];j++;
}
buffer[j]='\0';
strcat(buffer,".txt");
switch(cmdset)
{
case 1: //退出
ByeFile(true);
system("cls");
break;
case 2: //改变文件操作权限
if((strcmp(buffer,".txt"))==0){
cout<<"\n输入命令出错!";
return;
}
ChangeMod();
break;
case 3: //删除用户
DeleteUser();
break;
case 4: //创建文件
if((strcmp(buffer,".txt"))==0){
cout<<"\n输入命令出错!";
return;
}
CreatFile();
break;
case 5: //删除文件
if((strcmp(buffer,".txt"))==0){
cout<<"\n输入命令出错!";
return;
}
DeleteFile();
break;
case 6: //列出该用户所有文件清单
ListAllFile();
break;
case 7: //打开文件
if((strcmp(buffer,".txt"))==0){
cout<<"\n输入命令出错!";
return;
}
OpenFile();
break;
case 8: //读文件
if((strcmp(buffer,".txt"))==0){
cout<<"\n输入命令出错!";
return;
}
ReadFile();
break;
case 9: //写文件
if((strcmp(buffer,".txt"))==0){
cout<<"\n输入命令出错!";
return;
}
WriteFile();
break;
default:
break;
}
}
//------------------------------------------------------------------------------------------------
void Command()//读取用户输入的命令,并将其转换成系统能识别的命令
{
int len = 0,i,j;
int cmdset;
while(1)
{
cmdset = 0;
cout<<"\nrun\\";
cin>>cmd;
len = strlen(cmd);
i=0;j=0;
while(cmd[i]=='>'||cmd[i]==' '){i++;}//过滤空格键和'>'
for(;i<len;i++)
{
if(cmd[i]=='>' || cmd[i]==' ' || i==len-1)
{
if(cmd[i]=='>' || cmd[i]==' ')
buffer[j] = '\0';
else
if(i==len-1)
{
buffer[j]=cmd[i];
buffer[j+1]='\0';
}
i++;
j=0;
int low=1,mid,high=keynum-1;
bool BOOL = false;
while(low<=high){//找到该命令关键字的内部识别码
mid=(low+high)/2;
if (strcmp(buffer,KWORD[mid])<=0) high=mid-1;
if (strcmp(buffer,KWORD[mid])>=0) low=mid+1;
if(strcmp(buffer,KWORD[mid])==0){
BOOL = true;
break;
}
}
if(!BOOL)
{
cout<<"\n"<<buffer<<"不是系统定义的命令...";
cmdset = 0; break;
}
else {cmdset = mid;break;}
}
else{
buffer[j] = cmd[i];
j++;
}
}
if(cmdset == 0) continue;
while(cmd[i]=='>'||cmd[i]==' '){i++;}//过滤空格键和'>'
buffer[0]='\0';
Execute(i,len,cmdset); //执行该命令
}
}
//------------------------------------------------------------------------------------------------
void main()
{
while(1){
int SELETE = LoginDisplay();
if(SELETE==0)
exit(0);
bool BOOL = Login(SELETE);//用户登陆,或者注册函数
if(BOOL)
{
KeyWord(); //初始化命令关键字
DisplayUFD();//打印用户目录下的文件
Command(); //命令行操作
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -