C语言文件系统模拟实现 - 用户管理、文件操作、权限控制
#include
tmp[3]='\0'; printf("%20s",tmp); if (UFD[User][i].status) { printf("%20s\n","已打开"); } else { printf("%20s\n","就绪"); } }
printf("共 %ld 个文件\n",num[User]); } long login()//切换用户 { long i; char NameInput[SizeOfUserName]; do { printf("请输入您的用户ID:"); scanf("%s",NameInput); i=0; while (i<SizeOfUser && strcmp(NameInput,UserName[i])!=0) { i++; } if (strcmp(NameInput,UserName[i])!=0) { printf("无效的用户ID。\n"); } }while (strcmp(NameInput,UserName[i])!=0);
return i; } void init()//初始化 { long i,j,k; char tmp[4]; memset(num_open,0,sizeof(num_open)); //读入用户名列表 freopen("record.txt","r",stdin); for (i=0;i<SizeOfUser;i++) { scanf("%s",UserName[i]); } //读入文件列表 for (i=0;i<SizeOfUser;i++) { scanf("%ld","&num[i]); for (j=0;j<num[i];j++) { scanf("%s%s",UFD[i][j].Name,tmp); for (k=0;k<3;k++) { if (tmp[k]=='-') { UFD[i][j].safe[k]=0; } else { UFD[i][j].safe[k]=1; } } UFD[i][j].status=0; } } freopen("con","r",stdin); User=login(); ls(); } void create()//创建文件 { long i; char filename[SizeOfFileName]; char prop[128];
if (num[User]==SizeOfFile)//保存已满 { printf("创建失败... 您只能保存 %ld 个文件\n",SizeOfFile); return; }
printf("请输入文件名和属性:"); scanf("%s%s",filename,prop); for (i=0;i<num[User];i++) { if (strcmp(filename,UFD[User][i].Name)==0)//重名 { printf("创建失败... 文件 %s 已存在\n",filename); return; } }
strcpy(UFD[User][num[User]].Name,filename); for (i=0;i<3;i++)//设置属性 { if (prop[i]=='-') { UFD[User][num[User]].safe[i]=0; } else { UFD[User][num[User]].safe[i]=1; } } UFD[User][num[User]].status=0; ++num[User]; printf("创建成功!\n"); } void open()//打开文件 { long i; char filename[SizeOfFileName];
if (num_open[User]==5) { printf("打开失败... 您已经打开了5个文件\n"); //打开文件数已到上限 return ; } printf("请输入文件名:"); scanf("%s",filename); for (i=0;i<num[User];i++) { if (strcmp(filename,UFD[User][i].Name)==0) { if (UFD[User][i].status==0)//文件未占用 { UFD[User][i].status=1; num_open[User]++; printf("打开成功!\n"); } else//已被打开 { printf("打开失败... 文件 %s 已经打开\n",filename); } return; } } printf("打开失败... 没有找到文件\n"); //找不到文件 } void close()//关闭文件 { long i; char filename[SizeOfFileName];
printf("请输入文件名:"); scanf("%s",filename); for (i=0;i<num[User];i++) { if (strcmp(filename,UFD[User][i].Name)==0) { if (UFD[User][i].status==1)//成功 { UFD[User][i].status=0; num_open[User]--; printf("关闭成功!\n"); } else//文件并未打开 { printf("关闭失败... 文件 %s 没有打开\n",filename); } return; } } printf("关闭失败... 没有找到文件\n"); //找不到文件 } void read()//读文件 { long i; char filename[SizeOfFileName];
printf("请输入文件名:"); scanf("%s",filename); for (i=0;i<num[User];i++) { if (strcmp(filename,UFD[User][i].Name)==0) { if (UFD[User][i].safe[0]==0)//属性设置为不可读 { printf("读取失败... 文件 %s 不可读\n",filename); return; } if (UFD[User][i].status==1)//文件已打开 { printf("读取失败... 文件 %s 已经打开\n",filename); return; } printf("读取成功!\n");//成功 return; } } printf("读取失败... 没有找到文件\n");//找不到文件 } void write()//写文件 { long i; char filename[SizeOfFileName];
printf("请输入文件名:"); scanf("%s",filename); for (i=0;i<num[User];i++) { if (strcmp(filename,UFD[User][i].Name)==0) { if (UFD[User][i].safe[1]==0)//属性设置为不可写 { printf("写入失败... 文件 %s 不可写\n",filename); return; } if (UFD[User][i].status==1)//已打开 { printf("写入失败... 文件 %s 已经打开\n",filename); return; } printf("写入成功!\n");//成功 return; } } printf("写入失败... 没有找到文件\n");//找不到文件 } void mydelete()//删除文件 { long i,j; char filename[SizeOfFileName];
printf("请输入文件名:"); scanf("%s",filename); for (i=0;i<num[User];i++) { if (strcmp(filename,UFD[User][i].Name)==0) { if (UFD[User][i].status==1)//文件正被打开 { printf("删除失败... 文件 %s 已经打开\n",filename); return; } num[User]--; for (j=i;j<num[User];j++) { UFD[User][j]=UFD[User][j+1]; } printf("删除成功!\n");//成功 return; } } printf("删除失败... 没有找到文件\n");//找不到文件 } void save()//保存本次信息 { FILE *fp=fopen("record.txt","w"); long i,j,k; char tt[4]="rwe"; char tmp[4];
//保存用户列表 for (i=0;i<SizeOfUser;i++) { fprintf(fp,"%s\n",UserName[i]); } //保存文件列表 for (i=0;i<SizeOfUser;i++) { fprintf(fp,"%ld\n",num[i]); for (j=0;j<num[i];j++) {
for (k=0;k<3;k++) { if (UFD[i][j].safe[k]) { tmp[k]=tt[k]; } else { tmp[k]='-'; } } tmp[3]=0; fprintf(fp,"%s %s\n",UFD[i][j].Name,tmp); } } printf("保存成功!\n");//成功 fclose(fp); } void work()//交互主函数 { bool over=0; char command[SizeOfCommand]; while (!over) { printf("%s>",UserName[User]); scanf("%s",command); if (strcmp(command,"login")==0) { User=login(); ls(); continue; } if (strcmp(command,"bye")==0) { printf("再见。\n"); over=1; continue; } if (strcmp(command,"ls")==0 || strcmp(command,"dir")==0) { ls(); continue; } if (strcmp(command,"create")==0) { create(); continue; } if (strcmp(command,"delete")==0) { mydelete(); continue; } if (strcmp(command,"open")==0) { open(); continue; } if (strcmp(command,"close")==0) { close(); continue; } if (strcmp(command,"read")==0) { read(); continue; } if (strcmp(command,"write")==0) { write(); continue; } if (strcmp(command,"save")==0) { save(); continue; } printf("无效的命令。\n"); } } int main() { init(); work(); return 0; }
原文地址: https://www.cveoy.top/t/topic/f1wQ 著作权归作者所有。请勿转载和采集!