




免费预览已结束,剩余30页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机操作系统课程实验报告题目文件管理 学 院:计算机学院专 业:计算机科学与技术姓名班级学号2016年 12月22日实验三 文件管理1.实验目的:编写一个简单的二级文件系统实现程序,加深对文件系统的内部功能和内部实现的理解。要求模拟采用二级目录结构的磁盘文件系统的文件操作能实现相应的命令,用输入命令来模拟用户程序中调用的文件操作。2.实验内容:最基本的文件操作 (1)创建文件 在创建一个新文件时,系统首先要为新文件分配必要的外存空间,并在文件系统的目录中,为之建立一个目录项。目录项中应该记录新文件的文件名及其在外存的地址等属性。 (2)删除文件 当已不再需要某文件时,可将它从文件系统中删除。在删除时,系统应该先从目录中找到要删除的文件的目录项,使之成为空项,然后回收该文件所占用的存储空间。 (3)读文件 在读一个文件时,须在相应的系统调用中给出文件名和应该读入的内存目标地址。此时,系统同样要查找目录,找到制定的目录项,从中得到被读文件在外存中的位置。在目录项中,还有一个指针用于对文件的读/写。 (4)写文件 在写一个文件时,须在相应的系统调用中给出该文件名及该文件在内存中的(源)地址。为此,也同样须先查找目录,找到指定文件的目录项,在利用目录中的写指针进行写操作。 (5)截断文件 如果一个文件的内容已经陈旧而需要全部更新文件的内容时,一种方法是将此文件删除,再重新创建一个新文件。但如果文件名及其属性均无改变时,则可采取另一种所谓的截断文件的方法,此即将原有文件的长度设置为0,或说放弃原有的文件内容。 (6)设置文件的读/写位置 前述的文件读/写操作,都只提供了对文件顺序存取的手段,即每次都是从文件的始端读或写。设置文件读/写位置的操作,用于设置文件读/写指针的位置,以便每次读/写文件时,不是从其始端而是从所设置的位置开始操作。也正因如此,才能改顺序存取为随机存取。3.设计实现:1)流程图2)详细设计源代码#include #include #include #include #include #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;diskNode *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 *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(); /重命名文件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();int 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(*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(pause);system(cls);break;void userCreate()char c;char userName10;int i;if (usedMaxUser)printf(请输入用户名:);for (i = 0; c = _getch(); i+)if (c = 13) break;elseuserNamei = c;printf(%c, c);userNamei = 0;for (i = 0; iused; i+)if (!strcmp(userTablei.userName, 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;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;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);system(cls);return -1;for (times = 0; times3; 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; iused; i+)if (!strcmp(psw, userTablei.password)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(请输入用户名:);for (i = 0; c = _getch(); i+)if (c = 13) break;elsenamei = c;printf(%c, c);namei = 0;for (i = 0; i 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(用户列表:n);for (i = 0; i = 0; i-)/把字符串转换为十进制length += (fileLengthi - 48)*j;j *= 10;for (i = k + 1, k = 0; 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);return;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 = 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-next;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 = 0;diskHead-next = NULL;void initFile()int i;for (i = 0; inext = NULL;int requestDist(int &startPostion, int maxLength)int flag = 0; /标记是否分配成功diskNode *p, *q, *temp;p = diskHead;while (p)if (p-useFlag = 0 & p-maxlengthmaxLength)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 - 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)break;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 (!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(该文件正在被占用,删除失败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+)fileNamek = 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(*n);for (int i = startPos; kfile-fileName);system(pause);elseprintf(没有找到该文件,请检查输入的文件名是否正确n);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-next; 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-start;p-file-openFlag = true;/文件打开标记p-file-length = strlen(str);if (p-file-lengthp-file-maxlength)printf(写入字符串长度大于该文件的总长度,写入失败n);system(pause);return;for (i = startPos, k = 0; knext; 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(文件在存储空间的起始地址:%dn, p-file-start);printf(文件类型:%sn, p-file-fileKind);printf(创建时间:%sn, asctime(p-file-timeinfo);printf(*n);system(pause);elseprintf(没有找到该文件,请检查输入的文件名是否正确n);system(pause);void fileChange()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 = 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);system(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+)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);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; inext;printf(*n);printf(文件名 文件长度 文件在磁盘的起始地址 文件类型 创建时间n);for (; p != NULL; p = p-next)printf(%s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年龙港市国有资本运营有限公司面向社会公开招聘工作人员3人笔试参考题库附带答案详解
- 2025年福建省福州市罗源县丝路港湾勘测设计有限公司招聘6人笔试参考题库附带答案详解
- 2025年湖北省新能源有限公司社会招聘24人笔试参考题库附带答案详解
- 2025年安徽金柱控股集团有限公司招聘7人笔试参考题库附带答案详解
- 2025年华北油田公司招聘21人笔试参考题库附带答案详解
- 2025年中国水利水电第十六工程局有限公司高校毕业生招聘笔试参考题库附带答案详解
- 2025山东菏泽市通达协合劳务有限公司招聘劳务派遣制人员8人笔试参考题库附带答案详解
- 2025华远国际陆港集团所属企业校园招聘113人(山西)笔试参考题库附带答案详解
- 2025中国建设科技集团股份有限公司竞聘4人笔试参考题库附带答案详解
- 危险品安全培训教材课件
- 加润滑油安全操作规程
- 萨福双脉冲气保焊说明书DIGIPLUS课件
- 高中期中考试家长会PPT课件 (共51张PPT)
- JJG 573-2003膜盒压力表
- GB/T 39634-2020宾馆节水管理规范
- GB/T 13234-2018用能单位节能量计算方法
- 营业线施工单位“四员一长”施工安全知识培训考试题库
- 紧急采购申请单
- 全球卫生治理课件
- 工程地质学:第7章 岩体结构及其稳定性
- 非洲猪瘟防控讲座课件
评论
0/150
提交评论