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

news2024/9/22 4:05:03

目录

一、实验目的

二、实验要求

三、实验步骤

四、核心代码

五、记录与处理

六、思考

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


一、实验目的

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.coloradmin.cn/o/2078989.html

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

相关文章

python例子:使用pygame实现五彩烟花

作品介绍 作品名称&#xff1a;使用pygame实现五彩烟花 开发环境&#xff1a;PyCharm 2023.3.4 python3.7 用到的库&#xff1a;pygame、random、sys、math 作品简介&#xff1a;该实例是一个使用 Pygame 库实现的烟花效果模拟程序。 实现过程 一、初始化Pygame pygame.…

如何在没有密码的情况下从 iPad 中删除 MDM?100% 工作

如果您遇到已使用远程管理锁恢复的 iPad 或 iPhone&#xff0c;您将需要远程管理器的登录信息。 从 iPad 中删除 MDM可能很困难&#xff0c;尤其是在您没有正确的权限的情况下。在寻求帮助时&#xff0c;许多客户访问 Apple 的官方论坛&#xff0c;却发现问题并不总是容易解决。…

java中的原子性

在Java中&#xff0c;原子性&#xff08;Atomicity&#xff09;是并发编程中的一个核心概念&#xff0c;指的是一个或多个操作在中间状态对其他线程不可见&#xff0c;且不可被线程调度机制中断的性质。一个原子操作要么全部执行成功&#xff0c;要么完全不执行&#xff0c;不会…

第136天:内网安全-横向移动资源约束委派

利用条件 首先是dc域控主机必须是win2012以上的主机 其次是域内有一个账户&#xff0c;可以同时登录两台主机 利用 jie 可以登录 win2008 也可以登录 win7 资源委派不需要设置委派&#xff0c;默认即可 实验复现 复现环境 通过网盘分享的文件&#xff1a;136-xiaodi.local…

天宝TBCTrimble Business Center中文版本下载安装使用介绍

天宝TBC&#xff1a;测绘之道&#xff0c;尽在其中 引言 昔日杜甫&#xff0c;忧国忧民&#xff0c;今朝我辈&#xff0c;测绘天下。天宝TBC&#xff0c;乃测绘之利器&#xff0c;助我等行走于山川河流之间&#xff0c;绘制天地之图。此文将以杜甫之笔&#xff0c;述说TBC之妙…

C_05_编译4阶段

c语言编译的4个阶段&#xff1a;预处理、 编译、 汇编、 链接 预处理阶段会在源代码中查找预编译指令&#xff0c;其中主要是头文件展开&#xff08;include)&#xff0c;宏定义&#xff08;defind&#xff09;&#xff0c;选择性编译&#xff08;ifdef&#xff09;三种指令 预…

【ArcGIS/GeoScene Pro】离线许可归还不了

问题&#xff1a; 解决方案&#xff1a; 将一下项置空即可&#xff0c;让后重新获取许可信息

网络安全售前入门01——产品了解

目录 1.概述 2.常见网络安全产品 2.1下一代防火墙&#xff08;NGFW&#xff09; 3.后续 1.概述 为方便初入网络安全售前工作的小伙伴了解网安行业情况&#xff0c;我制作一系统售前入门&#xff08;安全产品&#xff0c;安全服务&#xff0c;法律法规等&#xff09;介绍&am…

AI创新,DataOps聚能 | 白鲸开源DTCC共话DataOps新篇章

近日&#xff0c;由IT168联合旗下ITPUB、ChinaUnix两大技术社区主办的第15届中国数据库技术大会&#xff08;DTCC 2024&#xff09;隆重召开。大会以“自研创新 数智未来”为主题&#xff0c;吸引了数百位行业专家和广大数据领域从业者共聚这场年度数据库技术交流盛宴&#xff…

vs2019 C++ 无法定位程序输入点于动态链接库

问题 一个项目一段时间没运行后&#xff0c;再运行报以下错误&#xff1a; 无法定位程序输入点??0lnferenceEngineExceptiondetailslnferenceEngine QEAAAEBV? b a s i c s t r i n g D U ? basic stringDU? basicstringDU?char traitsDstd v?$allocatorD2 stdHOZ 于动…

解决 python import 报错问题

需求问题描述 期望用Python写工具&#xff0c;转换excel内容合并到xml中&#xff0c;需要用到 openpyxl & lxml 库&#xff0c;因此需要安装。 import openpyxl 提示报错&#xff0c;但是没有像java代码的解决方案推荐&#xff0c;即无法直接导包。 分析记录 Note&#…

React antd 表格嵌套表格(可展开)

注意&#xff1a; 采用的是React antDsign 4.x版本 实现效果 代码实现 import { Space, Table } from antd; import React, { useRef } from react;const CheckList () > {const data [{id: 1,name: 张三,age: 18,content: [{id: 1-1,text: 我叫张三,},],},{id: 2,name:…

城管执法系统源码,城市管理综合执法监督系统,微服务架构,后端框架采用springboot ,支持二开

Java智慧城管系统源码 数字城管APP系统源码 城市管理综合执法监督系统源码&#xff0c;移动执法APP源码。 智慧城管系统开发技术&#xff1a; 技术架构&#xff1a; 微服务 开发语言&#xff1a; java 开发工具&#xff1a;idea、VSCode 前端框架&#xff1a;vueeleme…

2024焊工操作证考试在线模拟考试题

焊工证考试试题分为理论《焊工理论知识》考试和《焊工实操知识》专业能力考核。 焊工证考试试题理论知识考试采用闭卷电脑答题方式&#xff1b;理论知识考试和实操考核均实行百分制&#xff0c;焊工证考试成绩皆达80分及以上者为合格。 以下为焊工理论考试模拟试题&#xff0c…

模型案例:| 音频识别-报警器声音识别模型

导读 2023年以ChatGPT为代表的大语言模型横空出世&#xff0c;它的出现标志着自然语言处理领域取得了重大突破。它在文本生成、对话系统和语言理解等方面展现出了强大的能力&#xff0c;为人工智能技术的发展开辟了新的可能性。同时&#xff0c;人工智能技术正在进入各种应用领…

【解析几何笔记】10.向量的外积

10. 向量的外积 10.1 向量外积的定义 α β \pmb{\alpha}\times\pmb{\beta} αβ是一个向量&#xff0c; α β \pmb{\alpha}\times\pmb{\beta} αβ垂直于 α \pmb{\alpha} α和 β \pmb{\beta} β所在的平面&#xff0c;至于朝上还是朝下&#xff0c;取决于 α , β , α …

mysql 导入excel文件 navicate

需求&#xff1a; 需要将表格的数据&#xff0c;导入到mysql数据库&#xff0c;如果存在就更新&#xff0c;如果不存在就进行追加。 处理&#xff1a; 这种就用navicate进行操作。 excle表格&#xff1a; 平台流水号用户姓名来电号码联系电话通讯地址电子邮箱闽-20231221000…

如何构建社区康养养老系统:Java SpringBoot与Vue实战养老管理系统

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

LLM 安全培训和越狱

Meta、Google、OpenAI、Anthropic 等在公开发布之前都投入了大量精力来审查其模型的输出,并设置安全使用的护栏。尽管他们付出了努力,但越狱仍然会发生,即使是最新版本也是如此。根据 [1],GPT4 很容易受到基于说服的攻击,事实上比旧版 ChatGPT 更容易受到攻击。 新的和更复…

identYwaf:一款基于盲推理识别技术的WAF检测工具

关于identYwaf identYwaf是一款功能强大的Web应用防火墙识别与检测工具&#xff0c;该工具基于盲推理识别技术实现其功能&#xff0c;可以帮助广大研究人员迅速识别目标Web应用程序所使用的保护防火墙类型。 功能介绍 identYwaf所实现的盲推理通过检查一组预定义的测试性&…