1、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;15. int useFlag;16. distTable *next;17. diskN
2、ode;18. diskNode *diskHead;19. struct /文件块结构体 20. 21. char 10;22. int strat; /文件在磁盘存储空间的起始地址 23. int length; /文件内容长度 24. int maxlength; /文件的最大长度 25. char 3; /文件的属性读写方式 26. struct tm *timeinfo;27. bool openFlag; /判断是否有进程打开了该文件 28. / *next;29. ;30. 31. /两级目录结构体 32. typedef struct user_ /用户文件目录文件UFD 33
3、. 34. /char 10;35. *file;36. user_ *next;37. UFD;38. /UFD *headFile;39. typedef struct master_ /主文件目录MFD 40. 41. char userName10;42. char password10;43. UFD *user;44. MFD;45. MFD userTableMaxUser;46. int used=0; /定义MFD目录中用已有的用户数 47. 48. /文件管理 49. void (char ,int length,char ); /创建文件 50. void (char )
4、; /写文件 51. void (char ); /读文件 52. void (char ,char rename); /重命名文件 53. void (char ); /查询文件 54. void (char UserName); /显示某一用户的所有文件 55. void (char ); /关闭已打开的文件 56. void (char ); /删除文件 57. void chmod(char ,char kind); /修改文件的读写方式 58. int requestDist(int &startPostion,int maxLength); /磁盘分配查询 59. void ini
5、tDisk(); /初始化磁盘 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);72. strcpy(order1,rm73. strcpy(ord
6、er2,cat74. strcpy(order3,write75. strcpy(order4,fine76. strcpy(order5,chmod77. strcpy(order6,ren78. strcpy(order7,dir79. strcpy(order8,close80. strcpy(order9,return81. strcpy(order10,exit82. strcpy(order11,df83. char command50,command_str110,command_str210,command_str35,command_str43;84. int i,k,j;8
7、5. int length;86. initDisk();87. for(i=0;inext=NULL;91. 92. while(1) 93. 94. printf(*/n95. printf( 1、Creat user/n96. printf( 2、login/n97. printf(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. e
8、lse printf(您的输入有误,请重新选择/n104. while(userID!=-1) 105. 106. fflush(stdin);107. printf(/n108. printf( create-创建 格式:create a1 1000 rw,将创建名为a1,长度为1000字节可读可写的文件/n109. printf( rm-删除 格式:rm a1,将删除名为a1的文件/n110. printf( cat-查看文件内容 格式:cat a1,显示a1的内容/n111. printf( write-写入 格式:write a1/n112. printf( fine-查询 格式:fi
9、ne a1 ,将显示文件 a1的属性/n113. printf( chmod-修改 格式:chmod a1 r,将文件a1的权限改为只读方式/n114. printf( ren-重命名 格式:ren a1 b1 ,将a1改名为b1/n115. printf( dir-显示文件 格式:dir aaa,将显示aaa用户的所有文件/n116. printf( df-显示磁盘空间使用情况 格式:df/n117. printf( close-关闭文件 格式:close a1,将关闭文件a1/n118. printf( return-退出用户,返回登录界面/n119. printf( exit-退出程序/
10、n120. printf(/n121. printf(please imput your command:122. gets(command);123. int select;124. for(i=0;commandi!= &/0;i+) /command_str1字符串存储命令的操作类型 125. command_str1i=commandi;126. k=i;127. command_str1k=128. for(i=0;commandAmount;i+) 129. 130. if(!strcmp(command_str1,orderi) 131. 132. select=i;133. b
11、reak;134. 135. 136. if(i=commandAmount) 137. 138. printf(您输入的命令有误,请重新输入/n139. continue;140. 141. for(i=k+1,k=0;i+,k+) /commmand_str2字符串存储文件名或用户名 142. command_str2k=commandi;143. command_str2k=144. k=i;145. switch(select) 146. 147. case 0:for(i=k+1,k=0;i+,k+) 148. command_str3k=commandi;149. command_
12、str3k=150. k=i;151. j=1;152. length=0; /初始化文件长度 153. for(i=strlen(command_str3)-1;i=0;i-) /把字符串转换为十进制 154. 155. length+=(command_str3i-48)*j;156. j*=10;157. 158. for(i=k+1,k=0;159. command_str4k=commandi;160. command_str4k=161. (command_str2,length,command_str4);break;162. case 1:(command_str2);163.
13、 case 2:164. case 3:165. (command_str2);166. case 4:167. case 5:168. command_str3k=commandi;169. command_str3k=170. chmod(command_str2,command_str3);171. case 6:172. command_str3k=commandi;173. command_str3k=174. (command_str2,command_str3);175. case 7:176. case 8:177. case 9:UFD *p;178. for(p=userT
14、ableuserID.user-next;p!=NULL;p=p-next) /退出用户之前关闭所有打的文件 179. if(p-file-openFlag) 180. p-openFlag=false;181. system(cls182. userID=-1;183. case 10:exit(0);184. case 11:diskShow();185. 186. 187. 188. return 0;189. 190. 191. void userCreate() 192. 193. char c;194. char userName10;195. int i;196. if(used
15、MaxUser) 197. 198. printf(请输入用户名:199. for(i=0;c=getch();200. 201. if(c=13) break;202. else 203. userNamei=c;204. printf(%c,c);205. 206. userNamei=207. for(i=0;used;208. 209. if(!strcmp(userTablei.userName,userName) 210. 211. printf(/n212. printf(该用户名已存在,创建用户失败/n213. system(pause214. return;215. 216.
16、 217. strcpy(userTableused.userName,userName);218. printf(219. printf(请输入密码:220. for(i=0;221. 222. if(c=13) break;223. else 224. userTableused.passwordi=c;225. printf(*226. 227. userTableuserID.passwordi=228. printf(229. printf(创建用户成功/n230. used+;231. system(232. 233. else 234. 235. printf(创建用户失败,用户
17、已达到上限/n236. system(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;248. 249. if(c=13) break;250. else 251. namei=c;252. printf(253. 254. namei=255. for(i=0;256. 257. if(!strcmp(userTablei.userName,name) 258.
18、break;259. 260. if(i=used) 261. 262. printf(/n您输入的用户名不存在/n263. system(264. return -1;265. 266. for(times=0;timesmaxlength=MaxDisk;302. diskHead-useFlag=0;303. diskHead-start=0;304. diskHead-305. 306. int requestDist(int &startPostion,int maxLength) 307. 308. int flag=0; /标记是否分配成功 309. diskNode *p,*q
19、,*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-318. q-maxlength=maxLength;319. q-useFlag=1;320. q-321. diskHead-start+maxLength;322. diskHead-maxlength=p-maxlength-maxLength;
20、323. flag=1;324. temp=p;325. if(diskHead-next=NULL) diskHead-next=q;326. else 327. 328. while(temp-next) temp=temp-329. temp-330. 331. break;332. 333. p=p-334. 335. return flag;336. 337. 338. void (char ,int length,char ) 339. 340. /int i,j;341. time_t rawtime;342. int startPos;343. UFD *,*p;344. for(p=userTableuserID.user-p=p-
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1