《计算机操作系统》课程实验报告
题
目
文件管理 计算机学院 计算机科学与技术
学 院: 专 业: 姓班学
名 级 号
2016年 12月22日
实验三 文件管理
1.实验目的:
编写一个简单的二级文件系统实现程序,加深对文件系统的内部功能和内部
实现的理解。要求模拟采用二级目录结构的磁盘文件系统的文件操作能实现相应的命令,用输入命令来模拟用户程序中调用的文件操作。 2.实验内容: 最基本的文件操作 (1)创建文件
在创建一个新文件时,系统首先要为新文件分配必要的外存空间,并在文件系统的目录中,为之建立一个目录项。目录项中应该记录新文件的文件名及其在外存的地址等属性。 (2)删除文件
当已不再需要某文件时,可将它从文件系统中删除。在删除时,系统应该先从目录中找到要删除的文件的目录项,使之成为空项,然后回收该文件所占用的存储空间。 (3)读文件
在读一个文件时,须在相应的系统调用中给出文件名和应该读入的内存目标地址。此时,系统同样要查找目录,找到制定的目录项,从中得到被读文件在外存中的位置。在目录项中,还有一个指针用于对文件的读/写。 (4)写文件
在写一个文件时,须在相应的系统调用中给出该文件名及该文件在内存中的(源)地址。为此,也同样须先查找目录,找到指定文件的目录项,在利用目录中的写指针进行写操作。 (5)截断文件
如果一个文件的内容已经陈旧而需要全部更新文件的内容时,一种方法是将此文件删除,再重新创建一个新文件。但如果文件名及其属性均无改变时,则可采取另一种所谓的截断文件的方法,此即将原有文件的长度设置为0,或说放弃原有的文件内容。 (6)设置文件的读/写位置
前述的文件读/写操作,都只提供了对文件顺序存取的手段,即每次都是从文件的始端读或写。设置文件读/写位置的操作,用于设置文件读/写指针的位置,以便每次读/写文件时,不是从其始端而是从所设置的位置开始操作。也正因如此,才能改顺序存取为随机存取。 3.设计实现: 1)流程图
2)详细设计
源代码
#include #define MaxUser 100 //定义最多有100个用户 #define MaxDisk 512*1024 //定义磁盘空间大小 #define commandAmount //对文件操作的指令数 //存储空间管理有关结构体和变量 char disk[MaxDisk];// 模拟512K的磁盘存储空间 typedef struct distTable //磁盘块结构体 { int maxlength; int start; int useFlag; distTable *next; }diskNode; diskNode *diskHead; typedef struct fileTable //文件快结构体 { char fileName[10]; int start; //文件在磁盘存储空间的起始地址 int length; //文件内容长度 int maxlength;//文件的最大长度 char fileKind[3];//文件的属性--读写方式 struct tm *timeinfo; bool openFlag;//判断是否有进程打开了文件 }; int used = 0;// 定义 MFD 目录中用已有的用户数 //两级目录结构体 typedef struct user_file_directory //用户文件目录文件 UFD { fileTable *file; user_file_directory *next; }UFD; typedef struct master_file_directory //主目录文件 { char userName[10]; char password[10]; UFD *user; }MFD; MFD userTable[MaxUser]; 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\"); \\n\"); printf(\"3.删除用户 4.查看用户 printf(\"1.创建用户 2.登陆用户 \\n\"); printf(\"0.退出系统 \\n\"); printf(\"************************************************************\\n\"); } } void userCreate() { printf(\"请输入操作号\\n\"); scanf(\"%d\switch (i) { case 0:exit(0); break; case 1:userCreate(); break; case 2:userID = login(); if (userID != -1) { } break; webFile(); case 3:userDelet(); break; case 4:userFind(); break; default: } printf(\"您输入的命令有误,请重新选择\\n\"); system(\"pause\"); system(\"cls\"); break; char c; char userName[10]; int i; if (used userName[i] = '\\0'; for (i = 0; i printf(\"请输入密码:\"); for (i = 0; c = _getch(); i++) { if (!strcmp(userTable[i].userName, userName)) { } printf(\"\\n\"); printf(\"该用户名已存在,创建用户失败\\n\"); system(\"pause\"); system(\"cls\"); return; if (c == 13) break; else userName[i] = c; printf(\"%c\ } } if (c == 13) break; else userTable[used].password[i] = c; printf(\"*\"); userTable[userID].password[i] = '\\0'; printf(\"\\n\"); printf(\"创建用户成功\\n\"); used++; system(\"pause\"); system(\"cls\"); else { } fflush(stdin); } int login() { char name[10], psw[10]; char c; int i, times; printf(\"请输入用户名:\"); for (i = 0; c = _getch(); i++) { if (c == 13) break; else printf(\"创建用户失败,用户已达到上限\\n\"); system(\"pause\"); system(\"cls\"); } name[i] = c; printf(\"%c\ name[i] = '\\0'; for (i = 0; i < used; i++) { } if (i == used) { } for (times = 0; times<3; times++) { memset(psw, '\\0', sizeof(psw)); printf(\"\\n 请输入密码:\"); for (i = 0; c = _getch(); i++) { } printf(\"\\n\"); for (i = 0; i psw[i] = c; printf(\"\\n 您输入的用户名不存在\\n\"); system(\"pause\"); system(\"cls\"); return -1; if (!strcmp(userTable[i].userName, name)) break; printf(\"*\"); } } if (!strcmp(psw, userTable[i].password)) { } printf(\"用户登录成功\\n\"); system(\"pause\"); system(\"cls\"); break; if (i == used) { } else break; printf(\"您输入的密码错误,您还有%d 次输入机会\\n\if (times == 2) exit(0); fflush(stdin); return i; } void userDelet() { int statePos; UFD *q; char name[10], psw[10]; char c; int i, times, j; printf(\"请输入用户名:\"); for (i = 0; c = _getch(); i++) { if (c == 13) break; } else name[i] = c; printf(\"%c\ name[i] = '\\0'; for (i = 0; i < used; i++) { } if (i == used) { } else { q = userTable[i].user->next; while (q) { if (q->file != NULL) { statePos = q->file->start; printf(\"\\n 您输入的用户名不存在\\n\"); system(\"pause\"); system(\"cls\"); if (!strcmp(userTable[i].userName, name)) break; } freeDisk(statePos); q = q->next; } } } for (i, j = i+1; i <= used; j++, i++) { } printf(\"\\n 用户删除成功\\n\"); system(\"pause\"); system(\"cls\"); used--; userTable[i] = userTable[j]; void userFind() { int i; printf(\"用户列表:\\n\"); for (i = 0; i < used; i++) { } system(\"pause\"); system(\"cls\"); } void webFile() { int i; printf(\"%s\\n\ char name[10], kind[3]; printf(\"********************************************************\\n\"); printf(\" 1.创建 2.删除 \\n\"); printf(\" 3.写入文件 4.查看文件内容 \\n\"); printf(\" 5.重命名 6.查看文件属性 \\n\"); printf(\" 7.查看用户文件 8.关闭文件 \\n\"); printf(\" 9.修改文件权限 10.查看磁盘使用情况 \\n\"); printf(\" 11.返回上级目录 12.退出系统 \\n\"); printf(\"*********************************************************\\n\"); printf(\"请输入操作号:\"); scanf(\"%d\ while (1) { switch (i) { case 1: fileCreate(); break; case 2: fileDelet(); break; case 3: fileWrite(); 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: } scanf(\"%d\ printf(\"输入错误请重新输入:\"); break; void fileCreate() { time_t rawtime; int startPos; char c; char fileName[10], fileKind[10], fileLength[10]; char command[50]; int length; //int i, k,j; printf(\" 创建文件格式为 名称 长度 权限(r、w、rw):\"); fflush(stdin); gets(command); int i, k, j; for (i = 0, k = 0; command[i] != ' '; i++, k++) fileName[k] = command[i]; fileName[k] = '\\0'; k = i; for (i = k + 1, k = 0; command[i] != ' '; i++, k++) fileLength[k] = command[i]; fileLength[k] = '\\0'; k = i; j = 1; length = 0;//初始化文件长度 for (i = strlen(fileLength) - 1; i >= 0; i--)//把字符串转换为十进制 { } for (i = k + 1, k = 0; command[i] != ' '&&command[i] != '\\0'; i++, k++) fileKind[k] = command[i]; length += (fileLength[i] - 48)*j; j *= 10; fileKind[k] = '\\0'; UFD *fileNode, *p; for (p = userTable[userID].user->next; p != NULL; p = p->next) { } 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 (userTable[userID].user->next == NULL) userTable[userID].user->next = fileNode; if (!strcmp(p->file->fileName, fileName)) { } printf(\"文件重名,创建文件失败\\n\"); system(\"pause\"); return; else { } } p = userTable[userID].user->next; while (p->next) p = p->next; p->next = fileNode; printf(\"创建文件成功\\n\"); system(\"pause\"); else { } } 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 printf(\"磁盘空间已满或所创建文件超出磁盘空闲容量,磁盘空间分配失败\\n\"); system(\"pause\"); int requestDist(int &startPostion, int maxLength) { int flag = 0; //标记是否分配成功 diskNode *p, *q, *temp; p = diskHead; while (p) { } return flag; if (p->useFlag == 0 && p->maxlength>maxLength) { } p = p->next; 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; else { } break; while (temp->next) temp = temp->next; temp->next = q; } void freeDisk(int startPostion) { diskNode *p; for (p = diskHead; p != NULL; p = p->next) { } p->useFlag = false; } void fileDelet() { char fileName[10], command[50]; int i, k; fflush(stdin); printf(\" 输入文件名称:\"); gets(command); for (i = 0, k = 0; command[i] != '\\0'; i++, k++) fileName[k] = command[i]; if (p->start == startPostion) break; fileName[k] = '\\0'; UFD *p, *q, *temp; q = userTable[userID].user; p = q->next; while (p) { if (!strcmp(p->file->fileName, fileName)) break; else } { } p = p->next; q = q->next; if (p) { } else { } } void fileRead() { printf(\"没有找到该文件,请检查输入的文件名是否正确\\n\"); system(\"pause\"); if (p->file->openFlag != true)//先判断是否有进程打开该文件 { } else { } printf(\"该文件正在被占用,删除失败\\n\"); system(\"pause\"); temp = p; q->next = p->next; freeDisk(temp->file->start); //磁盘空间回收 free(temp); printf(\"文件删除成功\\n\"); system(\"pause\"); int startPos, length; int k, i; char fileName[10], command[50]; printf(\" 输入文件名称:\"); fflush(stdin); gets(command); for (i = 0, k = 0; command[i] != '\\0'; i++, k++) fileName[k] = command[i]; fileName[k] = '\\0'; k = 0; UFD *p, *q; q = userTable[userID].user; for (p = q->next; p != NULL; p = p->next) { } if (p) { startPos = p->file->start; length = p->file->length; p->file->openFlag = true;//文件打开标记 printf(\"*****************************************************\\n\"); for (int i = startPos; k if (!strcmp(p->file->fileName, fileName)) break; } printf(\"\\n\\n*****************************************************\\n\"); printf(\"%s 文件正在被占用 , 请 先 将 其 关 闭\\n\system(\"pause\"); else { } } void fileWrite() { char fileName[10], command[50]; int i, k, startPos; printf(\" 输入文件名称:\"); fflush(stdin); gets(command); for (i = 0, k = 0; command[i] != '\\0'; i++, k++) fileName[k] = command[i]; printf(\"没有找到该文件,请检查输入的文件名是否正确\\n\"); system(\"pause\"); fileName[k] = '\\0'; UFD *p, *q; q = userTable[userID].user; for (p = q->next; p != NULL; p = p->next) { } if (p) { if (!strcmp(p->file->fileName, fileName)) break; } if (!strcmp(p->file->fileKind, \"r\"))//判断文件类型 { } char str[500]; printf(\"please input content:\\n\"); gets(str); startPos = p->file->start; p->file->openFlag = true;//文件打开标记 p->file->length = strlen(str); if (p->file->length>p->file->maxlength) { } for (i = startPos, k = 0; k<(int)strlen(str); i++, k++) disk[i] = str[k]; printf(\"写入字符串长度大于该文件的总长度,写入失败\\n\"); system(\"pause\"); return; printf(\"该文件是只读文件,写入失败\\n\"); system(\"pause\"); return; printf(\"文件写入成功,请将该文件关闭\\n\"); system(\"pause\"); else { } } void fileFind() printf(\"没有找到该文件,请检查输入的文件名是否正确\\n\"); system(\"pause\"); { char fileName[10], command[50]; int i, k; printf(\" 输入文件名称:\"); fflush(stdin); gets(command); for (i = 0, k = 0; command[i] != '\\0'; i++, k++) fileName[k] = command[i]; fileName[k] = '\\0'; UFD *p, *q; q = userTable[userID].user; for (p = q->next; p != NULL; p = p->next) { } if (p) { } else { printf(\"没有找到该文件,请检查输入的文件名是否正确\\n\"); printf(\"********************************************\\n\"); printf(\"文件名:%s\\n\printf(\"文件长度:%d\\n\ printf(\"文件在存储空间的起始地址:%d\\n\printf(\"文件类型:%s\\n\ printf(\"创建时间:%s\\n\printf(\"********************************************\\n\"); system(\"pause\"); if (!strcmp(p->file->fileName, fileName)) break; } } system(\"pause\"); void fileChange() { char fileName[10], fileKind[10], command[50]; int i, k; fflush(stdin); printf(\" 输入文件名称和新的文件权限:\"); gets(command); for (i = 0, k = 0; command[i] != ' '; i++, k++) fileName[k] = command[i]; fileName[k] = '\\0'; for (k = i + 1, i = 0; command[k] != '\\0'; i++, k++) fileKind[i] = command[k]; fileKind[i] = '\\0'; UFD *p, *q; q = userTable[userID].user; for (p = q->next; p != NULL; p = p->next) { } if (p) { } else strcpy(p->file->fileKind, fileKind); printf(\"修改文件类型成功\\n\"); system(\"pause\"); if (!strcmp(p->file->fileName, fileName)) break; { } } void fileRename() { char fileName[10], fileRename[10], command[50]; int i, k; fflush(stdin); printf(\" 输入文件名称和新的文件名称:\"); gets(command); for (i = 0, k = 0; command[i] != ' '; i++, k++) fileName[k] = command[i]; printf(\"没有找到该文件,请检查输入的文件名是否正确\\n\"); system(\"pause\"); fileName[k] = '\\0'; for (k = i + 1, i = 0; command[k] != '\\0'; i++, k++) fileRename[i] = command[k]; fileRename[i] = '\\0'; UFD *p, *q; q = userTable[userID].user; for (p = q->next; p != NULL; p = p->next) { } if (p) { while (q->next) { if (!strcmp(q->next->file->fileName, fileRename)) if (!strcmp(p->file->fileName, fileName)) break; } } { } q = q->next; printf(\"您输入的文件名已存在,重命名失败\\n\"); system(\"pause\"); return; strcpy(p->file->fileName, fileRename); printf(\"重命名成功\\n\"); system(\"pause\"); else { } } void fileDir() { char userName[10], command[50]; int i, k; printf(\" 输入用户名称:\"); fflush(stdin); gets(command); for (i = 0, k = 0; command[i] != '\\0'; i++, k++) userName[k] = command[i]; printf(\"没有找到该文件,请检查输入的文件名是否正确\\n\"); system(\"pause\"); userName[k] = '\\0'; UFD *p; for (i = 0; i if (i == MaxUser) { } else { printf(\"******************************************************************* p = userTable[k].user->next; printf(\"没有找到该用户,请检查输入用户名是否正确\\n\"); system(\"pause\"); return; if (!strcmp(userTable[i].userName, userName)) { } k = i; break; ************\\n\"); printf(\"文件名 文件长度 文件在磁盘的起始地址 文件类型 创建时间\\n\"); for (; p != NULL; p = p->next) printf(\"%s %d %d %s %s\ p->file->fileName, p->file->maxlength, printf(\"******************************************************************* p->file->start, p->file->fileKind, asctime(p->file->timeinfo)); *************\\n\"); } } system(\"pause\"); void diskShow() { diskNode *p; int i = 0, unusedDisk = 0; printf(\"**************************************************************************\\n\"); printf(\" 盘块号 起始地址 容量(bit) 是否已被使用\\n\"); for (p = diskHead; p != NULL; p = p->next, i++) { if (p->useFlag == false) unusedDisk += p->maxlength; printf(\" %d %d %d %d\\n\ p->useFlag); } printf(\"***************************************************************************\\n\"); printf(\" 磁 盘 空 间 总 容 量 : 512*1024bit 已 使 用 : %dbit末使用:%dbit\\n\ system(\"pause\"); } void fileClose() { char fileName[10], command[50]; int i, k; printf(\" 输入文件名称:\"); fflush(stdin); gets(command); for (i = 0, k = 0; command[i] != '\\0'; i++, k++) fileName[k] = command[i]; fileName[k] = '\\0'; UFD *p, *q; q = userTable[userID].user; for (p = q->next; p != NULL; p = p->next) { } if (p) { } else { } } printf(\"没有找到该文件,请检查输入的文件名是否正确\\n\"); system(\"pause\"); p->file->openFlag = false; printf(\"%s 文件已关闭\\n\system(\"pause\"); if (!strcmp(p->file->fileName, fileName)) break; 4.实验结果 1、创建用户 2、登录用户 3、查看用户 4、删除用户 5、创建文件 6、删除文件 7、写入文件 8、查看文件内容 9、重命名 10、查看文件属性 11、查看用户文件 12、关闭文件 13、修改文件权限 14、查看磁盘使用情况 15、返回上级目录 5.实验过程中出现的问题及解决办法
因篇幅问题不能全部显示,请点此查看更多更全内容