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

目录

一、实验目的

二、实验要求

三、实验步骤

四、核心代码

五、记录与处理

六、思考

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


一、实验目的

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.rhkb.cn/news/410264.html

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

相关文章

Python实现等距映射(ISOMAP)降维算法

目录 Python实现等距映射&#xff08;ISOMAP&#xff09;降维算法的博客引言ISOMAP算法原理ISOMAP的优势与局限Python实现ISOMAP算法1. 创建ISOMAP类2. 在瑞士卷数据集上应用ISOMAP3. 结果分析 总结运行结果 Python实现等距映射&#xff08;ISOMAP&#xff09;降维算法的博客 …

NS2582 同步升压双节锂电池充电管理 IC

1 特性  最大 2A 输出同步开关型升压充电器  升压效率可高达 90% 以上  内置电池短路 / 涓流 / 恒流 / 恒压模式  0.5% 电池恒压模式电压精度  支持 LED 充电状态指示  支持充电电流外部可调  支持输入适配器 DPM 功能  外置 EN 使能…

探索Python的Excel力量:openpyxl库的奥秘

文章目录 探索Python的Excel力量&#xff1a;openpyxl库的奥秘背景&#xff1a;为什么选择openpyxl&#xff1f;库简介&#xff1a;openpyxl是什么&#xff1f;安装指南&#xff1a;如何安装openpyxl&#xff1f;快速上手&#xff1a;五个基本函数实战演练&#xff1a;三个应用…

Adobe Dreamweaver(DW)网页代码编辑器win/mac软件安装下载

一、Adobe DW软件概览 1.1 DW软件简介 Adobe Dreamweaver&#xff08;简称DW&#xff09;是一款功能强大的网页代码编辑器&#xff0c;由Adobe公司开发并维护。其全称为“Adobe Dreamweaver”&#xff0c;中文译为“梦想编织者”。DW集网页制作和管理网站于一身&#xff0c;支…

Ubuntu系统使用Docker部署中文版trilium并实现远程编辑笔记

文章目录 前言1. 安装docker与docker-compose2. 启动容器运行镜像3. 本地访问测试4.安装内网穿透5. 创建公网地址6. 创建固定公网地址 前言 今天和大家分享一款在G站获得了26K的强大的开源在线协作笔记软件&#xff0c;Trilium Notes的中文版如何在Linux环境使用docker本地部署…

代码随想录第十九天 | 110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和,222. 完全二叉树的节点个数

110. 平衡二叉树 第一想法&#xff1a;首先要明确平衡二叉树的定义&#xff1f;左右节点的高度差不超过1&#xff1f;不会概念感觉无法下手... 返回参数返回int,为了标记已经不是平衡二叉树&#xff0c;用-1作标记 int traversal(TreeNode* root){if(rootnullptr) return 0;…

量化需求的业务价值 常见6种方法

量化需求的业务价值可以帮助项目团队更好地理解需求的重要性&#xff0c;并据此做出明智的决策。如果没有明确的量化目标&#xff0c;团队难以做出基于数据的决策&#xff0c;可能导致项目方向模糊&#xff0c;资源分配不当&#xff0c;导致项目进度难以把控&#xff0c;延误交…

平安银行“平安财富杯”高尔夫青少年冠军赛盛大举行,各组冠军精彩角逐实力尽显

今年夏天&#xff0c;巴黎体育盛会聚集了全球目光&#xff0c;中国选手林希妤斩获女子高尔夫球铜牌&#xff0c;追平中国女子高尔夫球历史最佳奥运战绩&#xff0c;让球迷大呼过瘾。奥运会结束后&#xff0c;比赛的热情在中原大地继续上演。8月22日&#xff0c;2024年平安银行“…

Shopify/shopline等独立站paypal快速提现到国内银行卡

做shopify/shopline/shopyy/shoplazza独立站用得最多的收款方式为paypal。 下面介绍如何把paypal里面的资金提现到我们国内银行卡&#xff0c;收款工具是GeeWallet。 1、注册GeeWallet注册入口 2、打开链接&#xff0c;填入手机号或者邮箱&#xff0c;点击立即注册 3、在注册…

【软件使用-MEGA】报错及解决方法

报错1&#xff1a;Error: MEGA has detected duplicate taxa labels. (in line 370) **************************************************************************** ; Please note the following important messages: ; **********************************…

学习之数据库相关概念

数据库相关概念 主流的关系型数据库管理系统&#xff1a;

如何使用ssm实现基于jsp的快递管理系统的开发

TOC ssm226基于jsp的快递管理系统的开发jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规…

力扣刷题(复习版)

文章目录 题目&#xff1a;最大重复子字符串题解 题目&#xff1a; 面试题 16.07. 最大数值题解 题目&#xff1a; 最大字符串配对数目题解 题目&#xff1a; 字符串中第二大的数字题解 题目&#xff1a; 统计最大组的数目题解 题目&#xff1a; 删除每行中的最大值题解 总结 题…

Commons Lang库中,StringUtils.isBlank()和StringUtils.isEmpty()区别

在Apache Commons Lang库中&#xff0c;StringUtils.isBlank()和StringUtils.isEmpty()方法都是用来判断字符串是否为空或者空白的。它们的主要区别在于处理空格的方式上。 StringUtils.isEmpty(String str): 这个方法会返回true当字符串为null或者长度为0时。也就是说&#xf…

酸敏感多肽在药物递送方面的作用机制及其应用

摘要: 作为一类新型的递送载体&#xff0c;多肽具有丰富的生物活性、较低的免疫原性及良好的生物相容性&#xff0c;近年来利用多肽递送药物或基因的研究得到广泛关注。其中&#xff0c;具有酸敏感性的多肽&#xff0c;在肿瘤微环境或溶酶体的弱酸性条件下可以产生二级结构的改…

【bug】可图文生图模型 KolorsPipeline IndexError: list index out of range

【bug】可图文生图模型 KolorsPipeline IndexError: list index out of range 环境 linux diffusers 0.30.0问题详情 报错详情 from diffusers import KolorsPipelineTraceback (most recent call last):File "Kolors/demo.py", line 6, in <module>pi…

Circuitjs 利用标签(label)简化电路连线

在使用 circuitjs 绘制电路的过程中, 一旦电路变得复杂, 连线众多, 然后各种交叉就不可避免, 给人一种凌乱的感觉, 而某些跨越长距离的连线连接起来也特别麻烦, 后续如果要调整也特别繁琐. 为解决这些问题, 需要引入一种 虚拟连接 的方式, 简单讲就是在要连接的两头用同样的名…

Web-ssrfme

文章目录 环境分析攻击 环境 首先下载资源包&#xff0c;Ubuntu通过docker拉取环境。 docker-compose up -d分析 <?php highlight_file(__file__); function curl($url){ $ch curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, 0);e…

Zombie Slayer(僵尸枪手第三人称射击模板)

特征: -3个独特的玩家。 -4个独特的僵尸。 -三种类型的武器。手枪、突击步枪和手榴弹。 -2个独特的地点。墓地。 -武器升级系统。 易于添加新武器、等级、敌人。 下载:​​Unity资源商店链接资源下载链接 效果图:

网络优化2|最小生成树|Kruskal|Prim|Matlab

最小生成树问题 树 连通图 G ( V , E ) G(V,E) G(V,E)&#xff0c;若G中不含任何回路&#xff0c;则称G为树。 ∣ V ∣ 1 |V |1 ∣V∣1时称之为平凡树 生成树 G ( V , E ) G(V,E) G(V,E)&#xff0c;若G的一个生成子图是一棵树&#xff0c;则称之为G的一棵生成树&#…