1、模拟一个简单二级文件管理系统方案模拟一个简单二级文件管理系统设计目的:通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统部功能和实现过程的理解。设计容:模拟一个简单二级文件管理系统一、实验容描述1 实验目标本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的部功能及部实现.2 实验要求为DOS系统设计一个简单的二级文件系统.要求做到以下几点:可以实现下列命令:login 用户登录dir 列文件目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件列目录时要列出文件名、物理地址、保
2、护码和文件长度.源文件可以进行读写保护.二、程序主要容1设计思路程序中要求每个用户在登陆后才可对其拥有的文件进行操作,用户对于其他用户的文件无操作权.文件操作包括浏览、创建、删除、打开、关闭、阅读、写入、修改模式.其他操作包括新建用户、帮助、用户登入、用户登出、退出系统.在程序文件夹下有个名为“file”的系统根目录,此目录下包括:一个名为“mfd”的文件,记录所有注册过的及密码;用户文件,以用户名作为文件名,容为其拥有的文件名及属性;一个名为“keiji”的文件夹.“keiji”文件夹中包括:“file.p”指针文件,记录所有已用的物理地址;一些以物理地址为名的文件,容为文件容.2 数据结构
3、file结构体系统文件数据结构:fpaddrint,文件的物理地址、flengthint,文件长度、fmodeint,文件模式 0.只读;1.可写;2.可读写;3.保护、 fnamechar,文件名;filemode结构体文件状态数据结构:isopenint,文件当前状态,0.关闭;1.打开、modeint,文件模式 0.只读;1.可写;2.可读写;3.初始化;user结构体用户信息数据结构:unamechar,用户名、upasswordchar,用户密码;userfile结构体用户文件数据结构:unamechar,用户名、ufilefile,用户拥有的文件数组.cpp view plainc
4、opyprint?1.#include 2.#include 3.#include 4.#include 5.#include 6.#define MaxUser 100 /定义最大MDF主目录文件 7.#define MaxDisk 512*1024 /模拟最大磁盘空间 8.#define commandAmount 12 /对文件操作的指令数 9./存储空间管理有关结构体和变量 10.char diskMaxDisk; /模拟512K的磁盘存储空间 11.typedef struct distTable /磁盘块结构体 12. 13.int maxlength; 14.int start;
5、 15.int useFlag; 16.distTable *next; 17.diskNode; 18.diskNode *diskHead; 19.struct fileTable /文件块结构体 20. 21.char fileName10; 22.int strat; /文件在磁盘存储空间的起始地址 23.int length; /文件容长度 24.int maxlength; /文件的最大长度 25.char fileKind3; /文件的属性读写方式 26.struct tm *timeinfo; 27.bool openFlag; /判断是否有进程打开了该文件 28./fileT
6、able *next; 29.; 30.31./两级目录结构体 32.typedef struct user_file_directory /用户文件目录文件UFD 33. 34./char fileName10; 35.fileTable *file; 36.user_file_directory *next; 37.UFD; 38./UFD *headFile; 39.typedef struct master_file_directory /主文件目录MFD 40. 41.char userName10; 42.char password10; 43.UFD *user; 44.MFD;
7、 45.MFD userTableMaxUser; 46.int used=0; /定义MFD目录中用已有的用户数 47.48./文件管理 49.void fileCreate(char fileName,int length,char fileKind); /创建文件 50.void fileWrite(char fileName); /写文件 51.void fileCat(char fileName); /读文件 52.void fileRen(char fileName,char rename); /重命名文件 53.void fileFine(char fileName); /查询文
8、件 54.void fileDir(char UserName); /显示某一用户的所有文件 55.void fileClose(char fileName); /关闭已打开的文件 56.void fileDel(char fileName); /删除文件 57.void chmod(char fileName,char kind); /修改文件的读写方式 58.int requestDist(int &startPostion,int maxLength); /磁盘分配查询 59.void initDisk(); /初始化磁盘 60.void freeDisk(int startPostio
9、n); /磁盘空间释放 61.void diskShow(); /显示磁盘使用情况 62.63./用户管理 64.void userCreate(); 65.int login(); 66.int userID=-1; /用户登录的ID号,值为-1时表示没有用户登录 67.68.int main() 69. 70.char ordercommandAmount10; 71.strcpy(order0,create); 72.strcpy(order1,rm); 73.strcpy(order2,cat); 74.strcpy(order3,write); 75.strcpy(order4,fi
10、ne); 76.strcpy(order5,chmod); 77.strcpy(order6,ren); 78.strcpy(order7,dir); 79.strcpy(order8,close); 80.strcpy(order9,return); 81.strcpy(order10,exit); 82.strcpy(order11,df); 83.char command50,command_str110,command_str210,command_str35,command_str43; 84.int i,k,j; 85.int length; 86.initDisk(); /初始化
11、磁盘 87.for(i=0;inext=NULL; 91. 92.while(1) 93. 94.printf(*/n); 95.printf( 1、Creat user/n); 96.printf( 2、login/n); 97.printf(*/n); 98.printf(Please chooce the function key:); 99.int choice; 100.scanf(%d,&choice); 101.if(choice=1) userCreate(); 102.else if(choice=2) userID=login(); 103.else printf(您的输入
12、有误,请重新选择/n); 104.while(userID!=-1) 105. 106.fflush(stdin); 107.printf(/n); 108.printf( create-创建 格式:create a1 1000 rw,将创建名为a1,长度为1000字节可读可写的文件/n); 109.printf( rm-删除 格式:rm a1,将删除名为a1的文件/n); 110.printf( cat-查看文件容 格式:cat a1,显示a1的容/n); 111.printf( write-写入 格式:write a1/n); 112.printf( fine-查询 格式:fine a1
13、,将显示文件 a1的属性/n); 113.printf( chmod-修改 格式:chmod a1 r,将文件a1的权限改为只读方式/n); 114.printf( ren-重命名 格式:ren a1 b1 ,将a1改名为b1/n); 115.printf( dir-显示文件 格式:dir aaa,将显示aaa用户的所有文件/n); 116.printf( df-显示磁盘空间使用情况 格式:df/n); 117.printf( close-关闭文件 格式:close a1,将关闭文件a1/n); 118.printf( return-退出用户,返回登录界面/n); 119.printf( ex
14、it-退出程序/n); 120.printf(/n); 121.printf(please imput your command:); 122.gets(command); 123.int select; 124.for(i=0;commandi!= &commandi!=/0;i+) /command_str1字符串存储命令的操作类型 mand_str1i=commandi; 126.k=i; mand_str1k=/0; 128.for(i=0;i=0;i-) /把字符串转换为十进制 154. 155.length+=(command_str3i-48)*j; 156.j*=10; 157
15、. 158.for(i=k+1,k=0;commandi!= &commandi!=/0;i+,k+) mand_str4k=commandi; mand_str4k=/0; 161.fileCreate(command_str2,length,command_str4);break; 162.case 1:fileDel(command_str2);break; 163.case 2:fileCat(command_str2);break; 164.case 3: 165.fileWrite(command_str2);break; 166.case 4:fileFine(command_s
16、tr2);break; 167.case 5:for(i=k+1,k=0;commandi!= &commandi!=/0;i+,k+) mand_str3k=commandi; mand_str3k=/0; 170.chmod(command_str2,command_str3);break; 171.case 6:for(i=k+1,k=0;commandi!=/0;i+,k+) mand_str3k=commandi; mand_str3k=/0; 174.fileRen(command_str2,command_str3);break; 175.case 7:fileDir(comma
17、nd_str2);break; 176.case 8:fileClose(command_str2);break; 177.case 9:UFD *p; 178.for(p=userTableuserID.user-next;p!=NULL;p=p-next) /退出用户之前关闭所有打的文件 179.if(p-file-openFlag) 180.p-file-openFlag=false; 181.system(cls); 182.userID=-1;break; 183.case 10:exit(0);break; 184.case 11:diskShow();break; 185. 18
18、6. 187. 188.return 0; 189. 190.191.void userCreate() 192. 193.char c; 194.char userName10; 195.int i; 196.if(usedMaxUser) 197. 198.printf(请输入用户名:); 199.for(i=0;c=getch();i+) 200. 201.if(c=13) break; 202.else 203.userNamei=c; 204.printf(%c,c); 205. 206.userNamei=/0; 207.for(i=0;iused;i+) 208. 209.if(
19、!strcmp(userTablei.userName,userName) 210. 211.printf(/n); 212.printf(该用户名已存在,创建用户失败/n); 213.system(pause); 214.return; 215. 216. 217.strcpy(userTableused.userName,userName); 218.printf(/n); 219.printf(请输入密码:); 220.for(i=0;c=getch();i+) 221. 222.if(c=13) break; 223.else 224.userTableused.passwordi=c
20、; 225.printf(*); 226. 227.userTableuserID.passwordi=/0; 228.printf(/n); 229.printf(创建用户成功/n); 230.used+; 231.system(pause); 232. 233.else 234. 235.printf(创建用户失败,用户已达到上限/n); 236.system(pause); 237. 238.fflush(stdin); 239. 240.241.int login() 242. 243.char name10,psw10; 244.char c; 245.int i,times; 24
21、6.printf(请输入用户名:); 247.for(i=0;c=getch();i+) 248. 249.if(c=13) break; 250.else 251.namei=c; 252.printf(%c,c); 253. 254.namei=/0; 255.for(i=0;iused;i+) 256. 257.if(!strcmp(userTablei.userName,name) 258.break; 259. 260.if(i=used) 261. 262.printf(/n您输入的用户名不存在/n); 263.system(pause); 264.return -1; 265.
22、266.for(times=0;times3;times+) 267. 268.memset(psw,/0,sizeof(psw); 269.printf(/n请输入密码:); 270.for(i=0;c=getch();i+) 271. 272.if(c=13) break; 273.else 274.pswi=c; 275.printf(*); 276. 277.printf(/n); 278.for(i=0;imaxlength=MaxDisk; 302.diskHead-useFlag=0; 303.diskHead-start=0; 304.diskHead-next=NULL; 3
23、05. 306.int requestDist(int &startPostion,int maxLength) 307. 308.int flag=0; /标记是否分配成功 309.diskNode *p,*q,*temp; 310.p=diskHead; 311.while(p) 312. 313.if(p-useFlag=0&p-maxlengthmaxLength) 314. 315.startPostion=p-start; 316.q=(diskNode *)malloc(sizeof(diskNode); 317.q-start=p-start; 318.q-maxlength=
24、maxLength; 319.q-useFlag=1; 320.q-next=NULL; 321.diskHead-start=p-start+maxLength; 322.diskHead-maxlength=p-maxlength-maxLength; 323.flag=1; 324.temp=p; 325.if(diskHead-next=NULL) diskHead-next=q; 326.else 327. 328.while(temp-next) temp=temp-next; 329.temp-next=q; 330. 331.break; 332. 333.p=p-next; 334. 335.return flag; 336. 337.338.void fileCreate(char fileName,int length,char fileKind) 339. 340./int i,j; 341.time_t rawtime; 342.int startPos; 343.UFD *fileNode,*p; 344.for(p=userTableuserID.user-next;p!=NULL;p=p-next) 345. 346