操作系统试验三--文件管理_第1页
操作系统试验三--文件管理_第2页
操作系统试验三--文件管理_第3页
操作系统试验三--文件管理_第4页
操作系统试验三--文件管理_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、?计算机操作系统?课程实验报告题目文件治理学院:计算机学院专业:计算机科学与技术姓 名班 级学 号2021年12月22日实验三 文件治理1. 实验目的: 编写一个简单的二级文件系统实现程序, 加深对文件系统的内部功能和内部 实现的理解.要求模拟采用二级目录结构的磁盘文件系统的文件操作能实现相应 的命令,用输入命令来模拟用户程序中调用的文件操作.2. 实验内容:最根本的文件操作1创立文件 在创立一个新文件时,系统首先要为新文件分配必要的外存空间,并在文件 系统的目录中, 为之建立一个目录项. 目录项中应该记录新文件的文件名及其在 外存的地址等属性.2删除文件 当已不再需要某文件时,可将它从文件系

2、统中删除.在删除时,系统应该先 从目录中找到要删除的文件的目录项, 使之成为空项, 然后回收该文件所占用的 存储空间.3读文件在读一个文件时, 须在相应的系统调用中给出文件名和应该读入的内存目标 地址.此时,系统同样要查找目录,找到制定的目录项,从中得到被读文件在外 存中的位置.在目录项中,还有一个指针用于对文件的读 / 写.4写文件在写一个文件时, 须在相应的系统调用中给出该文件名及该文件在内存中的 源地址.为此,也同样须先查找目录,找到指定文件的目录项,在利用目录 中的写指针进行写操作.5截断文件 如果一个文件的内容已经陈旧而需要全部更新文件的内容时, 一种方法是将 此文件删除, 再重新创

3、立一个新文件. 但如果文件名及其属性均无改变时, 那么可 采取另一种所谓的截断文件的方法,此即将原有文件的长度设置为0,或说放弃原有的文件内容.6设置文件的读 / 写位置前述的文件读/写操作,都只提供了对文件顺序存取的手段,即每次都是从 文件的始端读或写.设置文件读/写位置的操作,用于设置文件读/写指针的位置, 以便每次读/写文件时,不是从其始端而是从所设置的位置开始操作.也正因如 此,才能改顺序存取为随机存取.3. 设计实现:1流程图报吿无此用户clouExit迟出2详细设计 源代码#in elude <stdio.h>#in elude <stri ng.h>#in

4、 elude <coni o.h>#in elude <stdlib.h>#in elude <time.h>#define MaxUser 100 /定义最多有 100个用户定义磁盘空间大小#define MaxDisk 512*1024 /#define commandAmount / 对文件操作的指令数/ 存储空间治理有关结构体和变量文件快结构体文件在磁盘存储空间的起始地址文件内容长度文件的最大长度char diskMaxDisk;/ typedef struct distTable / int maxlength;int start;int useF

5、lag;distTable *next; diskNode; diskNode *diskHead; typedef struct / char 10;int start; /int length; /int maxlength;/模拟 512K 的磁盘存储空间磁盘块结构体char 3;/ 文件的属性 - 读写方式struct tm *timeinfo;bool openFlag;/ 判断是否有进程翻开了文件;int used = 0;/定义 MFD 目录中用已有的用户数/ 两级目录结构体typedef struct user_ /用户文件目录文件 UFD*file;user_ *next;U

6、FD;typedef struct master_ /主目录文件char userName10;char password10;UFD *user;MFD;MFD userTableMaxUser;int userID = -1; /用户登录的 ID 号,值为 -1 时表示没有用户登录/ 文件治理void (); / 创立文件void (); / 删除文件void (); / 写文件void ();/ 读文件void (); /重命名文件void (); /查询文件void ();/ 显示某一用户所有文件void (); / 关闭已翻开的文件void ();/ 修改文件的读写方式磁盘分配查询i

7、nt requestDist(int &stratPostion, int maxlength);/void initDisk();/ 初始化磁盘void freeDisk(int startPostion);/ 磁盘空间释放void diskShow();/ 显示磁盘使用情况void initFile();/ 用户治理void userCreate(); int login();void userDelet();void userFind();/ 用户登陆主界面 void webUser();/ 用户内部界面 void webFile();int main()initDisk();

8、initFile(); webUser(); return 0;void webUser()int i;while (1)*n");printf("1. 创立用户2.登陆用户n");printf("*printf("3. 删除用户4.查看用户n");printf("0. 退出系统n");printf("*n");printf" 请输入操作号 n"scanf("%d", &i); switch (i)case 0:exit(0); break;cas

9、e 1:userCreate(); break;case 2:userID = login(); if (userID != -1) webFile();break;case 3:userDelet(); break;case 4:userFind(); break; default:printf(" 您输入的命令有误,请重新选择 n"); system("pause");system("cls");break;void userCreate()char c;char userName10;int i;if (used<MaxU

10、ser)printf(" 请输入用户名: ");for (i = 0; c = _getch(); i+)if (c = 13) break;elseuserNamei = c;printf("%c", c);userNamei = '0'for (i = 0; i<used; i+)if (!strcmp(userTablei.userName, userName)printf("n");printf(" 该用户名已存在 , 创立用户失败 n");system("pause&quo

11、t;);system("cls");return;strcpy(userTableused.userName, userName);printf("n");printf(" 请输入密码: ");for (i = 0; c = _getch(); i+)if (c = 13) break;elseuserTableused.passwordi = c; printf("*");userTableuserID.passwordi = '0'printf("n");printf(&qu

12、ot; 创立用户成功 n");used+;system("pause");system("cls");elsen");printf(" 创立用户失败,用户已到达上限system("pause");system("cls");fflush(stdin);int login()char name10, psw10;char c;int i, times;printf(" 请输入用户名 :");for (i = 0; c = _getch(); i+)if (c = 13

13、) break;elsenamei = c;printf("%c", c);namei = '0'for (i = 0; i < used; i+)if (!strcmp(userTablei.userName, name) break;if (i = used)printf("n 您输入的用户名不存在 n");system("pause");system("cls");return -1;for (times = 0; times<3; times+)memset(psw, '

14、0', sizeof(psw);printf("n 请输入密码 :");for (i = 0; c = _getch(); i+)if (c = 13) break;elsepswi = c;printf("*");printf("n");for (i = 0; i<used; i+)if (!strcmp(psw, userTablei.password)printf(" 用户登录成功 n"); system("pause");system("cls"); b

15、reak;if (i = used)printf(" 您输入的密码错误,您还有 %d 次输入时机 n", 2 - times); if (times = 2) exit(0);else break;fflush(stdin);return i;void userDelet()int statePos;UFD *q;char name10, psw10;char c;int i, times, j;printf(" 请输入用户名 :");for (i = 0; c = _getch(); i+)if (c = 13) break;elsenamei = c

16、;printf("%c", c);namei = '0'for (i = 0; i < used; i+)if (!strcmp(userTablei.userName, name) break;if (i = used)printf("n 您输入的用户名不存在 n");system("pause");system("cls");elseq = userTablei.user->next;while (q)if (q-> NULL)statePos = q->file->

17、;start;freeDisk(statePos);q = q->next;for (i, j = i+1; i <= used; j+, i+)userTablei = userTablej;printf("n 用户删除成功 n");system("pause");system("cls");used-;void userFind()int i;printf(" 用户列表: n");for (i = 0; i < used; i+)printf("%sn", userTabl

18、ei.userName);system("pause"); system("cls");void webFile()int i;char name10, kind3;printf(" 1.创立2.删除n");printf(" 3.写入文件4.查看文件内容n");printf(" 5.重命名6.查看文件属性n");printf(" 7.查看用户文件8.关闭文件n");printf(" 9.修改文件权限10.查看磁盘使用情况 n"printf(" 1

19、1.返回上级目录12.退出系统n");printf("*n");printf("*n");printf" 请输入操作号: "scanf("%d", &i); while (1)switch (i)case 1:(); break;case 2:(); break;case 3: (); break;case 4:(); break;case 5:();break;case 6:();break;case 7:();break;case 8:();break;case 9:();break;case

20、 10:diskShow();break;case 11:system("cls");webUser();break;case 12:exit(0);break;default:printf(" 输入错误请重新输入 :"); break;scanf("%d", &i);void ()time_t rawtime;int startPos;char c;char 10, 10, 10;char command50;int length;/int i, k,j;printf(" 创立文件格式为 名称 长度 权限( r 、

21、w、rw):");fflush(stdin);gets(command);int i, k, j;for (i = 0, k = 0; commandi != ' ' i+, k+)k = commandi;k = '0'k = i;for (i = k + 1, k = 0; commandi != ' ' i+, k+)k = commandi;k = '0'k = i;j = 1;length = 0;/初始化文件长度for (i = strlen() - 1; i >= 0; i-)/把字符串转换为十进制l

22、ength += (i - 48)*j;j *= 10;for (i = k + 1, k = 0; commandi != ' '&&commandi != '0' i+, k+)k = commandi;k = '0'UFD *, *p;for (p = userTableuserID.user->next; p != NULL; p = p->next)if (!strcmp(p->file->, )printf(" 文件重名,创立文件失败 n"); system("pa

23、use");return;if (requestDist(startPos, length)= (UFD*)malloc(sizeof(UFD);>file = (*)malloc(sizeof(); strcpy(>file->, );strcpy(>file->, ); >file->maxlength = length;>file->start = startPos;>file->openFlag = false; time(&rawtime);>file->timeinfo = localt

24、ime(&rawtime);>next = NULL;if (userTableuserID.user->next = NULL) userTableuserID.user->next = ;elsep = userTableuserID.user->next;while (p->next) p = p->next;p->next = ;printf(" 创立文件成功 n"); system("pause");elsen");printf(" 磁盘空间已满或所创立文件超出磁盘空闲容量,

25、磁盘空间分配失败 system("pause");void initDisk()diskHead = (diskNode *)malloc(sizeof(diskNode);diskHead->maxlength = MaxDisk;diskHead->useFlag = 0;diskHead->start = 0;diskHead->next = NULL;void initFile()int i;for (i = 0; i<MaxUser; i+)/初始化用户 UFD 目录文件的头指针userTablei.user = (UFD *)mal

26、loc(sizeof(UFD);userTablei.user->next = NULL;int requestDist(int &startPostion, int maxLength)int flag = 0; / 标记是否分配成功diskNode *p, *q, *temp;p = diskHead;while (p)if (p->useFlag = 0 && p->maxlength>maxLength)startPostion = p->start;q = (diskNode *)malloc(sizeof(diskNode);q

27、->start = p->start;q->maxlength = maxLength;q->useFlag = 1;q->next = NULL;diskHead->start = p->start + maxLength; diskHead->maxlength = p->maxlength - maxLength; flag = 1;temp = p;if (diskHead->next = NULL) diskHead->next = q;elsewhile (temp->next) temp = temp->

28、;next; temp->next = q;break;p = p->next;return flag;void freeDisk(int startPostion)diskNode *p;for (p = diskHead; p != NULL; p = p->next)if (p->start = startPostion) break;p->useFlag = false;void ()char 10, command50;int i, k;fflush(stdin);printf(" 输入文件名称: ");gets(command);f

29、or (i = 0, k = 0; commandi != '0' i+, k+)k = commandi;k = '0'UFD *p, *q, *temp;q = userTableuserID.user;p = q->next;while (p)if (!strcmp(p->file->, ) break;elsep = p->next;q = q->next;if (p)if (p->file->openFlag != true)/先判断是否有进程翻开该文件temp = p;q->next = p->n

30、ext;freeDisk(temp->file->start); / 磁盘空间回收free(temp);printf(" 文件删除成功 n");system("pause");elseprintf(" 该文件正在被占用 , 删除失败 n");system("pause");elseprintf(" 没有找到该文件 , 请检查输入的文件名是否正确 n");system("pause");void ()int startPos, length;int k, i;cha

31、r 10, command50;printf(" 输入文件名称: ");fflush(stdin);gets(command);for (i = 0, k = 0; commandi != '0' i+, k+)k = commandi;k = '0'k = 0;UFD *p, *q;q = userTableuserID.user;for (p = q->next; p != NULL; p = p->next)if (!strcmp(p->file->, )break;if (p)startPos = p->

32、file->start;文件翻开标记length = p->file->length; p->file->openFlag = true;/printf( "*for (int i = startPos; k<length; i+, k+)一行大于 50 个字符换行if (i % 50 = 0) printf("n"); / printf("%c", diski); printf("nn* *n", p->file->);n");printf("%s 文件正

33、在被占用 , 请 先 将 其 关 闭 n" system("pause");elseprintf(" 没有找到该文件 , 请检查输入的文件名是否正确 system("pause");void ()char 10, command50; int i, k, startPos;printf(" 输入文件名称: "); fflush(stdin);gets(command);for (i = 0, k = 0; commandi != '0' i+, k+)k = commandi;k = '0&

34、#39;UFD *p, *q;q = userTableuserID.user;for (p = q->next; p != NULL; p = p->next)if (!strcmp(p->file->, )break;if (p)判断文件类型if (!strcmp(p->file->, "r")/printf(" 该文件是只读文件 , 写入失败 n"); system("pause");return;char str500;printf("please input content:n&

35、quot;);gets(str);startPos = p->file->start;p->file->openFlag = true;/ 文件翻开标记 p->file->length = strlen(str);if (p->file->length>p->file->maxlength)printf(" 写入字符串长度大于该文件的总长度 , 写入失败 n"); system("pause");return;for (i = startPos, k = 0; k<(int)strl

36、en(str); i+, k+)diski = strk;printf(" 文件写入成功 , 请将该文件关闭 n"); system("pause");elseprintf(" 没有找到该文件 , 请检查输入的文件名是否正确 n"); system("pause");void ()char 10, command50;int i, k;printf(" 输入文件名称: ");fflush(stdin);gets(command);for (i = 0, k = 0; commandi != &#

37、39;0' i+, k+)k = commandi;k = '0'UFD *p, *q;q = userTableuserID.user;for (p = q->next; p != NULL; p = p->next)if (!strcmp(p->file->, )break;if (p)printf( "* printf(" 文件名: %sn", p->file->);printf(" 文件长度: %dn", p->file->maxlength);printf(&qu

38、ot; 文件在存储空间的起始地址: %dn", p->file->start);printf(" 文件类型: %sn", p->file->);printf(" 创立时间: %sn", asctime(p->file->timeinfo);printf( "* system("pause");elseprintf" 没有找到该文件 , 请检查输入的文件名是否正确 n"system("pause");void ()char 10, 10, c

39、ommand50;int i, k;fflush(stdin);printf(" 输入文件名称和新的文件权限: ");gets(command);for (i = 0, k = 0; commandi != ' ' i+, k+)k = commandi;k = '0'for (k = i + 1, i = 0; commandk != '0' i+, k+)i = commandk;i = '0'UFD *p, *q;q = userTableuserID.user;for (p = q->next;

40、p != NULL; p = p->next)if (!strcmp(p->file->, )break;if (p)strcpy(p->file->, );printf(" 修改文件类型成功 n");system("pause");elsen");printf(" 没有找到该文件 , 请检查输入的文件名是否正确 system("pause");void ()char 10, 10, command50;int i, k;fflush(stdin);printf(" 输入文件

41、名称和新的文件名称: ");gets(command);for (i = 0, k = 0; commandi != ' ' i+, k+)k = commandi;k = '0'for (k = i + 1, i = 0; commandk != '0' i+, k+)i = commandk;i = '0'UFD *p, *q;q = userTableuserID.user;for (p = q->next; p != NULL; p = p->next)if (!strcmp(p->file-&

42、gt;, )break;if (p)while (q->next)if (!strcmp(q->next->file->, )printf(" 您输入的文件名已存在 , 重命名失败 n system("pause");return;q = q->next;strcpy(p->file->, );printf(" 重命名成功 n");system("pause");elsen");printf(" 没有找到该文件 , 请检查输入的文件名是否正确 system(&qu

43、ot;pause");void ()char userName10, command50;int i, k;printf(" 输入用户名称: ");fflush(stdin);gets(command);for (i = 0, k = 0; commandi != '0' i+, k+)userNamek = commandi;userNamek = '0'UFD *p;for (i = 0; i<MaxUser; i+)printf("printf(");if (!strcmp(userTablei.us

44、erName, userName)k = i;break;if (i = MaxUser)printf(" 没有找到该用户,请检查输入用户名是否正确 n"); system("pause");return;elsep = userTablek.user->next;*n");printf(" 文件名 文件长度 文件在磁盘的起始地址 文件类型 创立时间 n"); for (; p != NULL; p = p->next)printf("%s %d %d %s %s",p->file-&g

45、t;, p->file->maxlength,p->file->start, p->file->, asctime(p->file->timeinfo);*system("pause");printf("*n");void diskShow()diskNode *p;int i = 0, unusedDisk = 0;*printf(" 盘块号 起始地址 容量 (bit) 是否已被使用 n");for (p = diskHead; p != NULL; p = p->next, i

46、+)if (p->useFlag = false) unusedDisk += p->maxlength;printf(" %d %d %d%dn", i, p->start, p->maxlength,p->useFlag);printf("*n");printf(" 磁 盘 空 间 总 容 量 : 512*1024bit 已 使 用 : %dbit 末 使 用: %dbitn", MaxDisk - unusedDisk, unusedDisk);system("pause");void ()char 10, command50;int i, k;printf(" 输入文件名称: "); fflush(stdin);gets(command);for (i = 0, k = 0; commandi != '0' i+, k+)k = commandi;k = '0'UFD *p, *q;q = userTableuserlD .u ser;for (p = q_>n ext; p != NULL; p = p_>n ext)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论