【操作系统】实验:文件系统

目录

一、实验目的

二、实验要求

三、实验步骤

四、核心代码

五、记录与处理

六、思考

七、完整报告和成果文件提取链接


一、实验目的

1、掌握文件系统的基本结构和文件系统的管理方法

2、加深对两级文件目录认识和理解

3、对文件操作的系统命令实质内容和执行过程深入理解

二、实验要求

1、文件系统结构:文件系统通常由文件、目录、文件描述符、i节点、位图等构成。其中,文件是数据的逻辑组织形式,目录是一种树形结构的组织形式,文件描述符是内核与文件之间的连接,i节点存储文件的元数据包括文件大小、创建时间、权限等信息,位图用于记录文件系统中的空闲块。

2、文件系统的操作:文件系统主要有创建、删除、读取、写入、查找等操作。由于文件系统是为用户和应用程序服务的,其操作方式应该是方便、简单、高效的。其中,查找是文件系统操作中的关键步骤,它需要在目录树中查找到指定的文件或目录。

3、文件系统的性能优化:为了提高文件系统的性能和可靠性,需要采取一些优化策略。例如采用缓存来减少磁盘IO访问,采用磁盘碎片整理功能来提高磁盘空间利用率等。

4、文件系统的安全性:安全性是文件系统不可缺少的部分,这包括对文件、目录的访问权限和保护措施等。文件系统应该有一套完整的权限管理系统,以确保用户只有相应的权限才能读取或操作文件。

三、实验步骤

1.创建用户;

2.登录用户;

3.进行文件操作,并实现相应的效果;

4.退出系统。

四、核心代码

//创建文件(创建索引)
void create() {int state = 0;										//标记是否正常创建文件,后面所有state均为标记,标记功能是否正常运行char write_state = 'N';                             //写入标记,创建完文件询问是否需要直接写入char Delete_state = 'N';                            //删除标记,空间不足,询问是否删除for (int i = 0; i < MaxsizeOfIndex; i++) {if (f[i].empty == 0) {							//找到空区域f[i].empty = 1;								//标记为已用cout << "请输入文件名:";					//输入想要创建的文件的名称 cin >> f[i].name;							state = 1;                                  //标记为正常创建cout << "是否要输入文件内容(Y/N):";		//询问创建之后要不要输入cin >> write_state;if (write_state == 'Y') {cout << "请输入文件内容:";             //为了不用重复输入文件名,这里没有调用write(),感觉可以使用同名函数cin >> d[i].disk;}break;}} if (state == 0) {									//没有空区域,询问是否删除cout << "没有剩余空间,删除文件(Y/N):";cin >> Delete_state;if (Delete_state == 'Y') {                    Delete();}}}//删除文件(删除索引)
void Delete() {											//将此处标记为空,删除索引,不用删除内容char name[10];int state = 0;char Delete_state;cout << "请输入想删除的文件名:";					//输入需要删除的文件名cin >> name;for (int i = 0; i < MaxsizeOfIndex; i++) {if (strcmp(f[i].name, name) == 0 && f[i].empty == 1) {	//找到同名文件,且块为占用块f[i].empty = 0;								//标记为空cout << "删除成功" << endl;state = 1;									//标记正常删除文件索引break;}} if (state == 0) {                                   //未正常删除cout << "删除失败,请输入正确的文件名,重新输入(Y/N): ";cin >> Delete_state;if (Delete_state == 'Y') {Delete();}}
}//打开文件
void open() {char name[10];char write_state;char empty_cmp[2000] = { '\0' };cout << "请输入文件名要打开的:";								//输入想要打开的文件名 cin >> name;for (int i = 0; i < MaxsizeOfIndex; i++) {if (strcmp(f[i].name, name) == 0 && f[i].empty == 1) {		//名字相同,且块不为空,因为删除的时候,不会删除其中的名字,只是标记为空if (strcmp(d[i].disk, empty_cmp) == 0) {				//块内无内容,询问要不要先写入cout << "文件内容为空,请先写入文件,写入(Y/N):"<<endl;cin >> write_state;if (write_state == 'Y') {write();}}else {													//块内有内容,直接读出cout << "文件内容为:" << endl;cout << d[i].disk << endl;}break;}}
}//写入文件
void write() {char name[10];int state = 0;char write_state = 'N';cout << "请输入文件名:";cin >> name;for (int i = 0; i < MaxsizeOfIndex; i++) {if (strcmp(f[i].name, name) == 0 && f[i].empty == 1) {		//找到已经建立索引的文件cout << "请输入文件内容:";cin >> d[i].disk;										//将内容写入到对应的磁盘块中state = 1;												//标记为正常写入break;}}if (state == 0) {												//写入失败cout << "写入失败,请输入正确的文件名,重新输入(Y/N): ";cin >> write_state;if (write_state == 'Y') {write();}}
}//添加文件内容
void write_add() {												//在文件最后添加内容char content[100];char name[10];int char_site;int size;cout << "请输入想操作的文件:";cin >> name;cout << "想要添入的内容:";cin >> content;cout << "请输入想添加到的位置:";cin >> char_site;for (int i = 0; i < MaxsizeOfIndex; i++) {if (strcmp(f[i].name, name) == 0 && f[i].empty == 1) {int temp = i;for (int i = sizeof(d[temp].disk)-1; i > char_site ; i--) {    //向后挪出空间d[temp].disk[i + strlen(content)] = d[temp].disk[i];}for (int i = 0; i < strlen(content); i++) {   //这里不能使用sizeof,因为sizeof包括了最后的'\0',会导致输出认为到这里就结束了d[temp].disk[i + char_site] = content[i];}}}cout << "写入成功";
}//删除文件内容
void delete_content() {char name[10];int state = 0;char Delete_state = 'N';cout << "请输入想要删除的文件内容的文件名:";cin >> name;for (int i = 0; i < MaxsizeOfIndex; i++) {					if (strcmp(f[i].name, name) == 0 && f[i].empty == 1) {memset(d[i].disk, '\0', sizeof(d[i].disk));			//把磁盘块设置为空cout << "删除完成";									//正常删除state = 1;break;}}if (state == 0) {											//删除失败cout << "删除失败,请输入正确的文件名,重新输入(Y/N): "<<endl;cin >> Delete_state;if (Delete_state == 'Y') {delete_content();}}
}void show_file_system() {int state = 0;cout << "文件号" << "	" << "文件名" <<endl;for (int i = 0; i < MaxsizeOfIndex; i++) {if (f[i].empty == 1) {state = 1;cout << i + 1 << "	" << f[i].name << endl;}}if (state == 0) {cout << "无文件" << endl;}
}

五、记录与处理

运行结果:

创建一个文件名为a,序号为1,并写入文件内容为abc

读文件,显示了文件a的内容与序号:

重新写入文件并查看文件内容:发现a文件内容以及变成def

删除文件a,显示成功!

也可以在目录中同时添加多个文件进行读写删除操作:

六、思考

1. 实验总结与心得:通过该实验,我深入了解了文件系统的基本结构、管理方法以及两级文件目录的概念和应用。我掌握了文件系统的基本结构和管理方法,通过创建和管理文件、目录等操作,我对文件系统的构成有了更加直观的认识。了解到文件系统中的文件、目录、文件描述符、节点和位图等元素如何协同工作,共同维护数据的组织和存储。

2.同时也加深了我对两级文件目录的认识和理解:实验使我明白了两级文件目录的重要性和实用性,尤其是在文件查找过程中,两级目录结构提高了检索效率。更深入理解了文件操作的系统命令实质内容和执行过程:通过实际操作文件的创建、删除、读取、写入和查找等命令,我不仅学会了如何使用这些命令,更重要的是理解了它们背后的执行机制和原理。

 3. 操作系统的文件系统结构是由多个层次组成的,包括文件的逻辑结构、物理结构以及文件系统的全局结构等。文件系统是操作系统中用于管理和存储文件信息的软件机构,它负责在存储介质上组织文件的方法,并为用户提供文件的存储、检索、更新等功能。

从逻辑结构的角度来看,文件系统定义了文件的数据组成和属性,以及如何通过目录结构来访问和管理这些文件。文件可以是有结构的,如数据库中的记录,或者是无结构的流式文件。

从物理结构的角度来看,文件系统负责管理文件在外存上的存储方式,包括连续分配、链接分配和索引分配等方式。这些方式各有优缺点,例如,连续分配利于快速访问但容易导致碎片;链接和索引分配则更灵活但访问速度可能较慢。

4. 文件系统的操作主要包括创建文件、删除文件、打开文件、关闭文件、读文件和写文件。这些操作是操作系统中文件管理的基本功能,它们允许用户和应用程序对文件进行有效的管理和使用。

5. 在进行文件操作时,用户需要注意以下几点以确保数据的安全和完整性:权限验证:确保对文件的操作符合系统的安全策略和用户的权限设置。错误处理:在文件操作过程中,应该正确处理可能出现的错误和异常情况,如文件不存在、权限不足等。数据同步:在进行写操作时,确保数据已经被正确地同步到磁盘上,防止数据丢失。

总而言之,操作系统中的文件系统操作是用户与文件数据交互的基础,通过这些操作,用户可以方便地管理和访问文件数据。了解和掌握这些基本操作对于有效使用计算机系统至关重要。

6.总的来说,这次实验不仅让我掌握了文件系统的基本知识和操作技能,更重要的是培养了我解决问题的能力和实践创新的精神。通过亲身实践,我更加深刻地理解了理论知识的应用价值,为我日后的学习和研究工作奠定了坚实的基础。

七、完整报告和成果文件提取链接

链接:https://pan.baidu.com/s/1UbP6729pCluscVW0_9oI8w?pwd=1xki 
提取码:1xki 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【9月持续更新】国内ChatGPT-4o中文镜像网站整理~

以前我也是通过官网使用&#xff0c;但是经常被封号&#xff0c;就非常不方便&#xff0c;后来有朋友推荐国内工具&#xff0c;用了一阵之后&#xff0c;发现&#xff1a;稳定方便&#xff0c;用着也挺好的。 最新的 GPT-4o、4o mini&#xff0c;可搭配使用~ 1、 最新模型科普&…

Revit 2025.2新增功能及安装教程和下载

Revit 2025.2 带来了许多新功能和改进&#xff0c;增强了BIM工作流程。以下是主要的新功能&#xff1a; 项目浏览器标签功能&#xff1a;新增的标签功能使得用户可以通过标签过滤浏览器列表&#xff0c;这对大型项目非常有用&#xff0c;减少了滚动和点击次数​。 链接管理对…

若依将登录用户的userId自动加载到查询中

点击搜索&#xff0c;会将登录用户的userId作为搜索条件&#xff0c;去查询。 新版本自动存储了userId&#xff0c;我们不用改&#xff0c;只要知道如何引用。 前端使用 在对应的vue文件&#xff0c;查询queryParams 加查询的值 然后参考他的 添加store import store from &…

PDM系统多少钱一般?一文详细了解三品PDM系统报价

在现代企业的数字化转型过程中&#xff0c;PDM产品数据管理软件扮演着至关重要的角色。PDM软件是一种应用于管理产品全生命周期的软件工具&#xff0c;涵盖了产品设计、工艺流程、生产制造、销售和维护等多个环节。随着技术的不断进步和市场的日益竞争&#xff0c;PDM软件的价格…

零基础学PLC的指令-沿指令(2)

扫描操作数的信号上升沿&#xff1a; 在触点分配的 "IN" 位上检测到正跳变&#xff08;0->1&#xff09;时&#xff0c;该触点的状态为 TRUE。该触点逻辑状态随后与能流输入状态组合以设置能流输出状态。P 触点可以放置在程序段中除分支结尾外的任何位置。 扫描…

AOP思想

什么是AOP AOP&#xff1a;Aspect oriented programming 面向切面编程&#xff0c;AOP 是 OOP&#xff08;面向对象编程&#xff09;的一种延续。 解决&#xff1a;在不改变原有业务逻辑的情况下&#xff0c;增强横切逻辑代码&#xff0c;根本上解耦合&#xff0c;避免横切逻…

大规模预训练语言模型的参数高效微调

人工智能咨询培训老师叶梓 转载标明出处 大规模预训练语言模型&#xff08;PLMs&#xff09;在特定下游任务上的微调和存储成本极高&#xff0c;这限制了它们在实际应用中的可行性。为了解决这一问题&#xff0c;来自清华大学和北京人工智能研究院的研究团队探索了一种优化模型…

四川凭什么能成为中国的战略腹地?

四川因其独特的地理位置、丰富的资源、雄厚的工业基础、庞大的人口及复杂多样的地形等&#xff0c;就在今年1月份的时候&#xff0c;国务院正式批复了一份重磅文件&#xff0c;四川被国务院正式定位为战略腹地&#xff0c;即全体中国人的退路和国家的备份省。 那么四川凭什么能…

STM32(F103ZET6)第四课:串口中断

目录 需求一、串口中断过程与作用二、中断实现流程1.中断优先级分组2.配置串口中断 三、需求的实现 需求 1.设备上电后四个灯灭。 2.按下KEY1&#xff0c;LED1灯亮&#xff0c;同时串口发送“LED1灯亮”。 3.再次按下KEY1&#xff0c;LED1灯灭&#xff0c;同时串口发送“LED1灯…

android studio 新建java工程, 安卓新建项目,android studio2024 如何新建java项目

主要解决&#xff0c;新增安卓工程&#xff0c;没有java选项 1. 点击左上角FIle -> New -> 2. 选择 no activity 选项&#xff0c; 然后next 3. langua 就可以选择java 了。name自己定义项目名称&#xff0c;项目存储地址&#xff0c;包名。 配置完成选择finish. 4. fin…

Rust Web框架怎么选?

在最新的web框架基准测试中 https://www.techempower.com/benchmarkshttps://web-frameworks-benchmark.netlify.app/result?lrust 除去一些没有发布分支或者已经很少维护或者不是rust写的框架外&#xff0c;可以看到Axum、Actix-web是目前性能最好的两款后端框架&#xff0…

python,json数据格式,pyecharts模块,pycharm中安装pyecharts

json数据格式 JSON是一种轻量级的数据交互格式 可以按照JSON指定的格式去组织和封装数据 JSON本质上是一个带有特定格式的字符串 主要功能&#xff1a; json就是一种在各个编程语言中流通的数据格式&#xff0c;负责不同编程语言中的数据传递和交互. 类似于&#xff1a; 国…

手撕python之基本数据类型以及变量

​​​​​​1.基础概念 python就是将不同的数据划分成了不同的类型 就像我们生活中的数据有数字、字符等数据一样 小知识点&#xff1a; 注释&#xff1a;# 全体注释&#xff1a;AltF3 取消注释&#xff1a;AltF4 2.数值类型 数值类型概括 数值类型分为三种&#xff…

JavaWeb JavaScript ⑤ JS常见对象

某一瞬间&#xff0c;是平静的自我接纳 —— 24.8.27 一、数组 1.创建数组的四种方式 ① new Array() 创建空数组 ② new Array(5) 创建数组时给定长度 ③ new Array(ele1,ele2,…,elen); 创建数组时给定元素值 ④ [ele1,ele2,…,elen] 相当于…

【STM32单片机_(HAL库)】3-4-3【中断EXTI】【智能排队控制系统】排队系统代码框架搭建

3-4-2系统框图及硬件接线 3.软件 beep、exti、gate、LCD1602、led、tasks驱动文件添加GPIO常用函数中断配置流程main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "tasks.h" #include "gate.h"…

腾讯浙大提出定制化视频生成框架CustomCrafter,只需通过少量图像就可以完成高质量视频生成!

腾讯联合浙大提出了一种定制化视频生成框架-CustomCrafter&#xff0c;它能够基于文本提示和参考图像生成自定义视频&#xff0c;同时保留运动生成和概念组合的能力。通过设计一系列灵活的模块&#xff0c;使得模型实现了无需额外视频&#xff0c;通过少量图像学习&#xff0c;…

嵌入式:用J-Link Commander和J-Flash进行Flash编程的区别

相关阅读 嵌入式https://blog.csdn.net/weixin_45791458/category_12768532.html?spm1001.2014.3001.5482 J-Link Commander和J-Flash都是用于Flash编程的工具&#xff0c;但它们的功能和应用场景有所不同。以下是两者的区别&#xff1a; J-Link Commander: 类型: 命令行工…

机械学习—零基础学习日志(如何理解概率论4)

当已知一个概率&#xff0c;求解另外一个函数的概率。以下是离散型的概率计算方法。 这里是连续型的&#xff0c;已知概念密度&#xff0c;计算对应的另外一个函数的概率。 这里需要求解对应的原始函数。 这里我们做一道练习题。 《概率论与数理统计期末不挂科|考研零基础入门…

什么是Redis大key问题?如何解决?

目录 Key多大算大呢&#xff1f; 识别big key 处理big key Big Key是Redis中存储了大量的数据的Key&#xff0c;不要误以为big key只是表示Key的值很大&#xff0c;他还包括这个Key对应的value占用空间很多的情况&#xff0c;通常在String、list、hash、set、zset等类型中出…

使用Vue创建cesium项目模版该如何选择?

目录 问题描述模版说明及选用建议小结 问题描述 刚入手这个项目&#xff0c;什么都是一知半解。使用Vue,创建Cesium项目的时候&#xff0c;提示需要选择一个模版&#xff08;如下图所示&#xff09;&#xff0c;该如何选择项目模版选&#xff0c;总结如下&#xff1a; 模版说明…