实验四 文件系统的模拟
一、 实验目的:
用 C/C++编写和调试一个简单的文件系统,模拟文件管理的工作过程,从而
对各种文件操作命令的实质内容和执行过程有比较深入的了解。
二、 实验要求:
①设计一个 n 个用户的文件系统,每次用户可保存 m 个文件,用户在一次运行中
只能打开一个文件,对文件必须设置保护措施,且至少有 create、delete、
open、close、read、write 等命令。
②程序采用二级文件目录,即设置主目 MFD(包括用户名和指向文件目录的指针)
和用户文件目录 UFD(即文件目录,包括文件名,保护码,文件长度等)。另外,
为打开文件设置了运行文件目录(AFD,文件执行读命令或写命令之前,把相关
文件目录信息调入 AFD)。在执行读写命令时,需改读写指针。
③文件保护简单使用了三位保护码:分别代表读、写、执行的权限。对应位为
1,对应位为 0,则表示不允许读写、执行。
④程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD)、
打开文件目录(AFD)(即运行文件目录)
三、 实验报告:
3.1 实验步骤
(1)设计好主面板
(2)细化所有功能流程函数
(3)实现各个函数功能
3.2 流程图
3.3 代码
1. #include <stdio.h>
2. #include <string.h>
3. #include <stdlib.h>
4. #include <malloc.h>
5. #include <iostream>
6. using namespace std;
7. #include <time.h>
8.
9. typedef struct fileContent {
10. // 实际文件内容
11. string Content;
12. } *FileContent;
13.
14. typedef struct file {
15. // 文件名
16. string fileName;
17. // 文件类型
18. string fileType;
19. // 文件大小
20. int fileSize;
21. // 文件内容指针
22. FileContent fileContent;
23. // 文件保护码(index = 0:读权限,index = 1:读权限,index = 2:执行权
限;权限位含义:0 为禁止,1 为允许)
24. char fileProtectCode[3];
25. // 创建时间
26. time_t createTime;
27. // 修改时间
28. time_t updateTime;
29. // 访问时间
30. time_t accessTime;
31. } *File;
32.
33. // 二级目录:用户文件目录(每个用户的独立文件目录)
34. typedef struct uFD {
35. // 当前文件
36. File file;
37. // 上一个文件指针
38. uFD *before;
39. // 下一个文件指针
40. uFD *next;
41. } *UFD;
42.
43. typedef struct user {
44. // 用户名
45. string username;
46. // 密码
47. string password;
48. // 用户目录指针
49. UFD ufd;
50. } *User;
51.
52. // 一级目录:主文件目录(所有用户和对应用户的相关信息)
53. typedef struct mFD {
54. // 当前用户
55. User user;
56. // 上一个用户指针
57. mFD *before;
58. // 下一个用户指针
59. mFD *next;
60. } *MFD;
61.
62. // 打开文件目录(运行文件目录)
63. typedef struct aFD {
64. // 当前文件
65. File file;
66. // 上一个文件指针
67. aFD *before;
68. // 下一个文件指针
69. aFD *next;
70. } *AFD;
71.
72. // 初始化一级目录(主文件目录:所有用户和对应用户的相关信息)
73. void initMFD (MFD &mfd) {
74. mfd = new(mFD);
75. mfd->user = NULL;
76. mfd->before = NULL;
77. mfd->next = NULL;
78. }
79.
80. // 初始化二级目录(用户文件目录:每个用户的独立文件目录)
81. void initUFD (UFD &ufd) {
82. ufd = new(uFD);
83. ufd->file = NULL;
84. ufd->before = NULL;
85. ufd->next = NULL;
86. }
87.
88. // 初始化打开文件目录(运行文件目录)
89. void initAFD (AFD &afd) {
90. afd = new(aFD);
91. afd->file = NULL;
92. afd->before = NULL;
93. afd->next = NULL;
94. }
95.
96. // 初始化
97. void init (MFD &mfd, AFD &afd, User ¤tUser) {
98. initMFD(mfd);
99. initAFD(afd);
100. currentUser = NULL;
101. }
102.
103. // 创建二级目录(用户文件目录:每个用户的独立文件目录)
104. UFD createUFD () {
105. UFD ufd = new(uFD);
106. initUFD(ufd);
107. return ufd;
108. }
109.
110. // 创建打开文件目录(运行文件目录)
111. AFD createAFD () {
112. AFD afd = new(aFD);
113. initAFD(afd);
114. return afd;
115. }
116.
117. // 判断用户是否存在(已被创建过)
118. bool isExistForUser (MFD &mfd, string useranme) {
119. MFD tempMFD = mfd->next;
120. while (tempMFD != NULL) {
121. if (strcmp(tempMFD->user->username.c_str(), useranme.c_str
()) == 0) {
122. return true;
123. }
124. tempMFD = tempMFD->next;
125. }
126. return false;
127. }
128.
129. // 创建用户
130. void createUser (MFD &mfd) {
131. cout<<"正在创建新用户......"<<endl;
132. string username;
133. cout<<"请输入用户名:";
134. getline(cin, username);
135. cout<<"校验用户存性中......"<<endl;
136. if (isExistForUser(mfd, username)) {
137. cout<<username + "用户已存在,创建失败!"<<endl;
138. return;
139. }
140. cout<<"用户名“" + username + "”可用!"<<endl;
141. string password;
142. cout<<"请输入密码:";
143. getline(cin, password);
144. User newUser = new(user);
145. newUser->username = username;
146. newUser->password = password;
147. newUser->ufd = createUFD();
148. MFD newMFDNode = new(mFD);
149. newMFDNode->user = newUser;
150. MFD tempMFD = mfd;
151. while (tempMFD->next != NULL) {