文件系统实验报告
更新时间:2024-06-11 18:53:01 阅读量: 综合文库 文档下载
实验二 文件系统
实验报告
一.实验简介
本实验要求在假设的I/O 系统之上开发一个简单的文件系统,这样做既能让实验者对文件系统有整体了解,又避免了涉及过多细节。用户通过create, open, read 等命令与文件系统交互。文件系统把磁盘视为顺序编号的逻辑块序列,逻辑块的编号为0 至L-1。I/O 系统利用内存中的数组模拟磁盘。
实际物理磁盘的结构是多维的:有柱面、磁道、扇区等概念。I/O 系统的任务是隐藏磁盘的结构细节,把磁盘以逻辑块的面目呈现给文件系统。逻辑块顺序编号,编号取值范围为0 至L .. 1,其中L 表示磁盘的存储块总数。实验中,我们可以利用字符数组ldisk[L][B] 构建磁盘模型,其中B 表示每个存储块的长度。I/O 系统从文件系统接收命令,根据命令指定的逻辑块号把磁盘块的内容读入命令指定的内存区域,或者把命令指定的内存区域内容写入磁盘块。
我设计的文件系统拥有三个用户。
二.具体说明
1.文件系统的组织:磁盘的前k 个块是保留区,其中包含如下信息:位图和文件描述符。位图用来描述磁盘块的分配情况。位图中的每一位对应一个逻辑块。创建或者删除文件,以及文件的长度发生变化时,文件系统都需要进行位图操作。前k 个块的剩余部分包含一组文件描述符。每个文件描述符包含如下信息:
? 文件长度,单位字节
? 文件分配到的磁盘块号数组。该数组的长度是一个系统参数。在实验中我们可以把它设置为一个比较小的数,例如3。
2.目录:我们的文件系统中仅设置一个目录,该目录包含文件系统中的所有文件。除了不需要显示地创建和删除之外,目录在很多方面和普通文件相像。目录对应0 号文件描述符。初始状态下,目录中没有文件,所有,目录对应的描述符中记录的长度应为0,而且也没有分配磁盘块。每创建一个文件,目录文件的长度便增加一分。目录文件的内容由一系列的目录项组成,其中每个目录项由如下内容组成:
? 文件名
? 文件描述符序号
3.对文件的操作:
文件系统需提供如下函数;create, destroy, open, read, write。 ? create(filename): 根据指定的文件名创建新文件。 ? destroy(filename): 删除指定文件。
? open(filename): 打开文件。该函数返回的索引号可用于后续的read, write, lseek, 或close 操作。
? close(index): 关闭制定文件。
? read(index, mem_area, count): 从指定文件顺序读入count 个字节mem_area 指定的内存位
置。读操作从文件的读写指针指示的位置开始。
? write(index, mem_area, count): 把mem_area 指定的内存位置开始的count 个字节顺序写入指定文件。写操作从文件的读写指针指示的位置开始。
? lseek(index, pos): 把文件的读写指针移动到pos 指定的位置。pos是一个整数,表示从文件开始位置的偏移量。文件打开时,读写指针自动设置为0。每次读写操作之后,它指向最后被访问的字节的下一个位置。lseek 能够在不进行读写操作的情况下改变读写指针能位置。 ? directory: 列表显示所有文件及其长度。
三.实验过程
创建文件create:
此时显示文件中的文件:
文件的删除delete:
打开文件(open):
文件的写操作(write):
读文件(read):
关闭文件(close):
退出系统(exit):
四.实验代码
#include
typedef struct mdf{//MDF结构体 char username[20];//用户名 char filename[20];//文件名 struct mdf *next; }MDF;
typedef struct ufd{//UFD结构体 char filename[20];//文件名 int protect;//文件保护码 unsigned int length;//文件长度 struct ufd *next; }UFD;
typedef struct afd{//AFD结构体 char filename[20];//文件名 int protect;//文件保护码 unsigned int point;//文件读写指针 struct afd *next; }AFD;
MDF *pmdf;//全局链表头指针 UFD *pufd; AFD *pafd;
char UserUFD[20];//已经登陆成功的用户名
void initMDF()//初始化MDF表 { FILE *fp; pmdf= (MDF*)malloc(sizeof(MDF)); MDF *p = pmdf; if((fp = fopen(\打开MDF文件 puts(\ exit(1); } while (!feof(fp)){//把MDF文件中的内容装入链表 p->next = (MDF*)malloc(sizeof(MDF)); p = p->next; fscanf(fp, \ fscanf(fp, \ } p->next = NULL; fclose(fp); }
void printUFD()//打印MDF表 { UFD *p = pufd->next; puts(\文件名\\t\\t保护码\\t\\t文件长度\\n\ while (p){ printf(\ printf(\ printf(\ p=p->next; }
}
void initUFD(char *name)//初始化UFD表 { FILE *fp; pufd= (UFD*)malloc(sizeof(UFD)); UFD *p = pufd; if((fp = fopen(name, \ puts(\ exit(1); } while (!feof(fp)){//建立UFD链表 p->next = (UFD*)malloc(sizeof(UFD)); p = p->next; fscanf(fp, \ fscanf(fp, \ fscanf(fp, \ fgetc(fp); } p->next = NULL; fclose(fp); }
int checkuser()//检测登陆的用户名 { char username[20]; while(1){ puts(\请输入用户名: \\n\ scanf(\ MDF *p = pmdf; while(p){ if(strcmp(username, p->username) == 0){ strcpy(UserUFD, p->filename); initUFD(p->filename); printUFD(); return 1; } p= p->next; } puts(\同户名不存在\\n\
} }
void initAFD()//初始化AFD { pafd = (AFD*)malloc(sizeof(AFD)); pafd->next = NULL; }
bool create()//创建文件命令 { char filename[20]; UFD *p = pufd->next; AFD *pa = pafd; puts(\请输入要创建的文件名: \\n\ scanf(\ while (p){ if(strcmp(filename, p->filename) == 0){ puts(\此文件已经存在了!\\n\ return 0; } if(!p->next) break; p= p->next; } p->next = (UFD*)malloc(sizeof(UFD)); p=p->next; strcpy(p->filename, filename); p->protect = 2; p->length = 0; p->next = NULL; while(pa->next){//创建文件后加入到AFD pa=pa->next; } pa->next = (AFD*)malloc(sizeof(AFD)); pa = pa->next; strcpy(pa->filename ,filename); pa->protect = 2; pa->point = 0; pa->next = NULL;
return 1; }
bool _delete()//删除文件命令 { char filename[20]; puts(\请输入要删除的文件名: \\n\ scanf(\ UFD *p = pufd; UFD *temp; while (p->next){ if(strcmp(filename, p->next->filename) == 0){ temp = p->next; p->next = p->next->next; free(temp); printf(\文件%s删除成功!\\n\ return 1; } p= p->next; } puts(\要删除的文件不存在!\\n\ return 0; }
bool open()//打开文件命令 { char filename[20]; unsigned int protect; puts(\请输入要打开的文件名: \\n\ scanf(\ puts(\请输入要打开的文件保护类型: \\n\ scanf(\ UFD *p = pufd->next; AFD *pa = pafd->next; while (pa){ if(strcmp(filename, pa->filename) == 0){ printf(\文件%s已经打开!\\n\ return 1; } if(!pa->next) break;
pa = pa->next; } if(!pa) pa=pafd; while (p){ if(strcmp(filename, p->filename) == 0){ pa->next = (AFD*)malloc(sizeof(AFD)); pa = pa->next; strcpy(pa->filename , p->filename); pa->protect = protect; if(protect == 1) pa->point = 0; else pa->point = p->length; pa->next=NULL; printf(\文件%s已经打开!\\n\ return 1; } p= p->next; } puts(\要打开的文件不存在!\\n\ return 0; }
void close()//关闭文件命令 { char filename[20]; UFD *pu = pufd->next; puts(\请输入要关闭的文件名: \\n\ scanf(\ AFD *p = pafd; AFD *temp; while (p&&p->next){ if(strcmp(filename, p->next->filename) == 0){ temp = p->next; p->next = p->next->next; if(temp->protect == 2){ while(pu){ if(strcmp(temp->filename, pu->filename) == 0){ pu->length =temp->point; break;
} pu = pu->next; } } free(temp); printf(\文件%s关闭成功!\\n\ return ; } p= p->next; } puts(\要关闭的文件没有被打开!\\n\}
int read()//读文件命令 { char filename[20]; unsigned int length; AFD *p = pafd->next; puts(\请输入要读的文件名: \\n\ scanf(\ puts(\请输入要读的长度\\n\ scanf(\ while (p){ if(strcmp(filename, p->filename) == 0){ p->point += length; printf(\文件%s读取成功!\\n\ return 1; } p= p->next; } puts(\读取失败文件没有打开过!\\n\ return 0; }
int write()//写文件命令 { char filename[20]; unsigned int length; AFD *p = pafd->next; puts(\请输入要写的文件名: \\n\ scanf(\
while (p){ if(strcmp(filename, p->filename) == 0){ if(p->protect != 2){ printf(\文件%s不可写!\\n\ return 0; } puts(\请输入要写的长度\\n\ scanf(\ p->point += length; printf(\文件%s写入成功!\\n\ return 1; } p= p->next; } puts(\写入失败文件没有打开过!\\n\ return 0; }
void destroy()//释放内存 { MDF *pm = pmdf; while(pm){ pmdf = pmdf->next; free(pm); pm = pmdf; } AFD *pa = pafd; while(pa){ pafd = pafd->next; free(pa); pa = pafd; } UFD *pu = pufd; while(pu){ pufd = pufd ->next; free(pu); pu = pufd; } }
void saveUFD()//保存UFD文件 {
FILE *fp; UFD *p = pufd->next; if((fp = fopen(UserUFD, \ puts(\ exit(1); } while (p){ fprintf(fp, \ fprintf(fp, \ fprintf(fp, \ fprintf(fp, \ p=p->next; } fclose(fp); }
void exit()//推出系统 { AFD *pa = pafd->next; UFD *pu = pufd->next; while(pa){ if(pa->protect == 2){ while(pu){ if(strcmp(pa->filename, pu->filename) == 0){ pu->length = pa->point; break; } pu = pu->next; } } pa =pa->next; } saveUFD(); printUFD(); destroy(); }
void operate()//命令识别 { while(1){ char command[20]; char name[][8] = {\ puts(\请输入命令: \\n\ scanf(\ if(strcmp(command, name[0] ) == 0) create(); else if(strcmp(command, name[1] ) == 0) _delete(); else if(strcmp(command, name[2] ) == 0) open(); else if(strcmp(command, name[3] ) == 0) close(); else if(strcmp(command, name[4] ) == 0) read(); else if(strcmp(command, name[5] ) == 0) write(); else if(strcmp(command, name[6] ) == 0){ exit(); return; }else puts(\无效命令,请重新输入:\\n\ } }
void print() { puts(\文件系统\\n\ puts(\使用说明***:\\n\ puts(\本文件系统共有三个用户分别是user1 user2 user3\\n\\ 系统命令有create, delete, open, close,read, write,exit\\ \\nexit----------------------------------------退出系统\}
int main() { print(); initMDF(); checkuser(); initAFD();
}
operate();//命令识别
return 0;
正在阅读:
文件系统实验报告06-11
最新小学三年级音乐下册第三单元教案精编版04-08
人教版八年级上册英语第十单元练习题06-02
听雨作文500字07-11
在教育局学习实践科学发展观分析检查阶段推进会上的讲话-精品文案范文 11-16
江西理工大学绩效工资实施方案(修订)12-08
八大技巧轻松记忆实用短语11-13
小鸡历险记作文450字07-10
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 实验
- 文件
- 报告
- 系统
- 全国计算机等级考试二级笔试试卷基础部分和C语言程序设计1998年4
- 拒绝零食倡议书
- 临沧生物制药的调查报告
- 我国房地产市场的现状、问题及对策分析
- 火灾自动报警系统毕业论文中英文资料外文翻译文献
- 2018高考语文各地模拟卷实用类非连续性文本阅读60篇(附答案解释)
- 生产质量管理规范文件例1
- Matlab图像处理与应用(第7章)
- 施工图常见疑难问题解析汇编-最终建筑版
- 陕西省师大附中、西工大附中2010-2011学年高三数学第一次模拟考
- 地方立法中部门利益之消解路径探析
- 2018年江苏省南通市高考数学模拟试题(解析版)
- 碎片化阅读四辩辩论稿
- 建构主义下大学英语视听说零课时自主性学习研究-最新教育资料
- BESTV百视通机顶盒(IPTV)设置
- 四复习1
- 企业战略管理在线测试
- 有效文件清单-完整
- 模块二必选案例分析
- 2004年4月全国计算机等级考试二级VF笔试试题