文件系统实验报告
更新时间:2023-10-07 04:59: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;
正在阅读:
文件系统实验报告10-07
年产100万只汽车铝合金轮毂、年产1融资投资立项项目可行性研究报06-23
安徽省当涂市名校2018届九年级数学上学期第一次月考试题新人教版05-30
5W2H分析法08-31
桃李不言,下自成蹊06-10
新安志卷九、十及附05-09
中秋节的日记200字02-24
2017年日历 - 含阴历(记事可打印完美修正版)07-01
论孙舞阳“新时代女性”形象修改版09-14
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 实验
- 文件
- 报告
- 系统
- lingo习题 - 图文
- 山东大学文学考研历年真题
- 上海交通大学大学物理A类2008年试卷及答案
- 2017年静疗专业考试题库71题附答案
- 上海交通大学物理竞赛试题解答
- 第三章 连续时间信号与系统的频域分析
- 汽车维修工中级理论知识试卷(含参考答案)
- 查明矿产资源储量登记书
- 高考最难考的十所大学
- 作风建设整顿心得体会
- bigbang 谎言 中韩歌词对照
- 可控硅进料检验作业指导书 A3 - 图文
- (北大)军事理论笔记整理
- 明代九边镇守内官考论
- 2012-2013学年江苏省南通市海门县海门镇八年级(上)期末数学试卷
- 毕业论文致谢词 - 15
- 物理化学第二版习题答案
- 第十一课 先生教我抛物线
- 职业调查报告范文-范文
- 2014电大《项目管理》形成性考核册答案(四川广播电视大学)