OS.cpp
上传用户:tinajin
上传日期:2014-01-19
资源大小:136k
文件大小:21k
源码类别:

操作系统开发

开发平台:

C/C++

  1. ////////////////////////////////////////////////////////////
  2. //  编译工具:Visual c++ 6.0                               //
  3. //                                                        //
  4. //  作者:~小楚*smill~ 、蓝色的天空                        //
  5. //  邮件:qvb20974151@163.com                              //
  6. //                                                        //
  7. //  复制、传播请保留作者信息,谢谢!                       //
  8. //                                                        //
  9. ////////////////////////////////////////////////////////////
  10. #include <stdio.h>
  11. #include <conio.h>
  12. #include <string.h>
  13. #include <stdlib.h>
  14. #include <time.h> 
  15. void fileCreate(char *fileName,int fileLenght);  //创建文件,文件最大长度为1万
  16. void fileDel(char *fileName);                    //删除文件
  17. void fileRead(char *fileName,int postion,int lenght);
  18. void fileWrite(char *fileName,int position,char *s);      //函数声明
  19. void fileAsk(char *fileName);                    //查询文件属性
  20. void fileType(char *fileName);                   //显示文件内容
  21. void fileRen(char *fileName,char *newName);      //重命名文件
  22. void fileDir();                                  //列出所有文件
  23. void fileClose(char *fileName);                  //关闭一个文件
  24. int  requestDisk(int *startPosition,int *maxLength); //分配磁盘空间
  25. /////////////////////////////////
  26. //模拟磁盘空间
  27. char disk[10000]; 
  28. ///////////////////////////////
  29. //磁盘空间管理 
  30. struct freeDiskTable 
  31. {
  32. int start;   //开始位置
  33. int length;  //占用长度
  34. int maxLength;  //最大长度
  35. int useFlag;    //使用标志,1为占用,0为空闲
  36. };
  37. //////////////////////////////////
  38. //文件表
  39. struct fileTable
  40. {
  41. char fileName[20];  //文件名字
  42. int start;          //开始位置
  43. int length;         //文件长度
  44. int maxLength;      //最大长度
  45.     char fileKind[8];   //文件种类,此默认为txt
  46. struct tm *timeinfo; //文件创建时间
  47. };
  48. ////////////////////////////////
  49. //打开文件表
  50. struct openFileTable
  51. {
  52. char fileName[20];   //文件名字
  53. char fileKind[8];    //文件类型
  54. int start;           //文件开始位置
  55. int length;          //文件长度
  56. int maxLength;       //最大长度
  57. int openCount;       //打开文件的进程数
  58. struct tm *timeinfo; //文件创建时间
  59. };
  60. //////////////////////////////
  61. typedef struct freeDiskTable LinDataType; //定义链表的数据类型
  62. #include "LinList.h"               //链表操作集合
  63. SLNode *freeDiskTableHead;         //定义磁盘分配表链表 头指针
  64. #define MaxSize 100                //定义线性表 最大长度
  65. typedef struct fileTable SeqDataType; //定义线性表数据类型
  66. #include "SeqList.h"           //线性表操作集合
  67. SeqList L; //文件表,模拟文件操作嘛,文件数不多,故可以用 线性表,简化操作^_^
  68. struct openFileTable OFT[10];  //打开文件表数组
  69. int OFT_count=0;               //打开文件表占用长度
  70. void main()
  71. {
  72. struct orderTable  //命令表
  73. {
  74. char name[8];  
  75. };
  76. char orderInput[30];   //存储用户输入的命令字符串
  77. char orderName[8];     //命令名字
  78. char fileName[20];    //命令参数1,是文件名字
  79. char parameter2[6];   //命令参数2,是个数字
  80. char parameter3[30];  //命令参数3,是字符串或数字
  81. struct orderTable u[9];  //命令表
  82. int i=0;                
  83. int flag=0;             //用户输入串 读写位置 标志
  84. int flagOrder=-1;
  85. /////////////////////////////////////
  86.     
  87. LinListInitiate(&freeDiskTableHead);//磁盘空间分配键表初始化
  88. struct freeDiskTable temp; 
  89. temp.length=0;
  90. temp.maxLength=10000;
  91. temp.start=0;
  92. temp.useFlag=0;
  93. if(!LinListInsert(freeDiskTableHead,0,temp))
  94. {
  95. printf("初始磁盘空闲表失败!");
  96. system("pause");
  97. exit(0);
  98. }
  99. /////////////////////////////////////
  100. //文件表初始化
  101. SeqListInitiate(&L); //初始化 文件表
  102. /////////////////////////////////////
  103. for(i=0;i<2;i++)           
  104. for(int j=0;j<2;j++)
  105. {
  106. system("color fc");
  107. printf("nnnnnnnnn                   作者:XXX 操作系统课程设计n");
  108. for(int k=0;k<30000000;k++);
  109. system("cls");
  110. system("color f3");
  111. printf("nnnnnnnnn                   作者:XXX 操作系统课程设计n");
  112. for(k=0;k<30000000;k++);
  113. system("cls");
  114. }
  115. system("color 17");     //设置背景色 和 前景色
  116. ////////////////////////////////////////////////////////////
  117. //初始化命令表
  118. strcpy(u[0].name,"create");
  119. strcpy(u[1].name,"delete");
  120. strcpy(u[2].name,"read");
  121. strcpy(u[3].name,"write");
  122. strcpy(u[4].name,"ask");
  123. strcpy(u[5].name,"type");
  124. strcpy(u[6].name,"ren");
  125. strcpy(u[7].name,"dir");
  126. strcpy(u[8].name,"close");
  127. ////////////////////////////////////////////////////////////
  128. while(1)
  129. {
  130. printf("n");
  131. printf("|******************************************************|n");
  132. printf("|* create-创建 delete-删除 read-读取  write-写入      *|n");
  133. printf("|* ask-查询    type-显示   ren-重命名 dir-显示文件    *|n");
  134. printf("|* close-关闭文件                                     *|n");
  135. printf("|* 输入'命令 ?'获得帮助,例如'create ?',exit-退出程序 *|n");
  136. printf("|******************************************************|n");
  137. printf("请输入命令:>");
  138. fflush(stdin);      //清空缓冲区
  139. gets(orderInput);   //获取用户输入串
  140. if(!strcmp(orderInput,"exit"))exit(0); //当用户输入 exit 退出程序
  141. system("cls");     //清屏
  142. for(i=0;orderInput[i]!=' '&&orderInput[i]!='';i++)//以空格为界 分解用户输入串
  143. {
  144. orderName[i]=orderInput[i];
  145. }
  146. flag=i;//保存读写指针
  147. if(flag>6)        //命令名长度 小于6
  148. {
  149. printf("输入的命令有误,请重新输入!n");
  150. continue ;
  151. }
  152. orderName[i]='';
  153. flagOrder=-1;  //初始化标志位,flagOrder 指明命令在命令表中的位置
  154. for(i=0;i<9;i++)
  155. {
  156. if(!strcmp(orderName,u[i].name))
  157. {
  158. flagOrder=i;   //记录命令的位置,以便访问
  159. break;
  160. }
  161. }
  162. if(flagOrder==-1)
  163. {
  164. printf("你输入的命令有误!请重新输入!n");
  165. continue ;
  166. }
  167. /////////////////////////////////////////////////////
  168. //以空格为界,分解字符串,分解出第一个字符串放到fileName中
  169. for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='';i++)
  170. {
  171. fileName[i-flag-1]=orderInput[i];
  172. }
  173. fileName[i-flag-1]=''; //为字符串数组 置一个结束标志
  174. /////////////////////////////////////////////////////
  175. flag=i;                   //下一个字符串 读写指针
  176. if(!strcmp(fileName,"?")) //显示命令帮助
  177. {
  178. switch(flagOrder)
  179. {
  180. case 0: 
  181. printf("创建一个文件 格式 create [filename][filelength]n");
  182. printf("例如: create a1 1000 ,将创建名为a1,长度为1000字节的文件n");
  183. break;
  184. case 1:
  185. printf("删除一个文件 格式 delete [filename] n");
  186. printf("例如: delete a1,将删除名为a1的文件n");
  187. break;
  188. case 2: 
  189. printf("读取一个文件 格式 read [filename][postion][length]n");
  190. printf("例如: read a1 8 3,从a1文件第8个字节开始,显示3字节内容n");
  191. break;
  192. case 3:
  193. printf("写一个文件   格式 write [fileName][postion][conten] n");
  194. printf("例始: write a1 15 test,从a1文件第15字节开始写入 test 字符串n");
  195. break;
  196. case 4:
  197. printf("显示文件的属性,格式 ask [filename]n");
  198.     printf("例如 ask a1 ,将显示文件 a1的属性n");
  199. break;
  200.             case 5:
  201. printf("显示文件的所有内容,格式 type [filename]n");
  202. printf("例如 type a1,将显示文件 a1的所有内容n");
  203. break;
  204. case 6:
  205. printf("重命名一个文件,格式 ren [oldFileName][newFileName]n");
  206. printf("例如ren a1 b1 ,将a1改名为b1n");
  207. break;
  208. case 7:
  209. printf("显示所有文件,例如 dir,将显示所有文件n");
  210. break;
  211. case 8:
  212. printf("关闭文件,格式 close [fileName]n");
  213. printf("例如,close a1,将关闭文件a1n");
  214. break;
  215. default:
  216. printf("命令错误");
  217. }
  218. getch();
  219. }
  220. else
  221. {
  222. switch(flagOrder)//对相应的命令 进行参数处理
  223. {
  224. case 0:
  225. {
  226. int Temp[4]={1,10,100,1000};
  227. int sum=0;
  228. int len=0;
  229. for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='';i++)
  230. {
  231. parameter2[i-flag-1]=orderInput[i];
  232. }
  233. parameter2[i-flag-1]=''; //为字符串数组 置一个结束标志
  234. flag=i; 
  235. len=strlen(parameter2); //求字符串数组的长度
  236. for(i=0;i<len;i++)  //把第二个参数 字符串变成整数
  237. sum=sum+((int)parameter2[len-i-1]-48)*Temp[i];
  238. fileCreate(fileName,sum); //将命令和参数 传给建文件模块执行
  239. }
  240. break;
  241. case 1:
  242. fileDel(fileName); //删除文件
  243.       break;
  244. case 2:
  245. {
  246. int Temp[4]={1,10,100,1000};
  247. int sum=0;
  248. int len=0;
  249. int sum2=0;
  250. //////////////////////////////////////////////////////////
  251. for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='';i++)
  252. {
  253. parameter2[i-flag-1]=orderInput[i];
  254. }
  255. parameter2[i-flag-1]='';
  256. flag=i; 
  257. len=strlen(parameter2); //求字符串数组的长度
  258. for(i=0;i<len;i++)  //把第二个参数 字符串变成整数
  259. sum=sum+((int)parameter2[len-i-1]-48)*Temp[i];
  260. ///////////////////////////////////////////////////////////
  261. for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='';i++)
  262. {
  263. parameter3[i-flag-1]=orderInput[i]; //把第三个参数变成整型
  264. }
  265. parameter3[i-flag-1]='';
  266. flag=i; 
  267. len=strlen(parameter3);
  268. for(i=0;i<len;i++)
  269. sum2=sum2+((int)parameter3[len-i-1]-48)*Temp[i];
  270. fileRead(fileName,sum,sum2); //调用读文件模块
  271. }
  272. break;
  273. case 3:
  274. {
  275. int Temp[4]={1,10,100,1000};
  276. int sum=0;
  277. int len=0;
  278. //////////////////////////////////////////////////////////
  279. for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='';i++)
  280. {
  281. parameter2[i-flag-1]=orderInput[i];
  282. }
  283. parameter2[i-flag-1]='';
  284. flag=i; 
  285. len=strlen(parameter2); //求字符串数组的长度
  286. for(i=0;i<len;i++)  //把第二个参数 字符串变成整数
  287. sum=sum+((int)parameter2[len-i-1]-48)*Temp[i];
  288. ///////////////////////////////////////////////////////////
  289. for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='';i++)
  290. {
  291. parameter3[i-flag-1]=orderInput[i]; //获取第三个参数,为字符串
  292. }
  293. parameter3[i-flag-1]='';
  294. flag=i; 
  295. //////////////////////////////////////////////////////////
  296. fileWrite(fileName,sum,parameter3); //调用写文件模块
  297. }
  298.                 break;
  299. case 4:
  300. fileAsk(fileName); //查询文件属性
  301. break;
  302. case 5:
  303. fileType(fileName);    //显示文件内容
  304. break;
  305. case 6:
  306. {
  307. for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='';i++)
  308. {
  309. parameter2[i-flag-1]=orderInput[i];
  310. }
  311. parameter2[i-flag-1]='';
  312. flag=i; 
  313. fileRen(fileName,parameter2);
  314. }
  315. break;
  316. case 7:
  317. fileDir();
  318. break;
  319. case 8:
  320. fileClose(fileName);
  321. break;
  322. default:
  323. printf("错误!没有可执行的命令");
  324. }
  325. }
  326. }
  327. }
  328. //以上主函数,主函数进行数据结构的定义 分析用户输入的命令。
  329. //提供命令帮助。把命令和参数,传递给执行模块
  330. //////////////////////////////////////////////////////////////////////
  331. void fileCreate(char *fileName,int fileLength)//没有写到打开文件表
  332. {
  333. int i=0;
  334. time_t rawtime;
  335. int startPosition=0; //文件开始位置,等磁盘分配函数 返回值
  336. int maxLength=fileLength;
  337. struct fileTable temp;
  338. for(i=0;i<L.size;i++)
  339. if(!strcmp(fileName,L.list[i].fileName)) //判断是否重名,如果重名直接返回
  340. {
  341. printf("文件重名,请取别的名字!n");
  342. return ; //文件重名,退出创建函数
  343. }
  344.     if(!requestDisk(&startPosition,&maxLength))
  345. {
  346. printf("申请磁盘空间失败!无法建立文件!n");
  347. return ; //申请磁盘空间失败,退出创建函数
  348. }
  349. strcpy(temp.fileName,fileName); 
  350. strcpy(temp.fileKind,"txt"); //设置文件类型为 txt
  351. temp.length=0;               //创建的时候,还没写入内容,是空文件,长度设为0
  352. temp.maxLength=fileLength;  //文件的最大长度
  353. temp.start=startPosition;   //文件的开始位置
  354. time(&rawtime); //获取时间
  355. temp.timeinfo=localtime(&rawtime); //把时间写到结构体里去
  356. if(!SeqListInsert(&L,L.size,temp)) //把文件 插入到文件表
  357. {
  358. printf("插入文件表失败!n");
  359. system("pause");
  360. exit(0); //把文件插入到 文件表,如果失败,退出程序
  361. }
  362. printf("成功创建文件!nn");
  363. printf("===========================================n");
  364. printf("文件名    长度    最大长度   类型  开始位置n");//显示刚建立的文件
  365. printf("%s     ",temp.fileName);
  366. printf("%d       ",temp.length);
  367. printf("%d      ",temp.maxLength);
  368. printf("%s    ",temp.fileKind);
  369. printf("%d    ",temp.start);
  370. printf("n===========================================n");
  371. printf("create进程打开了文件%s,关闭请用close命令!nn",fileName);
  372. //写到打开文件表
  373. strcpy(OFT[OFT_count].fileName,temp.fileName);
  374. strcpy(OFT[OFT_count].fileKind,temp.fileKind);
  375. OFT[OFT_count].length=temp.length;
  376. OFT[OFT_count].maxLength=temp.maxLength;
  377. OFT[OFT_count].start=temp.start;
  378. OFT[OFT_count].openCount=1;
  379. OFT[OFT_count].timeinfo=temp.timeinfo;
  380. OFT_count++;                    //打开表 记录的是文件数 
  381. //printf("count%d",OFT_count);
  382. }
  383. void fileDel(char *fileName)
  384. {
  385. int i;
  386. int flag=0;    
  387. int k=0;       //记录文件在 文件表中的位置
  388. SLNode *p;    //磁盘空间分配表 指针
  389. SeqDataType x; //存储被删除的结点,无特殊意义
  390. for(i=0;i<OFT_count;i++) //判断是否被别的进程占用,若被占用,打印出错,直接返回
  391.    if(!strcmp(fileName,OFT[i].fileName))
  392. {
  393. printf("别的进程占用文件!无法删除!");
  394. return ;
  395. }
  396. for(i=0;i<L.size;i++)//从文件表里查找到要删除的文件,若查找不到,直接返回
  397. {
  398. if(!strcmp(fileName,L.list[i].fileName))
  399. {
  400. flag=1;
  401. k=i;
  402. break;
  403. }
  404. }
  405. if(flag==0)
  406. {
  407. printf("无此文件!");
  408. return ;
  409. }
  410. if(flag==1)//查找到文件后,把磁盘空间置为空闲,之后从文件表中删除
  411. {
  412. for(p=freeDiskTableHead;p->next!=NULL;p=p->next)
  413. {
  414. if(p->next->data.start==L.list[k].start)
  415. {
  416. p->next->data.useFlag=0;
  417. printf("成功删除!n");
  418. break;
  419. }
  420. }
  421. SeqListDelete(&L,k,&x);//从文件表中删除
  422. }
  423. }
  424. void fileRead(char *fileName,int position,int length)
  425. {
  426. int i;
  427. int flag=0;
  428. int k=0;
  429. for(i=0;i<OFT_count;i++)   //查找文件打开表,如果存在,则不需要再查找文件表
  430. {
  431. if(!strcmp(fileName,OFT[i].fileName))
  432. {
  433. k=i;
  434. flag=1;
  435. OFT[i].openCount++;//多个进程打开,计算器加1
  436. break;
  437. }
  438. }
  439. if(flag!=1) //文件不在打开表,找到它,并写到打开表最后
  440. {
  441. for(i=0;i<L.size;i++)
  442. {
  443. if(!strcmp(fileName,L.list[i].fileName)) //找到文件,写到文件打开表
  444. {
  445. strcpy(OFT[OFT_count].fileName,L.list[i].fileName);
  446. strcpy(OFT[OFT_count].fileKind,L.list[i].fileKind);
  447. OFT[OFT_count].length=L.list[i].length;
  448. OFT[OFT_count].maxLength=L.list[i].maxLength;
  449. OFT[OFT_count].start=L.list[i].start;
  450. OFT[OFT_count].timeinfo=L.list[i].timeinfo;
  451. OFT[OFT_count].openCount++;
  452. k=OFT_count;
  453. //OFT_count=1;//初次打开,赋值为1
  454. flag=1; //标志在打开文件表里
  455. }
  456. }
  457. }
  458. if(flag==1)
  459. {
  460. if(position<0||position+length>OFT[k].length)
  461. {
  462. printf("读取参数错误,请检查参数!n");
  463. return ;
  464. }
  465. for(i=0;i<length;i++)
  466. printf("%c",disk[OFT[k].start+position+i-1]); //读取内容
  467. printf("nread进程打开了文件%s,关闭请用close命令!nn",fileName);
  468. }
  469. }
  470. void fileWrite(char *fileName,int position,char *s)//找到文件,写到打开表,根据打开表操作
  471. {
  472. int i=0;
  473. int len=0; //计算写入字串长度,跟原来长度相加,如果超过最大长度,就失败
  474. int k=0;   //如果在 打开表里打到记录,则记录位置
  475. int flag=0; //如果flag=1,说明在打开表里找到了,不用在文件表里找了
  476. len=strlen(s);
  477. for(i=0;i<OFT_count;i++)
  478. {
  479. if(!strcmp(fileName,OFT[i].fileName))
  480. {
  481. k=i;
  482. flag=1;
  483. OFT[i].openCount++;//多个进程打开,计算器加1
  484. break;
  485. }
  486. }
  487. if(flag!=1) //文件不在打开表,找到它,并写到打开表最后
  488. {
  489. for(i=0;i<L.size;i++)
  490. {
  491. if(!strcmp(fileName,L.list[i].fileName)) //找到文件,写到文件打开表的最后
  492. {
  493. strcpy(OFT[OFT_count].fileName,L.list[i].fileName);
  494. strcpy(OFT[OFT_count].fileKind,L.list[i].fileKind);
  495. OFT[OFT_count].length=L.list[i].length;
  496. OFT[OFT_count].maxLength=L.list[i].maxLength;
  497. OFT[OFT_count].start=L.list[i].start;
  498. OFT[OFT_count].timeinfo=L.list[i].timeinfo;
  499. OFT[OFT_count].openCount++;
  500. k=OFT_count;                  //记录在文件打开表中的位置
  501. flag=1; //标志在打开文件表里
  502. }
  503. }
  504. }
  505. if(1==flag)  //如果在打开表里 找到文件,则不用再找文件表
  506. {
  507. if(OFT[k].length+len>OFT[k].maxLength)
  508. {
  509. printf("超过文件最大长度,写入失败!n");
  510. return ;
  511. }
  512. else if(position<0||position>OFT[k].length)
  513. {
  514. printf("插入位置非法!请检查参数n");
  515. return ;
  516. }
  517. else
  518. {
  519. int j=0;
  520. for(i=OFT[k].length-1;i>=OFT[k].start+position;i--)
  521. disk[i+len]=disk[i];  //给插入的字符串 空出位置
  522. for(i=OFT[k].start+position;i<OFT[k].start+position+len;i++,j++)
  523. disk[i]=s[j];       //写进磁盘
  524. for(i=0;i<L.size;i++)     //改变文件长度
  525. {
  526. if(!strcmp(fileName,L.list[i].fileName))
  527. {
  528. L.list[i].length=L.list[i].length+len;  //设置文件长度
  529. break;
  530. }
  531. }
  532.             OFT[k].length=OFT[k].length+len;   //同时更新打开文件表中文件的长度
  533. printf("成功写入!n");
  534. printf("write进程打开了文件%s,关闭请用close命令!nn",fileName);
  535. }
  536. }
  537. else
  538. printf("无此文件,请输入正确的文件名!");
  539. }
  540. void fileAsk(char *fileName)
  541. {
  542. int i;
  543. int flag=0;
  544. for(i=0;i<OFT_count;i++)    //如果在打开表里 找到文件,则不用再找文件表
  545. {
  546. if(!strcmp(fileName,OFT[i].fileName))
  547. {
  548. printf("文件名:%sn",OFT[i].fileName);
  549. printf("类型:%sn",OFT[i].fileKind);
  550. printf("长度:%dn",OFT[i].length);
  551. printf("打开进程数:%dn",OFT[i].openCount);
  552. printf("创建时间:%sn",asctime(OFT[i].timeinfo));
  553. flag=1;
  554. break;
  555. }
  556. }
  557. if(flag!=1)
  558. {
  559. for(i=0;i<L.size;i++)  //从文件表里查找文件
  560. {
  561. if(!strcmp(fileName,L.list[i].fileName))
  562. {
  563. printf("文件名:%sn",L.list[i].fileName);
  564. printf("类型:%sn",L.list[i].fileKind);
  565. printf("长度:%dn",L.list[i].length);
  566. printf("创建时间:%sn",asctime(L.list[i].timeinfo));
  567. flag=1;
  568. break;
  569. }
  570. }
  571. }
  572. if(flag==0)
  573. printf("无此文件!n");
  574. }
  575. void fileType(char *fileName)
  576. {
  577. int i;
  578. int flag=0;
  579. int k=0;
  580. for(i=0;i<OFT_count;i++)
  581. {
  582. if(!strcmp(fileName,OFT[i].fileName))
  583. {
  584. k=i;
  585. flag=1;
  586. OFT[i].openCount++;//多个进程打开,计算器加1
  587. break;
  588. }
  589. }
  590. if(flag!=1) //文件不在打开表,找到它,并写到打开表最后
  591. {
  592. for(i=0;i<L.size;i++)
  593. {
  594. if(!strcmp(fileName,L.list[i].fileName)) //找到文件,写到文件打开表
  595. {
  596. strcmp(OFT[OFT_count].fileName,L.list[i].fileName);
  597. strcmp(OFT[OFT_count].fileKind,L.list[i].fileKind);
  598. OFT[OFT_count].length=L.list[i].length;
  599. OFT[OFT_count].maxLength=L.list[i].maxLength;
  600. OFT[OFT_count].start=L.list[i].start;
  601. OFT[OFT_count].timeinfo=L.list[i].timeinfo;
  602. OFT[OFT_count].openCount++;
  603. k=OFT_count;
  604. //OFT_count=1;//初次打开,赋值为1
  605. flag=1; //标志在打开文件表里
  606. }
  607. }
  608. }
  609. if(flag==1)
  610. {
  611. for(i=0;i<OFT[k].length;i++)
  612. printf("%c",disk[OFT[k].start+i]); //显示全部内容
  613. if(OFT[k].length==0)
  614. printf("文件为空,无内容显示!n");
  615. printf("n===========================================n");
  616. printf("ncreate进程打开了文件%s,关闭请用close命令!nn",fileName);
  617. // printf(",,,,n");
  618. // printf("OFT[k].length %dn",OFT[k].length);
  619. }
  620. else
  621. printf("无此文件,请检查文件名!n");
  622. }
  623. void fileRen(char *fileName,char *newName)
  624. {
  625. int i=0;
  626. int flag=0;
  627. for(i=0;i<OFT_count;i++) //若还有别的进程打开文件,刚不能重命名
  628.    if(!strcmp(fileName,OFT[i].fileName))
  629. {
  630. printf("别的进程占用文件!无法重命名!n");
  631. return ;
  632. }
  633. for(i=0;i<L.size;i++)   //在文件表里找到,并重命名
  634. if(!strcmp(fileName,L.list[i].fileName))
  635. {
  636. strcpy(L.list[i].fileName,newName);
  637. flag=1;
  638. break;
  639. }
  640. if(flag==1)
  641. printf("重命名成功!n");
  642. else
  643. printf("重命名失败!无此文件n");
  644. }
  645. void fileDir()
  646. {
  647. int i;
  648. if(L.size==0)  //文件表的 大小为0,说明没有文件
  649. {
  650. printf("磁盘无文件!n");
  651. return ;
  652. }
  653. for(i=0;i<L.size;i++)   //打印所有文件名
  654. printf("%sn",L.list[i].fileName); 
  655. }
  656. void fileClose(char *fileName)
  657. {
  658. int i;
  659. int flag=0;
  660. int j;
  661. for(i=0;i<OFT_count;i++)
  662. {
  663. if(!strcmp(fileName,OFT[i].fileName)) //在文件打开表里找到,把打开数减1,
  664.                                   //如果计数为0,显示关闭成功!
  665. {
  666. OFT[i].openCount--;
  667. flag=1;
  668. if(OFT[i].openCount==0)
  669. {
  670. for(j=i;j<OFT_count;j++)
  671. OFT[j]=OFT[j+1]; //删除要关闭的文件
  672. OFT_count--;
  673. printf("成功关闭文件!n");
  674. }
  675. else
  676. printf("计数器减1n");
  677. break;
  678. }
  679. }
  680. if(flag==0)
  681. printf("此文件没有打开!n");
  682. }
  683. ///////////////////////////////
  684. //磁盘空间管理 操作
  685. int requestDisk(int *startPosistion,int *maxLength)
  686. {
  687. struct freeDiskTable temp;
  688. int flag=0; //分配成功与否标志
  689. int k=0; //记录插入位置
  690.     SLNode *p=NULL;
  691. for(p=freeDiskTableHead;p->next!=NULL;p=p->next)
  692. {
  693. k++;//记录位置,在空闲结点之后插入结点
  694. if(p->next->data.useFlag==0&&p->next->data.maxLength>=*maxLength)
  695. {
  696. temp.length=0;
  697. temp.maxLength=p->next->data.maxLength-*maxLength;
  698. temp.start=p->next->data.start+*maxLength;
  699. temp.useFlag=0;     //分解节点
  700. //=========================================
  701. p->next->data.maxLength=*maxLength;
  702. p->next->data.useFlag=1;   //设置分配的空间标志位
  703. *startPosistion=p->next->data.start;
  704. flag=1;//成功分配
  705. break;
  706. }
  707. }
  708.     if(1==flag)  //成功分配空间,返回成功标志
  709. {
  710. if(!LinListInsert(freeDiskTableHead,k,temp))
  711. {
  712. printf("失败!n");
  713. system("pause");
  714. exit(0);
  715. }
  716. return 1;
  717. }
  718. else
  719. return 0;
  720. }
  721. ///////////////////////////////////////////////////