1、 . .计算机操作系统课程实验报告题目文件管理 学 院:计算机学院专 业:计算机科学与技术姓名班级学号2016年 12月22日实验三 文件管理1.实验目的:编写一个简单的二级文件系统实现程序,加深对文件系统的内部功能和内部实现的理解。要求模拟采用二级目录结构的磁盘文件系统的文件操作能实现相应的命令,用输入命令来模拟用户程序中调用的文件操作。2.实验内容:最基本的文件操作 (1)创建文件 在创建一个新文件时,系统首先要为新文件分配必要的外存空间,并在文件系统的目录中,为之建立一个目录项。目录项中应该记录新文件的文件名及其在外存的地址等属性。 (2)删除文件 当已不再需要某文件时,可将它从文件系统
2、中删除。在删除时,系统应该先从目录中找到要删除的文件的目录项,使之成为空项,然后回收该文件所占用的存储空间。 (3)读文件 在读一个文件时,须在相应的系统调用中给出文件名和应该读入的内存目标地址。此时,系统同样要查找目录,找到制定的目录项,从中得到被读文件在外存中的位置。在目录项中,还有一个指针用于对文件的读/写。 (4)写文件 在写一个文件时,须在相应的系统调用中给出该文件名及该文件在内存中的(源)地址。为此,也同样须先查找目录,找到指定文件的目录项,在利用目录中的写指针进行写操作。 (5)截断文件 如果一个文件的内容已经陈旧而需要全部更新文件的内容时,一种方法是将此文件删除,再重新创建一个
3、新文件。但如果文件名及其属性均无改变时,则可采取另一种所谓的截断文件的方法,此即将原有文件的长度设置为0,或说放弃原有的文件内容。 (6)设置文件的读/写位置 前述的文件读/写操作,都只提供了对文件顺序存取的手段,即每次都是从文件的始端读或写。设置文件读/写位置的操作,用于设置文件读/写指针的位置,以便每次读/写文件时,不是从其始端而是从所设置的位置开始操作。也正因如此,才能改顺序存取为随机存取。3.设计实现:1)流程图2)详细设计源代码#include #include #include #include #include #define MaxUser 100 /定义最多有100个用户#d
4、efine 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
5、 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 userNa
6、me10;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 f
7、ileChange();/修改文件的读写方式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 m
8、ain()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()
9、;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
10、= 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.passw
11、ordi = 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
12、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);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1