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

下载本文档

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

文档简介

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

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

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

4、io.h>#include <stdlib.h>#include <time.h>#define MaxUser 100 /定义最多有100个用户#define MaxDisk 512*1024 /定义磁盘空间大小#define commandAmount /对文件操作的指令数/存储空间管理有关结构体和变量char diskMaxDisk;/ 模拟512K的磁盘存储空间typedef struct distTable /磁盘块结构体int maxlength;int start;int useFlag;distTable *next;diskNode;diskNo

5、de *diskHead;typedef struct fileTable /文件快结构体char fileName10;int start; /文件在磁盘存储空间的起始地址int length; /文件内容长度int maxlength;/文件的最大长度char fileKind3;/文件的属性-读写方式struct tm *timeinfo;bool openFlag;/判断是否有进程打开了文件;int used = 0;/ 定义 MFD 目录中用已有的用户数/两级目录结构体typedef struct user_file_directory /用户文件目录文件 UFDfileTable

6、*file;user_file_directory *next;UFD;typedef struct master_file_directory /主目录文件char userName10;char password10;UFD *user;MFD;MFD userTableMaxUser;int userID = -1; /用户登录的 ID 号,值为-1 时表示没有用户登录/文件管理void fileCreate(); /创建文件void fileDelet(); /删除文件void fileWrite(); /写文件void fileRead();/读文件void fileRename()

7、; /重命名文件void fileFind(); /查询文件void fileDir();/ 显示某一用户所有文件void fileClose(); /关闭已打开的文件void fileChange();/修改文件的读写方式int requestDist(int &stratPostion, int maxlength);/磁盘分配查询void initDisk();/初始化磁盘void freeDisk(int startPostion);/磁盘空间释放void diskShow();/显示磁盘使用情况void initFile();/用户管理void userCreate();in

8、t login();void userDelet();void userFind();/用户登陆主界面void webUser();/用户内部界面 void webFile();int main()initDisk();initFile();webUser();return 0;void webUser()int i;while (1)printf("*n");printf("1.创建用户 2.登陆用户 n");printf("3.删除用户 4.查看用户n");printf("0.退出系统 n");printf(&

9、quot;*n");printf("请输入操作号n");scanf("%d", &i);switch (i)case 0:exit(0); break;case 1:userCreate(); break;case 2:userID = login();if (userID != -1)webFile();break;case 3:userDelet(); break;case 4:userFind(); break;default:printf("您输入的命令有误,请重新选择n");system("pau

10、se");system("cls");break;void userCreate()char c;char userName10;int i;if (used<MaxUser)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.use

11、rName, userName)printf("n");printf("该用户名已存在,创建用户失败n");system("pause");system("cls");return;strcpy(userTableused.userName, userName);printf("n");printf("请输入密码:");for (i = 0; c = _getch(); i+)if (c = 13) break;elseuserTableused.passwordi = c;

12、printf("*");userTableuserID.passwordi = '0'printf("n");printf("创建用户成功n");used+;system("pause");system("cls");elseprintf("创建用户失败,用户已达到上限n");system("pause");system("cls");fflush(stdin);int login()char name10, psw10

13、;char c;int i, times;printf("请输入用户名:");for (i = 0; c = _getch(); i+)if (c = 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");

14、system("cls");return -1;for (times = 0; times<3; times+)memset(psw, '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.passwor

15、d)printf("用户登录成功n");system("pause");system("cls");break;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("

16、请输入用户名:");for (i = 0; c = _getch(); i+)if (c = 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");elseq = us

17、erTablei.user->next;while (q)if (q->file != NULL)statePos = q->file->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(&qu

18、ot;用户列表:n");for (i = 0; i < used; i+)printf("%sn", userTablei.userName);system("pause");system("cls");void webFile()int i;char name10, kind3;printf("*n");printf(" 1.创建 2.删除 n");printf(" 3.写入文件 4.查看文件内容 n");printf(" 5.重命名 6.查看文件

19、属性 n");printf(" 7.查看用户文件 8.关闭文件 n");printf(" 9.修改文件权限 10.查看磁盘使用情况 n");printf(" 11.返回上级目录 12.退出系统 n");printf("*n");printf("请输入操作号:");scanf("%d", &i);while (1)switch (i)case 1:fileCreate();break;case 2:fileDelet();break;case 3:fileWr

20、ite();break;case 4:fileRead();break;case 5:fileRename();break;case 6:fileFind();break;case 7:fileDir();break;case 8:fileClose();break;case 9:fileChange();break;case 10:diskShow();break;case 11:system("cls");webUser();break;case 12:exit(0);break;default:printf("输入错误请重新输入:");break;

21、scanf("%d", &i);void fileCreate()time_t rawtime;int startPos;char c;char fileName10, fileKind10, fileLength10;char command50;int length;/int i, k,j;printf(" 创建文件格式为 名称 长度 权限(r、w、rw):");fflush(stdin);gets(command);int i, k, j;for (i = 0, k = 0; commandi != ' ' i+, k+)f

22、ileNamek = commandi;fileNamek = '0'k = i;for (i = k + 1, k = 0; commandi != ' ' i+, k+)fileLengthk = commandi;fileLengthk = '0'k = i;j = 1;length = 0;/初始化文件长度for (i = strlen(fileLength) - 1; i >= 0; i-)/把字符串转换为十进制length += (fileLengthi - 48)*j;j *= 10;for (i = k + 1, k = 0

23、; commandi != ' '&&commandi != '0' i+, k+)fileKindk = commandi;fileKindk = '0'UFD *fileNode, *p;for (p = userTableuserID.user->next; p != NULL; p = p->next)if (!strcmp(p->file->fileName, fileName)printf("文件重名,创建文件失败n");system("pause");r

24、eturn;if (requestDist(startPos, length)fileNode = (UFD*)malloc(sizeof(UFD);fileNode->file = (fileTable*)malloc(sizeof(fileTable);strcpy(fileNode->file->fileName, fileName);strcpy(fileNode->file->fileKind, fileKind);fileNode->file->maxlength = length;fileNode->file->start =

25、 startPos;fileNode->file->openFlag = false;time(&rawtime);fileNode->file->timeinfo = localtime(&rawtime);fileNode->next = NULL;if (userTableuserID.user->next = NULL)userTableuserID.user->next = fileNode;elsep = userTableuserID.user->next;while (p->next) p = p->n

26、ext;p->next = fileNode;printf("创建文件成功n");system("pause");elseprintf("磁盘空间已满或所创建文件超出磁盘空闲容量,磁盘空间分配失败n");system("pause");void initDisk()diskHead = (diskNode *)malloc(sizeof(diskNode);diskHead->maxlength = MaxDisk;diskHead->useFlag = 0;diskHead->start

27、= 0;diskHead->next = NULL;void initFile()int i;for (i = 0; i<MaxUser; i+)/初始化用户 UFD 目录文件的头指针userTablei.user = (UFD *)malloc(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

28、->useFlag = 0 && p->maxlength>maxLength)startPostion = p->start;q = (diskNode *)malloc(sizeof(diskNode);q->start = p->start;q->maxlength = maxLength;q->useFlag = 1;q->next = NULL;diskHead->start = p->start + maxLength;diskHead->maxlength = p->maxlength

29、- maxLength;flag = 1;temp = p;if (diskHead->next = NULL) diskHead->next = q;elsewhile (temp->next) temp = temp->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)b

30、reak;p->useFlag = false;void fileDelet()char fileName10, command50;int i, k;fflush(stdin);printf(" 输入文件名称:");gets(command);for (i = 0, k = 0; commandi != '0' i+, k+)fileNamek = commandi;fileNamek = '0'UFD *p, *q, *temp;q = userTableuserID.user;p = q->next;while (p)if

31、(!strcmp(p->file->fileName, fileName) break;elsep = p->next;q = q->next;if (p)if (p->file->openFlag != true)/先判断是否有进程打开该文件temp = p;q->next = p->next;freeDisk(temp->file->start); /磁盘空间回收free(temp);printf("文件删除成功n");system("pause");elseprintf("该文件

32、正在被占用,删除失败n");system("pause");elseprintf("没有找到该文件,请检查输入的文件名是否正确n");system("pause");void fileRead()int startPos, length;int k, i;char fileName10, command50;printf(" 输入文件名称:");fflush(stdin);gets(command);for (i = 0, k = 0; commandi != '0' i+, k+)fil

33、eNamek = commandi;fileNamek = '0'k = 0;UFD *p, *q;q = userTableuserID.user;for (p = q->next; p != NULL; p = p->next)if (!strcmp(p->file->fileName, fileName)break;if (p)startPos = p->file->start;length = p->file->length;p->file->openFlag = true;/文件打开标记printf(&quo

34、t;*n");for (int i = startPos; k<length; i+, k+)if (i % 50 = 0) printf("n"); /一行大于 50 个字符换行printf("%c", diski);printf("nn*n");printf("%s 文件正在被占用 , 请 先 将 其 关 闭n", p->file->fileName);system("pause");elseprintf("没有找到该文件,请检查输入的文件名是否正确n&

35、quot;);system("pause");void fileWrite()char fileName10, command50;int i, k, startPos;printf(" 输入文件名称:");fflush(stdin);gets(command);for (i = 0, k = 0; commandi != '0' i+, k+)fileNamek = commandi;fileNamek = '0'UFD *p, *q;q = userTableuserID.user;for (p = q->nex

36、t; p != NULL; p = p->next)if (!strcmp(p->file->fileName, fileName)break;if (p)if (!strcmp(p->file->fileKind, "r")/判断文件类型printf("该文件是只读文件,写入失败n");system("pause");return;char str500;printf("please input content:n");gets(str);startPos = p->file-

37、>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)strlen(str); i+, k+)diski = strk;printf("文件写入

38、成功,请将该文件关闭n");system("pause");elseprintf("没有找到该文件,请检查输入的文件名是否正确n");system("pause");void fileFind()char fileName10, command50;int i, k;printf(" 输入文件名称:");fflush(stdin);gets(command);for (i = 0, k = 0; commandi != '0' i+, k+)fileNamek = commandi;fil

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

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

41、ange()char fileName10, fileKind10, command50;int i, k;fflush(stdin);printf(" 输入文件名称和新的文件权限:");gets(command);for (i = 0, k = 0; commandi != ' ' i+, k+)fileNamek = commandi;fileNamek = '0'for (k = i + 1, i = 0; commandk != '0' i+, k+)fileKindi = commandk;fileKindi = &

42、#39;0'UFD *p, *q;q = userTableuserID.user;for (p = q->next; p != NULL; p = p->next)if (!strcmp(p->file->fileName, fileName)break;if (p)strcpy(p->file->fileKind, fileKind);printf("修改文件类型成功n");system("pause");elseprintf("没有找到该文件,请检查输入的文件名是否正确n");syst

43、em("pause");void fileRename()char fileName10, fileRename10, command50;int i, k;fflush(stdin);printf(" 输入文件名称和新的文件名称:");gets(command);for (i = 0, k = 0; commandi != ' ' i+, k+)fileNamek = commandi;fileNamek = '0'for (k = i + 1, i = 0; commandk != '0' i+, k+

44、)fileRenamei = commandk;fileRenamei = '0'UFD *p, *q;q = userTableuserID.user;for (p = q->next; p != NULL; p = p->next)if (!strcmp(p->file->fileName, fileName)break;if (p)while (q->next)if (!strcmp(q->next->file->fileName, fileRename)printf("您输入的文件名已存在,重命名失败n"

45、;);system("pause");return;q = q->next;strcpy(p->file->fileName, fileRename);printf("重命名成功n");system("pause");elseprintf("没有找到该文件,请检查输入的文件名是否正确n");system("pause");void fileDir()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+)if (!strcmp(userTablei.userName, userName)k = i;break;if (i = MaxUser)printf("没有找到该用户,请检查输入用户名是否

温馨提示

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

评论

0/150

提交评论