1、模拟一个简单二级文件管理系统362020年4月19日文档仅供参考模拟一个简单二级文件管理系统设计目的:经过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。设计内容:模拟一个简单二级文件管理系统一、实验内容描述1 实验目标本实验的目的是经过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现.2 实验要求为DOS系统设计一个简单的二级文件系统.要求做到以下几点:能够实现下列命令:login 用户登录dir 列文件目录create 创立文件delete 删除文件open 打开文件close 关闭文件read 读文件write
2、 写文件列目录时要列出文件名、物理地址、保护码和文件长度.源文件能够进行读写保护.二、程序主要内容1设计思路程序中要求每个用户在登陆后才可对其拥有的文件进行操作,用户对于其它用户的文件无操作权.文件操作包括浏览、创立、删除、打开、关闭、阅读、写入、修改模式.其它操作包括新建用户、帮助、用户登入、用户登出、退出系统.在程序文件夹下有个名为“file”的系统根目录,此目录下包括:一个名为“mfd”的文件,记录所有注册过的帐号及密码;用户文件,以用户名作为文件名,内容为其拥有的文件名及属性;一个名为“keiji”的文件夹.“keiji”文件夹中包括:“file.p”指针文件,记录所有已用的物理地址;
3、一些以物理地址为名的文件,内容为文件内容.2 数据结构file结构体系统文件数据结构:fpaddrint,文件的物理地址、flengthint,文件长度、fmodeint,文件模式 0.只读;1.可写;2.可读写;3.保护、 fnamechar,文件名;filemode结构体文件状态数据结构:isopenint,文件当前状态,0.关闭;1.打开、modeint,文件模式 0.只读;1.可写;2.可读写;3.初始化;user结构体用户信息数据结构:unamechar,用户名、upasswordchar,用户密码;userfile结构体用户文件数据结构:unamechar,用户名、ufilefil
4、e,用户拥有的文件数组.cpp view plaincopyprint?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 /磁盘块结
5、构体 12. 13. int maxlength; 14. int start; 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 *
6、timeinfo; 27. bool openFlag; /判断是否有进程打开了该文件 28. /fileTable *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
7、. 41. char userName10; 42. char password10; 43. UFD *user; 44. MFD; 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 fileRe
8、n(char fileName,char rename); /重命名文件 53. void fileFine(char fileName); /查询文件 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
9、 maxLength); /磁盘分配查询 59. void initDisk(); /初始化磁盘 60. void freeDisk(int startPostion); /磁盘空间释放 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);
10、 72. strcpy(order1,rm); 73. strcpy(order2,cat); 74. strcpy(order3,write); 75. strcpy(order4,fine); 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,comma
11、nd_str110,command_str210,command_str35,command_str43; 84. int i,k,j; 85. int length; 86. initDisk(); /初始化磁盘 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;
12、 100. scanf(%d,&choice); 101. if(choice=1) userCreate(); 102. else if(choice=2) userID=login(); 103. else printf(您的输入有误,请重新选择/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,将删除名
13、为a1的文件/n); 110. printf( cat-查看文件内容 格式:cat a1,显示a1的内容/n); 111. printf( write-写入 格式:write a1/n); 112. printf( fine-查询 格式:fine a1 ,将显示文件 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); 11
14、6. printf( df-显示磁盘空间使用情况 格式:df/n); 117. printf( close-关闭文件 格式:close a1,将关闭文件a1/n); 118. printf( return-退出用户,返回登录界面/n); 119. printf( exit-退出程序/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字符串存
15、储命令的操作类型 125. command_str1i=commandi; 126. k=i; 127. command_str1k=/0; 128. for(i=0;i=0;i-) /把字符串转换为十进制 154. 155. length+=(command_str3i-48)*j; 156. j*=10; 157. 158. for(i=k+1,k=0;commandi!= &commandi!=/0;i+,k+) 159. command_str4k=commandi; 160. command_str4k=/0; 161. fileCreate(command_str2,length,
16、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_str2);break; 167. case 5:for(i=k+1,k=0;commandi!= &commandi!=/0;i+,k+) 168. command_str3k=commandi; 169. command_str3k=
17、/0; 170. chmod(command_str2,command_str3);break; 171. case 6:for(i=k+1,k=0;commandi!=/0;i+,k+) 172. command_str3k=commandi; 173. command_str3k=/0; 174. fileRen(command_str2,command_str3);break; 175. case 7:fileDir(command_str2);break; 176. case 8:fileClose(command_str2);break; 177. case 9:UFD *p; 17
18、8. 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. 186. 187. 188. return 0; 189. 190.191. void userCreate() 192. 193. char c;
19、 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(!strcmp(userTablei.userName,userName) 210. 211. printf(/n
20、); 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; 225. printf(*); 226. 227. userTableuserID.pa
21、sswordi=/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; 246. printf(请输入用户名:); 247. for(i=0
22、;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. 266. for(times=0;t
23、imes3;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; 305. 3
24、06. 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-maxle
25、ngth=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
26、. 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. if(!strcmp(p-file-fileName,fileName) 347.
27、348. printf(文件重名,创立文件失败/n); 349. system(pause); 350. return; 351. 352. 353. if(requestDist(startPos,length) 354. 355. fileNode=(UFD *)malloc(sizeof(UFD); 356. fileNode-file=(fileTable *)malloc(sizeof(fileTable); /这一步必不可少,因为fileNode里面的指针也需要申请地址,否则fileNode-file指向会出错 357. strcpy(fileNode-file-fileName,
28、fileName); 358. strcpy(fileNode-file-fileKind,fileKind); 359. fileNode-file-maxlength=length; 360. fileNode-file-strat=startPos; 361. fileNode-file-openFlag=false; 362. time(&rawtime); 363. fileNode-file-timeinfo=localtime(&rawtime); 364. fileNode-next=NULL; 365. if(userTableuserID.user-next=NULL) 3
29、66. userTableuserID.user-next=fileNode; 367. else 368. 369. p=userTableuserID.user-next; 370. while(p-next) p=p-next; 371. p-next=fileNode; 372. 373. printf(创立文件成功/n); 374. system(pause); 375. 376. else 377. 378. printf(磁盘空间已满或所创立文件超出磁盘空闲容量,磁盘空间分配失败/n); 379. system(pause); 380. 381. 382.383. void fr
30、eeDisk(int startPostion) 384. 385. diskNode *p; 386. for(p=diskHead;p!=NULL;p=p-next) 387. 388. if(p-start=startPostion) 389. break; 390. 391. p-useFlag=false; 392. 393.394. void fileDel(char fileName) 395. 396. UFD *p,*q,*temp; 397. q=userTableuserID.user; 398. p=q-next; 399. while(p) 400. 401. if(
31、!strcmp(p-file-fileName,fileName) break; 402. else 403. 404. p=p-next; 405. q=q-next; 406. 407. 408. if(p) 409. 410. if(p-file-openFlag!=true) /先判断是否有进程打开该文件 411. 412. temp=p; 413. q-next=p-next; 414. freeDisk(temp-file-strat); /磁盘空间回收 415. free(temp); 416. printf(文件删除成功/n); 417. system(pause); 418.
32、 419. else 420. 421. printf(该文件已被进程打开,删除失败/n); 422. system(pause); 423. 424. 425. else 426. 427. printf(没有找到该文件,请检查输入的文件名是否正确/n); 428. system(pause); 429. 430. 431.432. void fileCat(char fileName) 433. 434. int startPos,length; 435. int k=0; 436. UFD *p,*q; 437. q=userTableuserID.user; 438. for(p=q-
33、next;p!=NULL;p=p-next) 439. 440. if(!strcmp(p-file-fileName,fileName) 441. break; 442. 443. if(p) 444. 445. startPos=p-file-strat; 446. length=p-file-length; 447. p-file-openFlag=true; /文件打开标记 448. printf(*/n); 449. for(int i=startPos;kfile-fileName); 456. system(pause); 457. 458. else 459. 460. pri
34、ntf(没有找到该文件,请检查输入的文件名是否正确/n); 461. system(pause); 462. 463. 464.465. void fileWrite(char fileName) 466. 467. UFD *p,*q; 468. q=userTableuserID.user; 469. int i,k,startPos; 470. for(p=q-next;p!=NULL;p=p-next) 471. 472. if(!strcmp(p-file-fileName,fileName) 473. break; 474. 475. if(p) 476. 477. if(!str
35、cmp(p-file-fileKind,r) /判断文件类型 478. 479. printf(该文件是只读文件,写入失败/n); 480. system(pause); 481. return; 482. 483. char str500; 484. printf(please input content:/n); 485. gets(str); 486. startPos=p-file-strat; 487. p-file-openFlag=true; /文件打开标记 488. p-file-length=strlen(str); 489. if(p-file-lengthp-file-m
36、axlength) 490. 491. printf(写入字符串长度大于该文件的总长度,写入失败/n); 492. system(pause); 493. return; 494. 495. for(i=startPos,k=0;knext;p!=NULL;p=p-next) 512. 513. if(!strcmp(p-file-fileName,fileName) 514. break; 515. 516. if(p) 517. 518. printf(*/n); 519. printf(文件名:%s/n,p-file-fileName); 520. printf(文件长度:%d/n,p-file-maxlength); 521. printf(文件在存储空间的起始地址:%d/n,p-file-strat); 522. printf(文件类型:%s/n,p-file-fileKind); 523. printf(创立时间:%s/n,asctime(p-file-timeinfo); 524. printf(*/n); 525. system(pause); 526. 527. else 528. 529. printf(没有找到该文件,请检查输入的文件名是否正