操作系统实验五-文件系统
- 格式:docx
- 大小:1.50 MB
- 文档页数:33
文件管理实验报告一、实验目的文件管理是操作系统的重要组成部分,本次实验的目的在于深入理解文件管理的基本概念和原理,掌握文件的存储、组织、检索和访问等操作,熟悉常见的文件系统结构和功能,提高对文件管理系统的实际操作能力和问题解决能力。
二、实验环境1、操作系统:Windows 102、开发工具:Microsoft Visual Studio 2019三、实验内容1、文件的创建、删除和重命名使用 C++或 Python 编程语言,通过系统调用或相关库函数实现文件的创建、删除和重命名操作。
观察文件在操作系统中的实际表现,如文件的出现和消失,文件名的更改等。
2、文件的读写操作实现对文本文件和二进制文件的读写操作,包括读取文件的全部内容、按行读取文件、向文件写入数据等。
分析不同读写模式(如只读、只写、读写等)对文件操作的影响。
3、文件属性的获取和修改获取文件的基本属性,如文件大小、创建时间、修改时间、访问权限等。
尝试修改文件的部分属性,如只读属性、隐藏属性等,观察修改后的效果。
4、文件目录的操作创建、删除和遍历目录。
实现文件在不同目录之间的移动和复制操作。
四、实验步骤1、文件的创建、删除和重命名以下是使用 Python 实现文件创建、删除和重命名的示例代码:```pythonimport os创建文件file_path ="exampletxt"with open(file_path, 'w') as f:fwrite("This is a test file")删除文件osremove(file_path)重命名文件new_file_path ="renamed_exampletxt"osrename(file_path, new_file_path)```运行代码后,可以在指定的目录中观察到文件的创建、删除和重命名操作的结果。
2、文件的读写操作读取文本文件的示例代码:```pythonfile_path ="text_filetxt"with open(file_path, 'r') as f:content = fread()print(content)```按行读取文本文件的示例代码:```pythonfile_path ="text_filetxt"with open(file_path, 'r') as f:for line in f:print(linestrip())```写入数据到文件的示例代码:```pythonfile_path ="outputtxt"with open(file_path, 'w') as f:fwrite("New data written to file")```分别运行上述代码,观察文件的读写结果。
操作系统文件管理系统模拟实验在计算机科学中,操作系统是一种系统软件,负责管理计算机硬件和软件资源,并为用户和应用程序提供接口。
文件管理系统是操作系统的一个重要组成部分,它负责管理计算机系统中的文件和目录,以及提供对它们的访问和操作。
本次实验旨在模拟操作系统中文件管理系统的基本功能和操作。
我们将使用一个虚拟的文件系统,通过命令行界面来模拟用户与文件系统的交互。
以下是实验的具体内容和步骤:1. 创建虚拟文件系统首先,我们需要创建一个虚拟的文件系统。
文件系统由文件和目录组成,可以通过树状结构来表示。
我们可以使用一个数据结构来模拟文件系统的存储和管理。
2. 初始化文件系统在开始操作文件系统之前,我们需要初始化文件系统。
这包括创建根目录和设置当前目录为根目录。
3. 文件和目录的创建与删除文件和目录是文件系统的基本单位。
我们可以通过命令来创建和删除文件和目录。
例如,使用"mkdir"命令创建一个目录,使用"touch"命令创建一个空文件,使用"rm"命令删除文件或目录。
4. 文件和目录的访问权限文件和目录可以设置不同的访问权限,以保护文件系统的安全性。
我们可以使用"chmod"命令来修改文件或目录的权限。
权限通常包括读、写和执行权限。
5. 文件和目录的重命名和移动我们可以使用"mv"命令来重命名文件或目录,使用"cp"命令来复制文件或目录,使用"mv"命令来移动文件或目录。
6. 文件和目录的查找和显示我们可以使用"ls"命令来显示当前目录下的文件和目录,使用"cd"命令来切换当前目录,使用"pwd"命令来显示当前目录的路径。
此外,我们还可以使用"find"命令来查找文件或目录。
7. 文件和目录的读写操作文件可以被读取和写入。
linux的文件系统、目录结构、文件管理实验报告Linux是一款使用广泛的操作系统,具有丰富的文件系统、目录结构、文件管理系统。
以下是Linux文件系统实验报告。
一、文件系统文件系统是指计算机操作系统用来管理文件和数据存储空间的一种机制。
Linux系统使用的是可扩展的第二代文件系统(ext2、ext3、ext4),它支持更大的文件和更大的分区,并使用了更高效的索引和更快的文件系统检查。
二、目录结构Linux目录结构是一个统一的层次结构,它将计算机的所有文件都组织到一个合理的层次结构中。
以下是Linux常见的目录结构:1. /(根目录):根目录是文件系统的根节点,所有文件和目录都以它为起点。
2. /bin:包含一些最基本的系统工具,比如ls、cp、mv等常用命令。
3. /dev:包含系统设备文件。
4. /etc:包含系统中的配置文件和脚本文件。
5. /home:用于存储用户的个人文件和数据。
6. /lib:包含了系统中使用的一些共享库文件。
7. /mnt:用于挂载外部设备,比如USB、CD-ROM等。
8. /opt:用于存放第三方软件的安装文件和数据。
9. /proc:该目录是一个虚拟目录,它不占用实际存储空间,但可以查看和修改系统的运行状态。
10. /root:超级用户的家目录。
11. /sbin:包含一些管理系统的系统管理员使用的工具。
12. /tmp:用于存放临时文件和目录。
13. /usr:用于存放非本地(不是系统)用户的应用程序和数据。
14. /var:用于存放可变的数据,比如日志文件。
三、文件管理文件管理是指对计算机文件进行操作,如创建、复制、粘贴、移动和删除等。
下面是Linux 文件管理的一些常见命令:1. ls:列出目录中的文件和子目录。
2. cd:切换目录。
3. mkdir:创建一个新目录。
4. touch:创建一个新文件。
5. cp:复制文件或目录。
6. mv:移动或重命名文件。
计算机系课程设计实验报告课程名称操作系统课程设计实验学期 2012 至 2013 学年第 1 学期学生所在系部计算机与信息管理系年级 2010 专业班级计算机001班学生姓名学号任课教师实验成绩计算机系制一个简单的文件系统的详细设计一、实验目的(1)阅读并调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
(2)了解设计一个n个用户的文件系统,每个用户可以保存M个文件。
用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有create、delete、open、close、read、write等命令。
二、实验要求1、阅读所给文件系统源程序,并加注释(注释量达60%),2、修改、完善该系统,画出所设计的文件系统的详细流程图。
三、文件系统功能设计1. 功能设计该文件系统是一个多用户、多任务的文件系统。
对用户和用户的文件数目并没有上限。
也就是说该系统允许任何用户申请空间,而且在其目录下的文件数目并不做任何的限制。
该系统可以支持的操作命令如下:①bye——用户注销命令。
当使用该命令时,用户退出系统,注销该用户功能设计并回到登陆界面。
命令格式:bye②close——删除用户注册信息命令。
执行该命令后,用户在系统中的所有信息,包括该用户目录下的所有文件都被删除。
命令执行完成后返回登陆界面。
命令格式:close③create——在当前目录下创建一个文件,且该文件不能跟当前已有的文件重名。
该文件的管理信息登记在用户文件信息管理模块中。
执行完该命令后回到执行命令行。
命令格式:create>file1其中:“>”符为提示符,file1为要创建的文件名。
④delete——删除当前用户目录下的一个文件,命令执行完毕返回至命令行。
命令格式:delete>file1其中:file1为要删除的文件名。
⑤list——显示当前注册目录下的所有文件信息,包括文件名、文件长度、文件操作权限。
《操作系统》课内实验报告一、实验目的本次《操作系统》课内实验的主要目的是通过实际操作和观察,深入理解操作系统的基本原理和功能,掌握常见操作系统命令的使用,提高对操作系统的实际应用能力和问题解决能力。
二、实验环境本次实验在计算机实验室进行,使用的操作系统为 Windows 10 和Linux(Ubuntu 发行版)。
实验所使用的计算机配置为:Intel Core i5 处理器,8GB 内存,500GB 硬盘。
三、实验内容1、进程管理在 Windows 系统中,通过任务管理器观察进程的状态、优先级、CPU 使用率等信息,并进行进程的结束和优先级调整操作。
在 Linux 系统中,使用命令行工具(如 ps、kill 等)实现相同的功能。
2、内存管理使用 Windows 系统的性能监视器和资源监视器,查看内存的使用情况,包括物理内存、虚拟内存的占用和分配情况。
在 Linux 系统中,通过命令(如 free、vmstat 等)获取类似的内存信息,并分析内存的使用效率。
3、文件系统管理在 Windows 系统中,对文件和文件夹进行创建、复制、移动、删除等操作,了解文件的属性设置和权限管理。
在 Linux 系统中,使用命令(如 mkdir、cp、mv、rm 等)完成相同的任务,并熟悉文件的所有者、所属组和权限设置。
4、设备管理在 Windows 系统中,查看设备管理器中的硬件设备信息,安装和卸载设备驱动程序。
在 Linux 系统中,使用命令(如 lspci、lsusb 等)查看硬件设备,并通过安装内核模块来支持特定设备。
四、实验步骤1、进程管理实验(1)打开 Windows 系统的任务管理器,切换到“进程”选项卡,可以看到当前系统中正在运行的进程列表。
(2)选择一个进程,右键点击可以查看其属性,包括进程 ID、CPU 使用率、内存使用情况等。
(3)通过“结束任务”按钮可以结束指定的进程,但要注意不要随意结束系统关键进程,以免导致系统不稳定。
一、实验目的1. 理解文件管理的概念和基本原理。
2. 掌握文件系统的结构及其组成。
3. 学会使用文件管理系统进行文件操作。
4. 了解文件系统的性能优化方法。
二、实验环境1. 操作系统:Windows 102. 文件管理系统:Windows Explorer3. 实验工具:文本编辑器(如Notepad)三、实验内容1. 文件系统的基本概念2. 文件系统的结构3. 文件操作4. 文件系统性能优化四、实验步骤1. 文件系统的基本概念(1)打开Windows Explorer,观察文件系统的组织结构。
(2)分析文件系统的组成,包括文件、目录、驱动器等。
(3)了解文件名、扩展名、路径等基本概念。
2. 文件系统的结构(1)创建一个新文件夹,命名为“实验文件夹”。
(2)在“实验文件夹”中创建一个文本文件,命名为“实验报告.txt”。
(3)观察文件系统的树状结构,理解目录与文件之间的关系。
3. 文件操作(1)打开“实验报告.txt”,使用文本编辑器进行编辑。
(2)保存并关闭编辑器。
(3)将“实验报告.txt”复制到“实验文件夹”的子目录中。
(4)删除“实验文件夹”中的“实验报告.txt”。
(5)重命名“实验文件夹”中的子目录。
4. 文件系统性能优化(1)查看磁盘属性,了解磁盘空间占用情况。
(2)对磁盘进行碎片整理。
(3)使用磁盘清理工具清理磁盘中的临时文件。
五、实验结果与分析1. 文件系统的基本概念通过实验,我们了解了文件系统的基本概念,包括文件、目录、驱动器等。
文件系统是操作系统管理文件的一种数据结构,用于存储、检索、更新和删除文件。
2. 文件系统的结构实验中,我们创建了文件夹和文件,并观察了文件系统的树状结构。
文件系统采用分层结构,目录与文件之间通过路径连接。
3. 文件操作实验中,我们进行了文件操作,包括创建、编辑、复制、删除和重命名。
这些操作是文件管理的基本技能。
4. 文件系统性能优化通过磁盘碎片整理和清理磁盘中的临时文件,我们提高了文件系统的性能。
操作系统实验报告文件管理文件管理是操作系统的重要功能之一,它负责对计算机系统中的文件进行组织、存储和访问。
文件管理系统的设计和实现对操作系统的性能和可靠性起着重要作用。
本文将介绍文件管理的基本概念、文件系统的组织方式和文件的操作方法。
一、文件管理的概念文件是计算机系统中存储和管理数据的基本单位,它可以是文本、图像、音频、视频等各种类型的数据。
文件管理的目标是实现对文件的有效组织和高效访问,使得用户和应用程序可以方便地读取、写入和删除文件。
文件管理系统主要包括以下几个方面:1.文件组织方式:文件可以按照不同的方式进行组织,包括顺序文件、索引文件、哈希文件等。
不同的组织方式有不同的优势和适用场景,可以根据实际需要选择合适的组织方式。
2.文件存储管理:文件在存储设备上的存储方式包括连续存储、链式存储和索引存储等。
不同的存储方式对文件的读写性能和空间利用率有影响,需要根据实际情况进行选择。
3.文件访问控制:对文件的访问需要进行权限控制,保证只有合法的用户或应用程序可以读取和写入文件。
文件访问控制主要通过访问权限和文件属性来实现。
二、文件系统的组织方式1.单级目录结构:这是最简单的文件系统组织方式,所有文件都位于同一个目录下。
由于没有目录的嵌套结构,文件的查找和管理比较简单,但是对于大量文件的管理不够灵活。
2.层次目录结构:该方式通过目录的嵌套结构来组织文件,可以形成一棵树状结构。
目录可以包含子目录和文件,用户可以通过目录路径来访问文件。
这种组织方式可以更好地组织大量的文件,提高文件的查找效率。
3.索引目录结构:该方式使用一个索引表来记录文件的位置和属性信息,用户通过索引表中的索引来访问文件。
索引表可以根据文件名、文件类型等信息快速定位到文件的位置,提高访问效率。
此外,索引表还可以支持对文件的动态增删改查操作。
三、文件的操作方法1.创建文件:文件的创建是指在文件系统中创建一个新文件,并为其分配存储空间。
创建文件时需要指定文件名和文件类型,并根据需要为文件设置访问权限和属性。
第1篇一、引言操作系统是计算机科学与技术领域的重要基础课程,它涉及计算机系统的资源管理、进程管理、存储管理、文件系统等多个方面。
为了提高学生对操作系统的理解和掌握程度,本文将从教学实践的角度,探讨如何进行操作系统教学。
二、教学目标1. 使学生掌握操作系统的基本概念、原理和关键技术;2. 培养学生分析和解决实际问题的能力;3. 增强学生的团队协作和创新能力;4. 提高学生的编程能力和动手能力。
三、教学内容1. 操作系统概述:介绍操作系统的定义、发展历程、分类和特点;2. 进程管理:讲解进程的概念、进程状态、进程调度算法和进程同步与互斥;3. 存储管理:分析内存分配策略、页面置换算法和虚拟内存技术;4. 文件系统:探讨文件系统的概念、目录结构、文件操作和存储设备管理;5. 设备管理:介绍设备的分类、驱动程序、I/O控制方式和中断处理;6. 网络操作系统:讲解网络操作系统的基本概念、网络协议、网络设备管理和网络安全。
四、教学实践1. 案例教学:通过实际案例,引导学生分析操作系统的原理和应用。
例如,以Linux系统为例,讲解进程调度、内存管理和文件系统等知识点。
2. 实验教学:设计实验项目,让学生动手实践操作系统的相关知识。
实验项目包括:(1)进程调度实验:让学生编写进程调度算法,实现进程的创建、调度和同步。
(2)内存管理实验:让学生实现内存分配、页面置换和虚拟内存等技术。
(3)文件系统实验:让学生实现文件系统的目录结构、文件操作和存储设备管理。
(4)设备管理实验:让学生编写设备驱动程序,实现设备的控制和管理。
3. 项目教学:以实际项目为背景,让学生分组完成项目开发。
项目可以包括:(1)操作系统模拟器:让学生模拟操作系统的运行过程,加深对操作系统原理的理解。
(2)嵌入式操作系统开发:让学生了解嵌入式操作系统的特点,掌握嵌入式开发技能。
(3)分布式操作系统开发:让学生了解分布式系统的原理,掌握分布式操作系统的开发方法。
操作系统文件管理实验报告操作系统文件管理实验报告1:引言本实验报告旨在详细描述操作系统文件管理实验的设计、实施和结果。
文件管理是操作系统的重要组成部分,负责对计算机中的文件进行组织、存储和访问。
本实验通过模拟文件管理的过程,加深对文件管理的理解和实践。
2:实验目的本实验的主要目的是:- 理解文件系统的概念和原理- 掌握文件的创建、读取、写入和删除等基本操作- 实施并测试文件的分配和回收算法- 评估不同的文件分配算法对系统性能的影响3:实验环境本实验的实施环境如下:- 操作系统:Windows 10- 开发环境:C++ 编程语言4:实验内容4.1 文件系统设计在文件系统设计中,首先确定文件的基本单位,例如块或扇区。
然后,定义文件控制块(FCB)结构,用于存储文件的元数据信息,如文件名、大小、创建时间、权限等。
接下来,设计文件分配表,记录系统中每个块的使用情况,用于实现文件的分配和回收。
4.2 文件的创建和删除在文件的创建过程中,首先为文件分配空间,并更新文件分配表。
然后,创建文件的FCB,并将其到目录项中。
在文件的删除过程中,首先释放文件的空间,并更新文件分配表。
然后,删除文件的FCB,并从目录项中移除。
4.3 文件的读写操作文件的读写操作是用户对文件进行读取和修改的过程。
在文件读取操作中,首先找到要读取的文件的FCB,获取文件的起始块地址,并从起始块中读取数据。
在文件写入操作中,首先找到要写入的文件的FCB,获取文件的起始块地址,并将数据写入起始块。
若文件大小超过起始块的容量,则按照一定的分配算法继续分配空间。
4.4 文件分配算法文件分配算法决定了操作系统如何管理文件的空间分配。
常用的文件分配算法包括顺序分配、分配和索引分配。
顺序分配将文件连续地存储在磁盘上,易于实现但可能产生外部碎片。
分配使用链表结构将文件存储在磁盘的不连续块中,不易产生外部碎片但可能引起存取时间增长。
索引分配使用索引表将文件存储在磁盘的不连续块中,不易产生外部碎片且存取时间相对较短,但索引表本身需要占用存储空间。
操作系统虚拟文件系统实验报告一、实验目的本实验旨在帮助学生理解操作系统中虚拟文件系统的概念和工作原理,通过实际操作来深入学习和掌握相关知识。
二、实验环境本次实验使用的操作系统为Linux,实验工具为虚拟机软件VMware Workstation。
三、实验步骤1. 创建虚拟机:首先启动VMware Workstation,创建一个新的虚拟机并安装Linux操作系统。
2. 挂载文件系统:在Linux系统中,使用命令行工具挂载一个文件系统到指定的目录,例如将/dev/sdb1挂载到/mnt目录下。
3. 创建文件:在挂载后的文件系统中,通过命令行工具创建若干个文件和目录,可以使用touch和mkdir命令。
4. 编辑文件内容:使用vim或者其他文本编辑工具,在创建的文件中添加一些内容。
5. 查看文件系统信息:使用df命令查看当前系统的文件系统使用情况,通过ls命令查看文件和目录的信息。
6. 卸载文件系统:使用umount命令卸载之前挂载的文件系统。
7. 实验总结:对本次实验的操作过程和结果进行总结,思考在实际应用中虚拟文件系统的意义和作用。
四、实验结果分析通过本次实验,我深入理解了操作系统中虚拟文件系统的概念和原理。
在实际操作过程中,我掌握了如何挂载和卸载文件系统,创建和编辑文件内容,以及查看文件系统信息的方法。
这些基本操作对于日常的系统管理和开发工作具有重要意义,能够有效地提高工作效率和便捷性。
五、实验感想本次实验虽然只是简单的操作演示,但对我理解操作系统的文件系统和虚拟化技术有着重要的意义。
通过亲身操作,我对虚拟文件系统的工作原理有了更加直观的认识,对操作系统中文件管理的流程和方式也有了更深入的理解。
这对我今后的学习和工作都具有积极的促进作用,我会继续学习和提升相关知识和技能,努力成为一名优秀的操作系统工程师。
六、实验总结通过本次操作系统虚拟文件系统的实验,我进一步巩固了相关知识,增强了对操作系统的理解和掌握。
计算机科学与技术学院2018-2019学年第一学期《操作系统》实验报告班级: XXXXXXX学号: XXXXXXXXX姓名: XXX教师: XXX成绩:1. 题目分析1.1 设计目的深入了解磁盘文件系统的实现。
1.2 设计内容(1)设计一个简单的文件系统,用文件模拟磁盘,用数组模拟缓冲区,要求实现:(2)支持多级目录结构,支持文件的绝对读路径;(3)文件的逻辑结构采用流式结构,物理结构采用链接结构中的显示链接方式;(4)采用文件分配表;(5)实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示文件内容、打开文件、读文件、写文件(追加方式)、关闭文件、改变文件属性。
(6)最后编写主函数对所做工作进行测试。
1.3 相关知识概述(1)文件的操作:①创建文件;②删除文件;③读文件;④写文件;⑤设置文件读/写位置。
(2)文件的逻辑结构:从用户的观点出发所能观察到的文件组织形式,即问价是由一系列的逻辑记录组成的,是用户可以直接处理的数据及其结构。
文件的物理结构:系统将文件存储在外存上所形成的一种存储组织形式,用户不可见。
(3)磁盘空间的管理:采取合理的文件分配方式,为每个文件分配必要的存储空间,使每个文件都能“各得其所”,并能有效减少磁盘碎片。
(4)磁盘目录结构2. 实验设计2.1基本设计思路用一个文件模拟磁盘:FAT 根目录目录1目录2目录3目录4…文件1文件2…文件分配表FAT(128B):第几项0 1 2 3 4 5 6 7 8 9 …内容-1 -1 -1 4 9 0 7 8 -1 12 …根目录(64B)目录1(64B)目录6(64B)目录……….实验中,模拟的磁盘有128块,每块64B,故文件分配表有128项,每项3一个字节,共占磁盘的前两块,盘块编号0、1;根目录紧邻在文件分配表后面,占编号为2的盘块。
8B8B8B8B8B8B8B8B文件管理系统要实现的功能包括:(1)磁盘操作:①磁盘分配(2)目录操作:①建立目录②显示目录内容③删除空目录(3)文件操作:①建立文件②打开文件③关闭文件④读文件⑤写文件⑥删除文件(磁盘回收)⑦显示文件内容⑧改变文件属性⑨使用绝对路径名查找文件(4)对数据结构——已打开文件表的操作:①在已打开文件表中查找某文件②将文件从已打开文件表中删除③将某文件插入已打开文件表2.2 主要数据结构描述1、每个目录项的数据结构(8B):typedef struct{char name[3]; // 文件/目录名char type[2]; //文件类型目录未使用字节(填充空格)int attribute;//属性int startnum; //起始盘块号int length;//文件长度目录未使用字节(填充0)}DF_item;2、已打开文件表项类型:typedef struct {char name[20]; //文件绝对路径名char attribute; //文件的属性,用1个字节表示,所以采用char类型int number; //文件起始盘块号int length; //文件长度,文件占用的字节数int flag; //操作类型,用“0”表示以读操作方式开文件,用“1”表示写操作方式打开文件pointer read; //读文件的位置,文件打开时dnum为文件起始盘块号,bnum为“0”pointer write; //写文件的位置,文件刚建立时dnum为文件起始盘块号,bnum 为“0”,打开文件时dnum和bnum为文件的末尾位置}OFILE;3、已打开文件登记表:struct{OFILE file[n]; //已打开文件登记表int length; //已打开文件登记表中登记的文件数量}openfile;2.3 主要算法描述(1)磁盘分配:(2)对已打开文件表的操作: ①在已打开文件表中查找某文件:开始找到文件分配表第 x 项, i=x第 i 项值是否为第 i 项是否为最后 一项?磁盘满,分配失败结束i=i+1分配第 i 块NYNY图 2-10 分配一个磁盘块的流程图②将某文件从已打开文件表中删除结束 查找路径名为 pname 的文件i=0i 为已打开文件 表一栏?查找成功 结束查找失败i=i+1文件路径名相符?NNYY开始删除路径名为 n ame 的文件 在已打开文件表中查找路径名为 n ame 的登记项i 找到该文件登记项?删除第 i 项:openfile.file[i]=openfile[openfile.length-1]openfile.length=openfile.length-1结束文件没有打开, 删除失败NY 图2-13 在已打开文件表中查找某文件图2-14 将某文件从已打开文件表中删除的流程图③将某文件插入已打开文件表(3)目录操作:①建立目录结束插入路径名为n ame 的文件在已打开文件表中查找路径名为n ame的登记项找到该文件登记项?已打开文件表已满?文件登记表满,无法打开文件结束在o penfile.file[length]处填写该文件的各项内容:openfile.length=openfile.length+1文件已打开YNYN图2-15将某文件插入已打开文件表的流程图②显示目录内容③删除空目录删除空目录首先要找到该目录,如果目录不存在,指令执行失败;如果存在,但是根目录或非空目录,显示不能删除,操作失败;若是非空子目录,则删除其目录项并回收对应空间。
删除空目录的过程和删除文件的过程相似,流程可参考文件的删除过程。
开始 显示路径名为 name 的目录 查找目录 n ame找到该目录?该目录项起始盘块 号 d num ;第 d num 块 内容读入 b uffer2指定目录不存在,显示目录 内容失败结束t=0查 b uffer2 中第 t 个目录项第 t 项是空目录项?显示该目录内容第 t 项是该盘块最后一项?结束t=t+1NYNYYN图 2-24 显示目录内容的流程图(4)文件操作:①建立文件②打开文件③关闭文件结束打开路径名为 p name 的文件查找文件的目录项找到该文件目录项文件属性与操作类型相符在已打开文件表中 插入该文件登记项结束文件不存在 ,无法打开文件操作不合法无法打开文件NYY N图 2-17 打开文件的流程图④读文件开始 关闭文件路径名为 name 的文件 查找已打开文件表文件打开? 追加文件结束符修改目录中文件长度 结束文件未打开, 无法关闭文件结束在已打开文件表中删 除该文件登记项操作为 “ 写 ” ?NNY Y图 2-20 模拟关闭文件的流程图⑤写文件开始读 n ame 文件 l ength 字节 查找已打开文件表文件打开文件以读方式打开从已打开文件表的到读指针 :将盘块 d um 读入缓冲b uffer1 文件未打开 , 无法读文件结束文件不能读结束t=0文件未结束且 t<=length显示读出内容; 修改读指针的 b unum: bnum=bnum+1t=t+1读完一个盘块修改读指针 bnum=0; :dnum= 文件分配表第 n um 项将盘块 d num 读入缓冲 b uffer1读文件结束 结束NYNNNYYY⑥删除文件(磁盘回收)⑦显示文件内容⑧改变文件属性改变文件属性,首先查找该文件,如果不存在,结束;如果存在,检査文件是否打开,打开不能改变属性;没有打开,根据要求改变目录项中属性值。
⑨使用绝对路径名查找文件结束 显示路径名为 name 的文件 查找目录 n ame找到该文件?文件打开?dnum= 该目录 起始盘块号第 d num 块是 该文件一块?第 d num 块内容读入 buffer1 显示 b uffer1 中的内 容结束或到文件结束符dnum=FAT 第d num 项 结束结束文件打开,显 示文件失败结束指定的文件不存在,显示文件内容失败NYNYNY3. 编码实现3.1 实现过程总结部分功能代码:(1)目录操作:①建立目录:int md(char *pathName, char *contentName, char address) //建立目录{int dnum;int bnum;int cbnum;int size = strlen(contentName);bool result = search_by_rname(pathName, 0, &dnum, &bnum, &cbnum);if (result == false){return 0; //返回值为0代表绝对路径输入有误,重新建立}content cn;int i = 0;for (i = 0; i < 3; i++){[i] = 255;}for (i = 0; i < size; i++) //为新建的name字段进行赋值{[i] = contentName[i];}[i] = '\0';cn.type[0] = ' ';cn.type[1] = ' ';cn.attribute = 8;cn.address = address;cn.length = ' ';int result1 = search(dnum);if (result1 == -1){return 2; //表示所选的父目录中没有空间}if (!isBlockEmpty(address)){return 3;}fseek(fc, address, SEEK_SET);unsigned char c1 = getc(fc);if (c1 == 254){return 4;}fseek(fc, dnum * 64 + result1, SEEK_SET);content c[1];c[0] = cn;fwrite(c, 8L, 1, fc);fseek(fc, (int)address, SEEK_SET);putc(255, fc);for (int i = 0; i < 8; i++){contentBuffer[i].name[0] = '$';}fseek(fc, address * 64, SEEK_SET);fwrite(contentBuffer, 64L, 1, fc);return 1; ///1代表创建目录}②显示目录内容:int dir(char *pathName){int dnum;int bnum;int cbnum;bool result =search_by_rname(pathName, 0, &dnum, &bnum, &cbnum);if (result == false){return 0; //路径查找失败}fseek(fc, dnum * 64, SEEK_SET);fread(contentBuffer, 64L, 1, fc);for (int i = 0; i < 8; i++){cout << "第" << i + 1 << "项的内容是:" << endl;if (contentBuffer[i].attribute == 8) //这是一个目录{cout << "名字:" << contentBuffer[i].name << endl;cout << "类型:空" << endl;cout << "属性:目录项" << endl;cout << "起始地址:" << (int)contentBuffer[i].address << endl;cout << "长度:1" << endl << endl;}else if (contentBuffer[i].name[0] == '$'){cout << "一个空的目录登记项" << endl;}else{cout << "名字:" << contentBuffer[i].name << endl;cout << "类型:" << contentBuffer[i].type << endl;if (contentBuffer[i].attribute == 3){cout << "属性:只读系统文件" << endl;}else{cout << "属性:可读可写的普通文件" << endl;}cout << "起始地址:" << (int)contentBuffer[i].address << endl;cout << "长度" << (int)contentBuffer[i].length << endl << endl;}}}(2)文件操作:①建立文件:bool create_file(){//让用户输入文件所在的绝对路径char absolutePath[20];getchar();cout << "请输入文件所在的绝对路径:";gets_s(absolutePath, 20);//检查目录是否存在int dnum;//该目录所在的磁盘盘块号int a;if (!search_by_rname(absolutePath, 1, &dnum, &a, &a)){cout << "路径不存在!" << endl;return false;}//检查该目录中是否有空余的登记项的位置int bnum = search1(dnum);if (bnum == -1){cout << "该路径下没有空余的登记项位置!" << endl;return false;}//让用户输入待建立文件的文件名char fileName[3];cout << "请输入文件名:";gets_s(fileName, 3);//检查文件名是否重名if (isRename(fileName, dnum) == false){cout << "文件名重名!" << endl;return false;}//输入文件属性cout << "请输入文件属性[A(只读文件) B(系统文件) C(只读系统文件) D(普通文件)]: "; char attributeByletter;cin >> attributeByletter;char attribute;switch (attributeByletter){case'A':attribute = 1;break;case'B':attribute = 2;break;case'C':attribute = 3;break;case'D':attribute = 4;break;default:cout << "没有该文件类型!" << endl;return false;}//让用户输入文件类型char type[3];cout << "请输入文件类型:";getchar();gets_s(type, 3);//在文件分配表中找一个空闲的盘块分配给该文件int freeDiskFileNum;if (findfree_FAT(&freeDiskFileNum) == false){cout << "磁盘空间已满!" << endl;return false;}fseek(fc, freeDiskFileNum, SEEK_SET);//将FAT对应位置填255表示该块被占用int useDisk = 255;fwrite(&useDisk, 1L, 1, fc);char star = '*';//将对应的盘块全部写星星fseek(fc, 64 * freeDiskFileNum, SEEK_SET);for (int i = 0; i < 64; i++){fwrite(&star, 1L, 1, fc);}//在该目录中添加该文件登记项content newitem;strcpy(, fileName);strcpy(newitem.type, type);newitem.attribute = attribute;newitem.address = freeDiskFileNum;newitem.length = 1;//刚创建时问价大小为满块64fseek(fc, dnum * 64 + bnum, SEEK_SET);fwrite(&newitem, 8L, 1, fc);}②打开文件:int open_file(char *pathName, int flag){int dnum; //下一跳的盘块号int bnum; //当前文件或者目录登记项所在的盘块号int cbnum; //当前登记项在当前盘块的偏移量bool result = search_by_rname(pathName, 1, &dnum, &bnum, &cbnum);if (result == false){return 0; //路径查找失败}OFILE cu;int i;for (i = 0; i < strlen(pathName); i++){[i] = pathName[i];}[i] = '\0';fseek(fc, bnum * 64 + cbnum, SEEK_SET);content temp[1];fread(temp, 8L, 1, fc);cu.attribute = temp[0].attribute;cu.number = temp->address;cu.length = temp->length;cu.flag = flag;pointer read, write;read.dnum = dnum;read.bnum = 0;write.dnum = dnum;write.bnum = 0;cu.write = write;cu.read = read;openfile.push_back(cu);return 3;}③关闭文件:int close_file(char *pathName){list<OFILE>::iterator it;int i = 0;for (it = openfile.begin(); it != openfile.end();) {if (strcmp(it->name, pathName) == 0){it = openfile.erase(it);return 1;}else{++it;}}return 0;}④读文件:bool read_file(char *pathName){int a;unsigned char c;bool flag = false;OFILE exist;list<OFILE>::iterator it;int i = 0;for (it = openfile.begin(); it != openfile.end(); it++){if (strcmp(it->name, pathName) == 0){exist = *it;flag = true;break;}}if (flag == false){return flag;}int dnumTemp = exist.read.dnum;fseek(fc, 64 * exist.read.dnum, SEEK_SET);for (i = 0; i < exist.length; i++){cout << "第" << exist.read.dnum << "个盘块内容如下:" << endl;while (exist.read.bnum<64){if (exist.read.bnum % 8 == 0){cout << endl;}c = getc(fc);a = c;cout << hex << " " << a;exist.read.bnum++;}exist.read.bnum = 0;fseek(fc, exist.read.dnum, SEEK_SET);c = getc(fc);if (c == 255){cout << "文件末尾" << endl;break;}exist.read.dnum = c;fseek(fc, exist.read.dnum * 64, SEEK_SET);cout << endl;}return flag;}⑤写文件:bool write_file(char *pathName){int dnum; //下一跳的盘块号int bnum; //当前文件或者目录登记项所在的盘块号int cbnum; //当前登记项在当前盘块的偏移量int a;unsigned char c;bool flag = false;OFILE exist;list<OFILE>::iterator it;int i = 0;for (it = openfile.begin(); it != openfile.end(); it++) {if (strcmp(it->name, pathName) == 0){exist = *it;flag = true;break;}}if (flag == false){return flag;}cout << "当前文件的内容为" << endl;read_file(pathName);int userDnum, userBnum;cout << "请输入要修改的文件位置:" << endl;cout << "输入盘块号:";cin >> userDnum;cout << "输入块内地址:";cin >> userBnum;string s;cout << "请输入要修改的内容:" << endl;cin >> s;int UserLength = s.size();fseek(fc, userDnum * 64 + userBnum, SEEK_SET);exist.write.dnum = userDnum;exist.write.bnum = userBnum;int newDisk;for (int i = 0; i < UserLength; i++){putc(s[i], fc);exist.write.bnum++;if (exist.write.bnum>63){fseek(fc, exist.write.dnum, SEEK_SET);if (i + 1 == UserLength){return flag;}else{c = getc(fc);cout << hex << (int)c << endl;if (c == 255){findfree_FAT(&newDisk);unsigned char newd = newDisk;getchar();fseek(fc, exist.write.dnum, SEEK_SET);int ascall = fputc(newd, fc);fseek(fc, 3, SEEK_SET);unsigned char check = getc(fc);exist.write.dnum = newDisk;search_by_rname(pathName, 1, &dnum, &bnum, &cbnum);fseek(fc, bnum * 64 + 7, SEEK_SET);putc(++exist.length, fc);}else{exist.write.dnum = c;}exist.write.bnum = 0;fseek(fc, exist.write.dnum * 64, SEEK_SET);}}}return flag;}⑥使用绝对路径名查找文件:bool search_by_rname(char *name, int flag, int *dnum, int *bnum, int *cbnum){int length = strlen(name);list<string> pathCollection;*dnum = -1;if (name[0] == '/'&&name[1] == '\0') //如果路径只有‘/’,说明是根目录。