cout<<\创建文件失败!\ //显示 // fclose(fp); return; } fclose(fp); //关闭文件 } else { //用户要创建的文件已经存在 cout<<\该文件已经存在,创建另一个文件?Y/N\ char ch; cin>>ch; //输入选择 switch(ch) { case 'Y': case 'y': cout<<\输入新文件名:\ cin>>buffer; //输入新文件名 strcat(buffer,\ //扩展名.txt fclose(fp); //关闭文件 if((fp=fopen(buffer,\ //判断文件是否为空 { cout<<\创建文件失败!\ //显示 创建文件失败 // fclose(fp); return; } fclose(fp); //关闭文件 break; default: fclose(fp); //关闭文件 return; } } strcpy(user,curuser->username); //复制用户名到字符串user(用户) strcat(user,\ //扩展名.exe curfile = getspace(UFD); //申请空间 strcpy(curfile->filename,buffer); //文件名 curfile->length=0; //该文件长度为零 curfile->safecode=30; //设置该文件的默认权限 //11 00,文件主有读和写权,其他用户没有读写权 if((fp=fopen(user,\ //判断是否为合法用户 { cout<<\错误:你可能不是合法用户。\ getch(); //读取结束符 }
else { fwrite(curfile,sizeof(UFD),1,fp); //将该文件信息写入用户文件信息管理模块中 cout<<\文件 \创建成功!\ } fclose(fp); //关闭文件 }
//------------------------------------------------------------------------------------------------ void DeleteFile() //删除当前目录下一个文件的操作 { char ch; //定义字符型变量ch FILE *infile,*outfile; //定义文件 cout<<\确定要删除文件:\ cin>>ch; //提示用户确认删除 switch(ch) { case 'Y': case 'y': //更新用户文件信息管理模块,这里同样使用缓冲区模块来更新 //方法与上面将到的类似 char out[50],in[50]; //定义数组
strcpy(out,\ //拷贝文件到数组 strcpy(in,curuser->username); //拷贝用户名到数组 strcat(in,\ //扩展名.exe if((infile=fopen(in,\//打开该用户的文件信息管理模块 { cout<<\保存错误。\ //fclose(infile); return; } else { if((outfile=fopen(out,\ //打开读写文件,判断是否为空 { cout<<\保存错误。\ // fclose(outfile); fclose(infile); //关闭文件 return; } else { UFD *ufd = getspace(UFD); //申请空间 while(1) { fread(ufd,sizeof(UFD),1,infile); //从旧模块读出信息 if(feof(infile))
break; if((strcmp(ufd->filename,buffer))==0) //要进行更新的信息 continue; else fwrite(ufd,sizeof(UFD),1,outfile); //写入新模块 } fclose(infile); fclose(outfile); //关闭文件 remove(in); //在磁盘移除就模块 rename(out,in); //新模块命名为当前用户文件信息管理模块 } } remove(buffer); //从磁盘中删除该文件 break; default: break; } }
//------------------------------------------------------------------------------------------------ void ListAllFile()//显示当前用户目录下的文件信息 { DisplayUFD(); //调用打印函数 }
void WriteLengthToFile(int Len,bool BOOL); //函数申明
//------------------------------------------------------------------------------------------------ void OpenFile()//在window模式下打开该文件 { FILE *fp; //定义文件 char ch; int i=0; system(buffer); //buffer为文件名,如:file1.txt fp=fopen(buffer,\ //打开文件进行读操作 while(1){ //获取新文件的长度 if(feof(fp)) //判断是否最后一个 break; ch=fgetc(fp); //按字符读取 i++; //每读取一次,长度+1 } WriteLengthToFile(i,false);//将修改后的文件长度写入管理表 }
//------------------------------------------------------------------------------------------------ bool QueryModElse(bool BOOL,bool &flag)//查询其它用户目录下文件的文件 //当该文件的权限允许当前用户对其执行有关操作时,返回ture {
FILE *fp; //定义文件 char user[50]; UFD *ufd = getspace(UFD);//elseuser表示除当前用户外的所有用户注册目录 strcpy(user,elseuser->username); //拷贝用户名到数组 strcat(user,\ //扩展名.exe if((fp=fopen(user,\打开一个其它的用户文件信息管理模块 // fclose(fp); cout<<\操作出现错误,对此我们表示歉意!\ //显示 return false; } else{ while(1){ fread(ufd,sizeof(UFD),1,fp); //读文件 if(feof(fp)) //判断是否可读权限 { fclose(fp); return false; } if(strcmp(ufd->filename,buffer)==0)//判断是否可以进去其他用户文件管理模块 { if(BOOL)//该用户请求写该文件 { if(ufd->safecode== 31 || ufd->safecode== 33)//1101、1111最后一位为1,有写权 return true; else { cout<<\你无权对文件 \执行此操作!\ flag=true;return false; } //flag设置为true,告诉上一层,无须再查找 //该文件已经找到,但用户无权执行相关操作 } else //该用户请求读权 { if(ufd->safecode == 32 || ufd->safecode == 33)//1110、1111倒数第二位为1,有读权 return true; else { cout<<\你无权对文件 \执行此操作!\ flag=true; return false;
} } } } } }
//------------------------------------------------------------------------------------------------ bool QueryMod(bool BOOL)//查询权限
{//首先在用户目录下查找,如果找不到用户当前要进行操作的文件名 //则在其它注册用户目录下查找 FILE *fp,*fp1; //定义文件 bool flag=false; //置旗为false char user[50]; UFD *ufd = getspace(UFD); //申请空间 strcpy(user,curuser->username); //拷贝用户名到数组 strcat(user,\ //扩展名.exe if((fp=fopen(user,\打开用户文件信息管理模块 // fclose(fp); cout<<\操作出现错误,对此我们表示歉意!\ } else{//查找匹配的文件名,用户目录下的文件允许用户进行读写操作 while(1){ fread(ufd,sizeof(UFD),1,fp); //读文件 if(feof(fp)){ //在当前用户文件管理模块中找不到匹配文件 //则继续 在其它用户注册目录下查找 fclose(fp); //关闭文件 fp1=fopen(\ //打开文件,只允许读数据 elseuser = getspace(MFD); //申请空间 bool BOOL_1=false; //置旗为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; } } }