简单文件系统的实现实验报告
文件管理系统实验报告
一、实验目的本次实验旨在通过设计和实现一个简单的文件管理系统,加深对文件管理原理的理解,掌握文件系统的基本操作,包括文件的创建、删除、修改、查询等,并了解文件系统的目录结构和管理机制。
二、实验环境1. 操作系统:Windows 102. 开发工具:Visual Studio 20193. 编程语言:C++4. 实验时间:2023年10月25日三、实验内容1. 文件系统的目录结构设计2. 文件的基本操作实现3. 文件系统的存储管理4. 文件系统的安全机制四、实验步骤1. 目录结构设计根据文件系统的需求,设计以下目录结构:```根目录│├── 文件夹A│ ├── 文件1.txt│ └── 文件2.txt│├── 文件夹B│ └── 文件3.txt│└── 文件夹C```2. 文件的基本操作实现(1)文件创建```cppvoid CreateFile(const std::string& filePath, const std::string& content) {// 检查文件是否存在if (CheckFileExist(filePath)) {std::cout << "文件已存在!" << std::endl;return;}// 创建文件std::ofstream file(filePath);if (file.is_open()) {file << content;file.close();std::cout << "文件创建成功!" << std::endl;} else {std::cout << "文件创建失败!" << std::endl;}}```(2)文件删除```cppvoid DeleteFile(const std::string& filePath) {// 检查文件是否存在if (!CheckFileExist(filePath)) {std::cout << "文件不存在!" << std::endl;return;}// 删除文件if (remove(filePath) == 0) {std::cout << "文件删除成功!" << std::endl;} else {std::cout << "文件删除失败!" << std::endl;}}```(3)文件修改```cppvoid ModifyFile(const std::string& filePath, const std::string& newContent) {// 检查文件是否存在if (!CheckFileExist(filePath)) {std::cout << "文件不存在!" << std::endl; return;}// 修改文件内容std::ofstream file(filePath, std::ios::trunc); if (file.is_open()) {file << newContent;file.close();std::cout << "文件修改成功!" << std::endl; } else {std::cout << "文件修改失败!" << std::endl; }}```(4)文件查询```cppvoid QueryFile(const std::string& filePath) {// 检查文件是否存在if (!CheckFileExist(filePath)) {std::cout << "文件不存在!" << std::endl; return;}// 读取文件内容std::ifstream file(filePath);if (file.is_open()) {std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());std::cout << "文件内容:" << content << std::endl;file.close();} else {std::cout << "文件读取失败!" << std::endl;}}```3. 文件系统的存储管理文件系统采用磁盘文件作为存储介质,通过文件操作实现对文件的读写。
杭州电子科技大学简单文件系统的实现的实验报告
杭州电子科技大学操作系统课程设计课程设计题目:简单文件系统的实现姓名:***班级:12052315学号:********学院:计算机学院专业:计算机科学与技术负责老师:贾刚勇报告完成日期:2014.12.30简单文件系统的实现一,课程设计的目的1.通过具体的文件爱你存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部数据结、功能及实现过程的理解二,设计要求1.在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的但用户单任务系统的文件系统。
在退出文件系统的使用时,应将虚拟文件系统一个Windows文件的方式保存到磁盘中,以便下次再将它恢复到内存的虚拟磁盘空间中2.文件存储空间的分配可采用显示链接分配或其它方法3.空闲磁盘空间的管理可选择位示图或其它方法4.文件目录结构采用多级目录结构5.需要提供一以下操作命令i.Formatii.Mkdiriii.Rmdiriv.Lsv.Cdvi.Createvii.Openviii.Closeix.Writex.Readxi.Rmxii.Exit三,程序设计思想以及总流程图1.程序设计思想i.首先,在文件系统启动时,申请一块较大的内存,用来当作文件系统的磁盘空间ii.然后,对其进行格式化,虚拟磁盘的空间布局是仿照FAT16文件系统,结构如下:1块2块2块995块引导块FAT1 FAT2 数据区格式化时,主要包括引导块,FAT1,FAT2,的一些初始化工作例如设置文件魔数,文件系统的信息,FAT1,FAT2的信息等等iii.根据用户输入的命令,调用对应的函数.2.程序流程图四,系统关键数据结构(1)文件控制块FCB用于记录文件的描述和控制信息,每个文件设置一个FCB,它也是文件的目录项的内容。
typedef struct FCB //仿照FAT16设置的{char filename[8]; //文件名char exname[3];//文件扩展名unsigned char attribute;//文件属性字段:为简单起见,我们只为文件设置了两种属性://值为0时表示目录文件,值为1时表示数据文件unsigned short time;//文件创建时间unsigned short data;//文件创建日期unsigned short first;//文件起始盘块号unsigned long length;//文件长度(字节数)char free;//表示目录项是否为空,若值为0,表示空,值为1,表示已分配}fcb;(2)文件分配表FATtypedef struct FAT{unsigned short id;}fat;(3)用户打开文件表USEROPEN当打开一个文件时,必须将文件的目录项中的所有内容全部复制到内存中,同时还要记录有关文件操作的动态信息,如读写指针的值等。
文件系统实验报告
文件系统实验报告文件系统实验报告篇一:内核,文件系统实验报告一嵌入式系统实验报告(一) 091180083刘浩通信工程一、实验目的了解嵌入式系统的开发环境,内核的下载和启动过程;了解Linux内核源代码的目录结构及相关内容;了解Linux内核各配置选项的内容和作用;掌握Linux内核的编译过程;理解嵌入式操作系统文件系统的类型和作用;了解jffs2文件系统的优点及其在嵌入式系统中的作用;掌握busybx软件制作嵌入式文件系统的方法;掌握Linux嵌入式文件系统的挂载过程。
二、嵌入式系统开发实验1、mini和tftp(1)串口通信的硬件基础:嵌入式系统一般通过异步串行接口(UART)进行初级引导。
本实验中用到的是RS-232C标准的接口。
(2)软件结构:mini 运行mini,Ctrl+A-进入mini的cnfiguratin界面。
对串行通信接口进行配置,如串行通信口的设置,波特率、数据位等串口参数的设置。
保存好设置后以后可以不用再设置。
(3)btlader引导:给开发板加电,任意按下一个键进入btlader界面。
可以通过命令行方式进行设置,按0进入命令行模式,出现 51bard,可以设置开发板和pc机的ip地址:set myipaddr 192.168.207.113(设置开发板的ip地址),set destipaddr 192.168.207.13(设置pc机的ip地址)。
注意ip地址的设置:使其处于同一网段,并且避免和其他系统的ip发生冲突。
(4)通过btlader的主菜单可以完成很多功能,3——下载内核,4——将内核烧进flash,5——下载文件系统,6——将文件系统烧进flash,7——启动嵌入式操作系统等。
由于btlader需要从服务器上下载内核和文件系统,一般采用tftp服务。
进入/etc/xinetd.d/tftp修改配置,注意一定要关闭防火墙,否则可能导致下载时出问题。
再设置完后要重新启动tftp服务。
文件系统 实验报告
文件系统实验报告引言文件系统是操作系统中的一部分,用于管理计算机中的文件和目录。
它提供了数据的存储、访问、组织和管理功能,是操作系统的基础之一。
本实验通过实现一个简单的文件系统来深入理解文件系统的原理和实现方式。
实验目的1. 了解文件系统的基本概念和原理;2. 学习文件系统的设计和实现方法;3. 掌握文件系统的基本操作。
实验环境本次实验使用的是Ubuntu 20.04操作系统。
实验步骤1. 文件系统的设计在开始实现文件系统之前,我们首先需要设计文件系统的结构和功能。
1.1 文件系统的结构文件系统通常由三个主要部分组成:文件控制块、目录和数据块。
文件控制块用于存储文件的属性和元数据,目录用于组织文件和子目录,数据块用于存储文件的实际内容。
1.2 文件系统的功能文件系统需要提供以下功能:- 文件的创建、读取、修改和删除;- 目录的创建、读取、修改和删除;- 文件和目录的查找;- 文件的权限管理。
2. 文件系统的实现2.1 文件系统的初始化在实现文件系统之前,我们首先需要初始化文件系统。
包括创建超级块、位图和根目录,并将它们写入磁盘。
2.2 文件和目录的操作在文件系统中,我们需要实现文件和目录的基本操作,包括创建文件、创建目录、读取文件内容、修改文件内容和删除文件。
2.3 文件系统的其他操作除了基本的文件和目录操作之外,文件系统还需要实现其他一些功能,如文件查找、权限管理等。
3. 文件系统的测试在完成文件系统的实现后,我们需要对其进行测试,以验证其功能是否正常。
3.1 创建文件和目录我们首先创建一些文件和目录,检查它们是否被正确地写入磁盘,并且能够被正确地读取。
3.2 读取和修改文件我们随机选择一些文件,读取它们的内容,并对其内容进行修改。
修改后,我们再次读取文件,确保修改成功。
3.3 删除文件和目录我们尝试删除一些文件和目录,并检查它们是否被成功地删除。
4. 结果与讨论经过测试,我们发现我们实现的文件系统功能正常,能够按照我们的预期进行文件和目录的创建、读取、修改和删除等操作。
简单文件系统模拟实验
简单文件系统模拟实验实验目的通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统功能和实现过程的理解。
实验内容▪在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个简单的单用户文件系统。
在退出这个简单文件系统时,应将该虚拟文件系统保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘上。
▪文件存储空间的分配可以采用显式链接分配或其它方法。
▪空闲空间的管理可以选择位示图或其它方法。
如果采用位示图来管理文件存储空间,并采用显式链接分配方式,可以将位示图合并到FAT中。
▪文件目录结构采用多级目录结构。
为简单起见,可以不使用索引结点,其中的每个目录项包含文件名、物理地址、文件长度等信息,还可以通过目录项实现对文件读和写的保护。
▪要求提供以下有关的文件操作:✧Format:对文件存储器进行格式化,即按照文件系统的结构对虚拟磁盘空间进行布局,并在其上创建根目录以及用于管理文件存储空间等的数据结构。
✧Mkdir:用于创建子目录。
✧Rmdir:用于删除子目录。
✧Ls:用于显示目录。
✧Cd:用于更改当前目录。
✧Create:用于创建文件。
✧Open:用于打开文件。
✧Close:用于关闭文件。
✧Write:用于写文件。
✧Read:用于读文件。
✧Rm:用于删除文件。
数据结构设计磁盘:整个磁盘为一个char数组,数组中的每一个元素当做是一个扇区,每个扇区可以存储1个字节的信息,簇大小为8字节。
FAT表:存储的是指定编号的簇的下一个簇的编号是什么,因为文件是有可能分散在很多的簇里。
文件和文件夹链表:设计为静态链表,每个文件夹都会有一个子目录列表,存在链表中。
文件和目录表:文件和目录相同对待,信息存放在文件目录表中,为一个数组类型。
以上所有的信息存放在一个fs结构体中,所有的结构都为静态实现,所以需要将文件系统存放到磁盘中的时候只需要将整个结构体以二进制性质存放到文件中或者是将从文件中以二进制形式读取。
简单文件系统实验
strcpy(UFD[i].Udir[k].fname,fnameA[j].fname);
fnameA[j].flag=1;
struct mfd {
char uname[10];/* 用户名 */
UF Udir;/* 用户文件目录 */
} UFD[UserNumber];/* 用户 */
void intFSystem(){
int i,j,k,l;
printf("write?(1 yes,0 no):");
scanf("%d",&UFD[i].Udir[k].fprotect[1]);
printf("run?(1 yes,0 no):");
scanf("%d",&UFD[i].Udir[k].fprotect[2]);
UFD[i].Udir[k].flag=1;
return;}
பைடு நூலகம்
void Delete(int i){char file[10]; int k;
UFD[i].Udir[k].flength=rand()%2048+1;
UFD[i].Udir[k].flag=1;
UFD[i].Udir[k].fprotect[0]=rand()%2;
AFD[l].flag=0;
AFD[l].opfprotect[0]=0;
AFD[l].opfprotect[1]=0;
AFD[l].opfprotect[2]=0;
}
}
文件系统的构建实验报告
文件系统的构建实验报告 实验名称:文件系统的构建实验目的:掌握磁盘的工作原理和操作系统进行文件管理的原理实验原理:硬盘的MBR :MBR (Main Boot Record ),按其字面上的理解即为主引导记录区,位于整个硬盘的0磁道0柱面1扇区。
在总共512字节的主引导扇区中,MBR 只占用了其中的446个字节(偏移0000--偏移01BD ),另外的64个字节(偏移01BE--偏移01FD )交给了DPT(Disk Partition Table 硬盘分区表),最后两个字节"55,AA"(偏移01FE- 偏移01FF )是分区的结束标志。
这个整体构成了硬盘的主引导扇区。
硬盘依据分区表中的信息把硬盘划分为最多四个分区(对于扩展分区,可进一步划分为多个逻辑分区)。
U 盘采用类似的方法划分分区。
每个分区或软盘上可建立独立的文件系统。
下图是FAT 文件系统空间分布结构。
实验内容:在掌握磁盘的工作原理和操作系统进行文件管理原理的基础上,自行设计实现在磁盘上建立文件系统的软件,该软件应该具有与Format 类似的功能,至少支持一种文件系统格式,如FAT 、NTFS 或EXT2,至少能够对一种媒体进行格式化,如软盘,U 盘或硬盘(不得在实验室的机器上进行硬盘格式化的实验)等。
不能直接调用操作系统提供的格式化工具或类似SHFormatDrive ()的高层系统函数实现该软件。
在Windows 环境可使用biosdisk()函数完成底层盘操作,在Linux 环境上可参考format 的源代码。
比较自己设计实现的软件.与FORMAT ,分析存在什么异同。
背景知识介绍 一个分区或磁盘能作为文件系统使用前,需要初始化,并将记录数据结构写到磁盘上。
这个过程就叫建立文件系统。
大部分linux 文件系统种类具有类似的通用结构。
其中心概念是超级块superblock, i 节点inode, 数据块data block,目录块directory block, 和间接块indirection block 。
文件管理实验报告结果(3篇)
第1篇一、实验目的本次实验旨在通过实际操作,验证文件管理的有效性和可行性,并对文件管理系统的性能进行评估。
通过实验,了解文件管理的相关原理和方法,提高文件管理的实践能力。
二、实验环境1. 操作系统:Windows 102. 文件管理系统:Windows文件管理器3. 实验数据:实验过程中产生的文件和数据三、实验内容1. 文件创建与删除2. 文件夹创建与删除3. 文件与文件夹的复制、移动、重命名4. 文件属性的设置与修改5. 文件搜索与查找6. 文件权限管理7. 文件压缩与解压四、实验步骤1. 文件创建与删除(1)在Windows文件管理器中,新建一个名为“实验文件.txt”的文本文件。
(2)在“实验文件.txt”上右击,选择“删除”,确认删除。
2. 文件夹创建与删除(1)在Windows文件管理器中,新建一个名为“实验文件夹”的文件夹。
(2)在“实验文件夹”上右击,选择“删除”,确认删除。
3. 文件与文件夹的复制、移动、重命名(1)将“实验文件.txt”复制到“实验文件夹”中。
(2)将“实验文件.txt”移动到桌面。
(3)将“实验文件.txt”重命名为“实验文件修改.txt”。
4. 文件属性的设置与修改(1)在“实验文件修改.txt”上右击,选择“属性”,设置文件属性为“只读”。
(2)修改“实验文件修改.txt”的属性为“隐藏”。
5. 文件搜索与查找(1)在Windows文件管理器中,输入“实验文件”进行搜索。
(2)使用“查找”功能,查找“实验文件修改.txt”。
6. 文件权限管理(1)在“实验文件夹”上右击,选择“属性”,点击“安全”标签。
(2)添加用户权限,设置权限为“完全控制”。
7. 文件压缩与解压(1)将“实验文件夹”压缩为“实验文件夹.zip”。
(2)解压“实验文件夹.zip”到指定位置。
五、实验结果与分析1. 文件创建与删除:实验成功创建和删除了文件,验证了文件管理的可行性。
2. 文件夹创建与删除:实验成功创建和删除了文件夹,验证了文件管理的可行性。
文件系统实验报告
一、实验目的1. 理解文件系统的基本概念和组成。
2. 掌握文件系统的创建、删除、修改和查询等基本操作。
3. 了解文件系统的性能分析和优化方法。
4. 提高对文件系统原理的理解和实际操作能力。
二、实验环境1. 操作系统:Windows 102. 文件系统:NTFS3. 实验软件:Windows资源管理器、Notepad++等三、实验内容1. 文件系统的基本概念和组成(1)文件:存储在文件系统中的数据单元,可以是程序、文档、图片等。
(2)目录:用于组织文件的结构,类似于文件夹。
(3)文件系统:管理存储设备上文件和目录的数据结构。
2. 文件系统的创建、删除、修改和查询等基本操作(1)创建文件:使用Notepad++创建一个名为“test.txt”的文本文件。
(2)创建目录:在Windows资源管理器中,创建一个名为“test”的目录。
(3)删除文件:选中“test.txt”文件,按Delete键删除。
(4)删除目录:选中“test”目录,按Delete键删除。
(5)修改文件:使用Notepad++打开“test.txt”文件,修改内容后保存。
(6)查询文件:在Windows资源管理器中,通过路径或搜索功能查找“test.txt”文件。
3. 文件系统的性能分析和优化方法(1)查看磁盘空间使用情况:在Windows资源管理器中,选中磁盘分区,查看磁盘空间使用情况。
(2)清理磁盘:使用Windows自带的磁盘清理工具清理磁盘垃圾文件。
(3)优化文件系统:使用Windows自带的磁盘碎片整理工具优化文件系统。
四、实验结果与分析1. 创建文件和目录实验结果显示,使用Notepad++创建了一个名为“test.txt”的文本文件,使用Windows资源管理器创建了一个名为“test”的目录。
2. 删除文件和目录实验结果显示,成功删除了“test.txt”文件和“test”目录。
3. 修改文件实验结果显示,使用Notepad++修改了“test.txt”文件的内容,并成功保存。
文件系统设计实验报告
文件系统设计试验报告班级:10网工三班学生姓名:谢昊天学号:1215134046实验目的和要求:通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。
实验内容与分析设计:为linux系统设计一个简单的二级文件系统。
要求做到以下几点:(1)可以实现下列几条命令(至少4条);login 用户登陆dir 列文件目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件(2)列目录时要列出文件名、物理地址、保护码和文件长度;(3)源文件可以进行读写保护。
实验提示(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
(2)用户创建的文件,可以编号存储于磁盘上。
如file0,file1,file2...并以编号作为物理地址,在目录中进行登记。
实验步骤与调试过程:用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。
另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。
主要数据结构:1.I节点 2.磁盘i结点 3.目录项结构 4.超级块 5.用户密码 6.目录 7.查找i 内存节点的hash表 8.系统打开表 9.用户打开表设置:主要函数1.i节点内容获取函数iget()(详细描述略)。
2.节点内容释放函数iput()(详细描述略)。
3.目录创建函数mkdir()(详细描述略)。
4.目录搜索函数namei()(详细描述略)。
5.磁盘块分配函数balloc()(详细描述略)。
6.磁盘块释放函数bfree()(详细描述略)。
7.分配i节点区函数ialloc()(详细描述略)。
8.解释结点区函数ifree()(详(详细描述略)。
10.访问控制函数access 细描述略)。
9.搜索当前目录下文件的函数iname()()(详细描述略)。
Lniux文件系统实验报告
实验五文件系统
一、实验目的
1.掌握Linux系统下fdisk命令的用法。
2.掌握Linux系统下文件系统的创建、挂载与卸载。
3.掌握Linux系统下利用RAID技术实现磁盘冗余阵列的方法。
二、实验内容
1.磁盘分区管理
2.动态磁盘管理
三、实验指导
1.服务器现需要新建一块20GB的硬盘,需要对新增的硬盘进行分区管理、分区方案为/user目录所在分区10GB,/backup目录所在分区5GB,/home目录所在分区5GB。
步骤一,添加新硬盘
点击“编辑虚拟机设置”按钮,如下图
选择添加硬盘,如下图
下一步选择“SCSI(S)推荐”,如下图
下一步创建“新虚拟磁盘”,设置磁盘空间大小为“20GB”,如下图所示
单击完成,即完成了新硬盘的添加,如下图所示
通过fdisk -l命令查看新硬盘是否添加成功
步骤二,利用fdisk命令对/dev/sdb/进行分区
步骤三,格式化新建分区,在各分区上建立ext3类型的文件的系统,建立时要求检查磁盘坏块并显示详细信息。
步骤四,将/dev/sdb1挂载到/user目录,/dev/sdb2挂载到
/backup目录,/dev/sdb3挂载到/home目录
2、某公司的Linux服务器新增两块硬盘,硬盘大小为40GB。
为了实现数据保护功能,现需利用2块硬盘创建RAID1卷。
要求创建的RAID设备名为/dev/md110,并利用mkfs命令创建ext3文件系统。
最后将文件系统挂载到系统上。
四、实验总结
通过本次实验,我学习到fdisk 的一些命令和在Linux 系统下利用RAID 技术实现磁盘冗余阵列的方法。
简单文件系统的实现实验报告
操作系统课程设计报告简单文件系统的实现专业:班级:姓名:学号:老师:一、课程设计的目的1. 通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部数据结构、功能以及实现过程的理解。
二、课程设计要求1. 在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的单用户单任务系统中的文件系统。
在退出该文件系统的使用时,应将该虚拟文件系统以一个Windows 文件的方式保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。
2文件存储空间的分配可采用显式链接分配或其他的办法。
3空闲磁盘空间的管理可选择位示图或其他的办法。
如果采用位示图来管理文件存储空间,并采用显式链接分配方式,那么可以将位示图合并到FAT中。
文件目录结构采用多级目录结构。
为了简单起见,可以不使用索引结点,其中的每个目录项应包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
要求提供以下有关的操作命令:my_format:对文件存储器进行格式化,即按照文件系统的结构对虚拟磁盘空间进行布局,并在其上创建根目录以及用于管理文件存储空间等的数据结构。
my_mkdir:用于创建子目录。
my_rmdir:用于删除子目录。
my_ls:用于显示目录中的内容。
my_cd:用于更改当前目录。
my_create:用于创建文件。
my_open:用于打开文件。
my_close:用于关闭文件。
my_write:用于写文件。
my_read:用于读文件。
my_rm:用于删除文件。
my_exitsys:用于退出文件系统。
三、程序的设计细想和框图1.打开文件函数fopen()(1)格式:FILE *fopen(const char *filename,const char *mode)(2)功能:按照指定打开方式打开指定文件。
(3)输入参数说明:filename:待打开的文件名,如果不存在就创建该文件。
实验8文件系统
接着是创建一个test.txt文件,输入vi test.txt命令回车后,接着在里面
输入一些内容,如下所示:
保存后,返回到user_test目录下,输入ls后,如下所示:
然后建立一个test.txt文件的链接test02,输入link test.txt test02回车后,如下
然后我们输入ls命令,发现user目录下,没有如何东西,如是我们创建一个叫user_test的目录,输入mkdir user_test命令回车后,如下所示:
然后输入ls后,可以看到/user下,有了一个叫user_test的目录,如下所示:
然后打开user_test目录,输入cd user_test命令回车后,如下所示:
以上的显示结果,我们就可以知道MemTotal和Cached获取出来的数
据都是对的,这个实验大概完成。
3)实现文件的拷贝,即把一个文件内容复制到另一个文件。
答:这这个实验中,首先在student下建一个名字叫test1.txt的文件,并在里面添加相关的内容,用于作为被拷贝的文件,如下所示:
接着是创建一个copy.c文件,输入vi copy.c,并输入相关的代码后,实现文件
答:首先在linux下输入su -,如下所示:
然后输入密码:123456回车后,进入系统根目录,并获得超级用户的权利,
如下所示:
然后输入ls查看目录后,发现没有user目录,如下所示:
所以我给系统创建一个叫user的目录,如下所示:
输入ls查看目录后,可以看到已经有user目录存在了,如下所示:
然后我们进入到user下,输入cd user命令进入,如下所示:
接着我们查看test2.txt文件的内容,输入cat test2.txt回车后,显示如下
简单文件资料系统的实现实验报告材料
操作系统课程设计报告简单文件系统的实现专业:班级::学号:老师:一、课程设计的目的1. 通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统部数据结构、功能以及实现过程的理解。
二、课程设计要求1. 在存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的单用户单任务系统中的文件系统。
在退出该文件系统的使用时,应将该虚拟文件系统以一个Windows 文件的方式保存到磁盘上,以便下次可以再将它恢复到存的虚拟磁盘空间中。
2文件存储空间的分配可采用显式分配或其他的办法。
3空闲磁盘空间的管理可选择位示图或其他的办法。
如果采用位示图来管理文件存储空间,并采用显式分配方式,那么可以将位示图合并到FAT中。
文件目录结构采用多级目录结构。
为了简单起见,可以不使用索引结点,其中的每个目录项应包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
要求提供以下有关的操作命令:my_format:对文件存储器进行格式化,即按照文件系统的结构对虚拟磁盘空间进行布局,并在其上创建根目录以及用于管理文件存储空间等的数据结构。
my_mkdir:用于创建子目录。
my_rmdir:用于删除子目录。
my_ls:用于显示目录中的容。
my_cd:用于更改当前目录。
my_create:用于创建文件。
my_open:用于打开文件。
my_close:用于关闭文件。
my_write:用于写文件。
my_read:用于读文件。
my_rm:用于删除文件。
my_exitsys:用于退出文件系统。
三、程序的设计细想和框图1.打开文件函数fopen()(1)格式:FILE *fopen(const char *filename,const char *mode)(2)功能:按照指定打开方式打开指定文件。
(3)输入参数说明:filename:待打开的文件名,如果不存在就创建该文件。
mode:文件打开方式,常用的有:"r":为读而打开文本文件(不存在则出错)。
操作系统实验四 文件系统实验
return
scanf("%s",s); strcpy(t->fileName,s); printf("\n 请输入该文件基本信息:"); scanf("%s",s); strcpy(t->file,s); t->brother=t->child=NULL; if(p->child==NULL) {
goto label; } p=p->next; } printf("文件不存在!\n"); goto label; } else if(i==8) { show(f); goto label; } else { goto label; } } void Select() { char username[20]; int i; printf("请输入用户名:\n"); scanf("%s",username); for(i=0; i<userNum; i++) { if(!strcmp(mdf[i].userName,username)) { fp= mdf[i].p; if(fp!=NULL) {
printf("该用户已创建文件:\n"); while(fp!=NULL) {
fp=fp->next; printf("%s\n",fp->fileName); } } else { printf("该用户尚未创建任何文件!\n"); } fp= mdf[i].p; Operation(fp); }
#include <stdio.h> #include <stdlib.h> #include <string.h> #define getpch(type) (type*)malloc(sizeof(type)) int userNum=0;
文件系统实验报告
文件系统实验报告实验四文件系统实验一.目的要求1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
2、要求设计一个n个用户的文件系统,每次用户可保存m 个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。
二.例题:1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。
2、程序采用二级文件目录和用户文件目录。
另外,为打开文件设置了运行文件目录。
3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。
4、算法与框图:①因系统小,文件目录的检索使用了简单的线性搜索。
②文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。
③程序中使用的主要设计结构如下:主文件目录和用户文件目录打开文件目录文件系统算法的流程图如下:三. 实验题:1、增加2~3个文件操作命令,并加以实现。
#include#include#include#include#define MAXSIZE 100#define ADDSIZE 50#define PT elem+l-> length#define N 4typedef struct term{/*班级和学期的结构体*/char class1[10];char term1[10];}term;typedef struct student{/*学生成绩信息的结构体*/ term st;/*班级和学期结构体放于此结构体中*/ char num[10];char name[12];float course[4];float total;float average;int bit;}lnode,*stu;typedef struct{lnode *elem;/*指向上个结构体的指针*/int size;/*最大能放lnode结构体成员的个数*/ int length;/*当前长度*/}sqack,*sq;sqack *l;void init/*动态分配存储空间*/{l-> elem=malloc);l-> length =0;l-> size=MAXSIZE;}void input/*输入学生的信息*/{lnode *newbase,*p;char cla[10],ter[10],ch;int n,i;if{newbase=realloc*sizeof);/*追加存储空间*/ l-> elem =newbase;l-> size +=ADDSIZE;}p=l-> elem;do{printf;gets;gets;printf;scanf;printf;for{scanf;strcpy;strcpy;++l-> length ;}printf “);ch=getchar;}while;}void change/*修改学生的信息*/{lnode *p;lnode e;int flag=1,i;char s1[10],num1[10];printf:\n “);gets;gets;p=l-> elem ;while && flag==1)/*查找要修改的学生的信息*/ {if==0&&strcmp==0)flag=0;/*找到了*/p++;}p--;if printf;printf;forprintf;printf;printf;scanf;forscanf;*p=e;}void same /*把学期和班级相同的学生信息放在结构体数组tt 中*/ {int i=0;lnode *p,*q;q=t;p=l-> elem ;while{if==0&&strcmp==0){*q=*p;q++;i++;}p++;*k=i;}void sort/*按学生成绩从高到低排序函数*/ {int i;lnode *q,temp;for{q-> total =0;forq-> total =q-> total +q-> course [i];q-> average =q-> total /N;}forforif-> total){temp=*q;*q=*;*=temp;}}void print/*输出学生的成绩*/lnode *p;p=q;for{printf;forprintf;printf;printf;}}void stat/*统计学生的成绩*/ {lnode tt[50];char ter[10],clas[10];int i,k;printf:\n “);forter[i]=getchar;forclas[i]=getchar;same;/*把学期和班级相同的学生信息放在结构体数组tt中*/ sort;/*按学生成绩从高到低排序函数*/print;/*输出学生的成绩*/}void search1/*按学号查*/{lnode *p;char ter1[10];int i,flag=1;p=l-> elem;printf;gets;for{if==0){flag=0;printf;printf;forprintf;printf;printf;}}if printf;}void search2/*按姓名查*/ {lnode *p;char ter1[10];int i,flag=1;p=l-> elem;printf;gets;for{if==0){flag=0;printf;printf;forprintf;printf;}}if printf ;}void search/*查找学生的成绩*/ {char ch;do{printf;ch=getchar;switch{case ‘1 ‘:search1;break;case ‘2 ‘:search2;break;default:}printf “);ch=getchar;} while;}void fail/*查找不及格及学生名单*/ {int i;lnode *p;for{forif{printf;forprintf;printf;printf;}}}void output/*按班级输出学生的成绩单*/{lnode tt[50];int k;char clas[10],ter1[10];printf; gets;gets;same;/*把学期和班级相同的学生信息放在结构体数组tt中*/ print;/*输出学生的成绩*/}试验四文件系统一、实验目的1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
模拟文件系统实验报告
操作系统大型试验实验报告姓名:XX班级:软件工程110x学号:201126630xxx一、名称操作系统大型试验。
二、目的用C++编写出一个简单的模拟文件系统,实现目录的添加、删除、重命名,文件的添加、删除、重命名、文件和目录、文件的拷贝。
三、要求开发工具:word,vc win32api1.设计和实现一个简单的文件系统,要求包括目录、普通文件和文件的存储2.文件系统的目录结构采用类似Linux的树状结构;3.要求模拟的操作包括:a)目录的添加、删除、重命名;b)目录的显示(列表)c)文件的添加、删除、重命名d)文件和目录的拷贝4.用户进入时显示可用命令列表;用户输入help时显示所有命令的帮助文档;输入某个命令+?时显示该条命令的使用说明5.用户输入exit时退出该系统6.实验实现基于windows平台;7.实验开发语言可以选用C/c++等四、设计1.主要思路说明本模拟系统通过一个大小固定的数组要代表物理盘块,假设共有1024块,新增目录占一块,新增文件占一块,文件中可输入内容,内容假设定义为5个字符占一块,超出则应新申请空间。
模拟物理盘块的数组中,数组内容为-99代表改物理盘块内容为空,可使用,其他数字均代表该物理盘块被占用,其中-3代表是占用文件的末结点,其他整数代表是文件内容的下一个寻址下标,另有一个string类型的数组来存储内容,模拟文件写入了对应下标的物理盘块中。
设置了一个全局指针指向根结点,一个全局指针指向当前操作目录。
搜索空白物理盘块时采用顺序搜索物理盘块数组。
存储形式主要采用类似二叉树结构,如目录为根,目录下的第一个文件或目录存在根的子节点,目录下的其他文件或目录存在第一个文件或目录的兄弟节点,以此类推。
本程序仅seperate()函数使用现成代码,此函数功能为将输入命令串分离,仅仅起到美观作用,其余所有代码均为原创!2.申优功能:1)能实现动态增长,即当输入文件的内容大小大于分配的模拟物理盘块时系统能够自动寻找空物理盘块并分配,将超出的内容保存在新的物理盘块中,若超出模拟磁盘大小,则超出部分不保存且返回提示。
文件系统实验报告
char name[12];
curuser = getspace(MFD);
while(1)
{
cout<<"\n ;<endl;
cout<<"用户名:";
cin>>name; //输入用户注册名
}
}
void DisplayUFD()//打印用户信息,包括用户的各个文件
//名称、长度和操作权限的设置信息
{
if(curuser->filepoint == false)//当前用户目录下没有任何文件存在
cout<<"\n用户 "<<curuser->username<<" 文件夹是空的"<<endl;
二、实验题目:
采用二级目录结构实现磁盘文件操作。
要求:
1.普通文件的目录项包括文件名,文件类型,文件长度,指向文件内容的指针内容。
2.目录文件的目录项包括目录名,指向下一级目录块的指针内容。假定每个目录文件最多只能占用一个块;
3.程序功能方面的要求: 需要实现一个命令行操作界面,包含如下命令:
4.程序实现方面的要求:
{
cout<<"\n保存错误。";//fclose(infile);
return;
}
else
{
if((outfile=fopen(out,"wb+"))==NULL)//申请一个缓冲区管理模块
实验四 文件系统实验
实验四文件系统实验一 . 目的要求1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
2、要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。
二 . 实验题目1、增加 2~3个文件操作命令,并加以实现。
(如移动读写指针,改变文件属性,更换文件名,改变文件保护级别)。
2、编一个通过屏幕选择命令的文件管理系统,每屏要为用户提供足够的选择信息,不需要打入冗长的命令。
3、设计一个树型目录结构的文件系统,其根目录为 root,各分支可以是目录,也可以是文件,最后的叶子都是文件。
4、根据学校各级机构,编制一文件系统。
程序运行结果如下:实验过程与结果:(可写多页)1)程序运行时,首先提示输入一个用户名(字母表示,a~z):2)输入的用户名不存在时,提示;否则,打开相应用户的文件列表:3)每个用户最多可以保存10个文件,超出时将提示出错。
当进行删除文件操作时,运行结果如下:程序源代码(C++):#include<iostream>#include<string>#include<conio.h>using namespace std;struct TYPE_UFD //用户文件目录{string File_Name; //文件名bool Read; //读保护码,true为可读bool Write; //写保护码,true为可写bool Execute; //执行保护码,true为可执行int Length_File; //文件长度};struct TYPE_MFD //主文件目录{string User_Name; //用户名TYPE_UFD *Pointer; //用户文件目录指针};struct TYPE_AFD //打开文件目录{int File_ID; //打开的文件号bool Read; //读保护码,true为可读bool Write; //写保护码,true为可写bool Execute; //执行保护码,true为可执行int Pointer; //读写指针};class TYPE_FILE_SYSTEM //文件系统类{public:void Initial( void ); //初始化void Start( void ); //开始运行文件系统private:int _Number_Users; //用户的数量int _Number_Files; //每个用户可保存的文件数int _MaxNumber_Open_Files; //每个用户在每次执行中打开的最大文件数TYPE_MFD *_MFD; //主文件目录TYPE_UFD *_UFD; //用户文件目录TYPE_AFD *_AFD; //运行文件目录};main() //主函数{TYPE_FILE_SYSTEM FS;FS.Initial();FS.Start();return 0;}void TYPE_FILE_SYSTEM::Initial( void ){_Number_Users = 10;_Number_Files = 10;_MaxNumber_Open_Files = 5;//UFD的初始化_UFD = new TYPE_UFD [_Number_Users*_Number_Files];/////////////////////////////////////MFD的初始化_MFD = new TYPE_MFD [_Number_Users];for( int i=0 ; i<_Number_Users ; i++ ){_MFD[i].Pointer = &(_UFD[i*_Number_Files]);}/////////////////////////////////////AFD的初始化_AFD = new TYPE_AFD [_MaxNumber_Open_Files];////////////////////////////////////////_MFD[0].User_Name = "YANGFAN";_UFD[0].File_Name = "YANGFAN1.txt";_UFD[0].Length_File = 10;_UFD[0].Read = true;_UFD[0].Write = false;_UFD[0].Execute = true;_UFD[1].File_Name = "YANGFAN2.txt";_UFD[1].Length_File = 20;_UFD[1].Read = true;_UFD[1].Write = false;_UFD[1].Execute = false;for( i=2 ; i<_Number_Files ; i++ ){_UFD[i].File_Name = "";_UFD[i].Length_File = -1; //表示没有文件_UFD[i].Read = false;_UFD[i].Write = false;_UFD[i].Execute = false;}///////////////////////////////////////}void TYPE_FILE_SYSTEM::Start( void ){int User_ID;int i,temp_int;string temp;char choice;int Number_Open_Files; //当前用户打开的文件数string User_Name; //当前登录的有户名string Command; //当前用户输入的命令TYPE_UFD *UFD; //当前登录的用户的文件目录do //计算机开机{do //用户登录{cout << "User name:";cin >> User_Name;//在MFD中查找该用户for( User_ID=0 ; User_ID<_Number_Users ; User_ID++ ){if( _MFD[User_ID].User_Name == User_Name )break;}if( User_ID == _Number_Users )cout << "Bad user name , please try again ." << endl;}while( User_ID == _Number_Users );cout << "Ok , welcome to login , " << User_Name << " !" << endl;UFD = _MFD[User_ID].Pointer;//初始化运行文件列表for( i=0 ; i<_MaxNumber_Open_Files ; i++ ){_AFD[i].File_ID = -1;}Number_Open_Files = 0;////////////////////////////////////////////////////////do{//接收命令cout << "C:\\" << User_Name << ">" ;cin >> Command;///////////////////////////////////////////////////////if( Command == "dir" ){//显示用户文件列表cout << endl;cout << "Files of user " << User_Name << endl;cout << "\t" << "State\t" << "Length\t" << "File name" << endl;for( i=0 ; i<_Number_Files ; i++ ){if( UFD[i].Length_File != -1 ) //该文件项不空{//打印文件状态,即保护码cout << "\t" ;if( UFD[i].Read == true )cout << "R";elsecout << "-";if( UFD[i].Write == true )cout << "W";elsecout << "-";if( UFD[i].Execute == true )cout << "E";elsecout << "-";//打印文件长度cout << "\t";cout << UFD[i].Length_File;//打印文件名cout << "\t";cout << UFD[i].File_Name << endl;}}cout << endl;////////////////////////////////////////////////////////}else if( Command == "diropen" ){//显示用户文件列表cout << endl;cout << "Opening Files of user " << User_Name << endl;cout << "\t" << "State\t" << "Open File name" << endl;for( i=0 ; i<_MaxNumber_Open_Files ; i++ ){if( _AFD[i].File_ID != -1 ) //该文件项不空{//打印文件状态,即保护码cout << "\t" ;if( _AFD[i].Read == true )cout << "R";elsecout << "-";if( _AFD[i].Write == true )cout << "W";elsecout << "-";if( _AFD[i].Execute == true )cout << "E";elsecout << "-";//打印文件名cout << "\t";cout << UFD[_AFD[i].File_ID].File_Name << endl;}}cout << endl;////////////////////////////////////////////////////////}else if( Command == "create" ){//查找是否该用户还有空的文件项,即是否还可以新建文件for( i=0 ; i<_Number_Files ; i++ )if( UFD[i].Length_File == -1 )break;if( i == _Number_Files )cout << "Error: you have already had " << _Number_Files << " files ." << endl;else{cout << "Please enter the information of the new file:" << endl;cout << "File name : ";cin >> temp;UFD[i].File_Name = temp;/////////////////////////////////////////////readcout << "Read (y/n):";do{choice = getch();}while( choice!='y' && choice!='n' );if( choice == 'y' )UFD[i].Read = true;elseUFD[i].Read = false;cout << endl;/////////////////////////////////////////////////////////////////////////////////////////writecout << "Write (y/n):";do{choice = getch();}while( choice!='y' && choice!='n' );if( choice == 'y' )UFD[i].Write = true;elseUFD[i].Write = false;cout << endl;/////////////////////////////////////////////////////////////////////////////////////////executecout << "Execute (y/n):";do{choice = getch();}while( choice!='y' && choice!='n' );if( choice == 'y' )UFD[i].Execute = true;elseUFD[i].Execute = false;cout << endl;/////////////////////////////////////////////////////////////////////////////////////////lengthcout << "Length :";cin >> temp_int;if( temp_int > 0 )UFD[i].Length_File = temp_int;////////////////////////////////////////////cout << "Ok , the new file " << UFD[i].File_Name << " is created!" << endl;}}else if( Command == "delete" ){cout << "Please enter the file name :";cin >> temp;//查找要删除的文件名for( i=0 ; i<_Number_Files ; i++ )if( (UFD[i].Length_File!=-1)&&(UFD[i].File_Name==temp) )break;if( i == _Number_Files ) //没找到这个文件名的文件cout << "Bad file name , please try again ." << endl;else //成功找到文件{UFD[i].Length_File = -1; //删除文件cout << "Ok , the file " << UFD[i].File_Name << " is deleted ." << endl;}}else if( Command == "open" ){if( Number_Open_Files == _MaxNumber_Open_Files )cout << "Error: you have already opened " << Number_Open_Files << " files." << endl;else{cout << "Please enter the file name :";cin >> temp;//查找要打开的文件名for( i=0 ; i<_Number_Files ; i++ )if( (UFD[i].Length_File!=-1)&&(UFD[i].File_Name==temp) )break;if( i == _Number_Files ) //没找到这个文件名的文件cout << "Bad file name , please try again ." << endl;else{Number_Open_Files++;for( temp_int=0 ; temp_int<_MaxNumber_Open_Files ; temp_int++ )if( _AFD[temp_int].File_ID == -1 )break;_AFD[temp_int].File_ID = i;_AFD[temp_int].Pointer = 0;cout << "Please configure the open mode :" << endl;/////////////////////////////////////////////readif( UFD[i].Read == true ){cout << "Read (y/n):";do{choice = getch();}while( choice!='y' && choice!='n' );if( choice == 'y' )_AFD[temp_int].Read = true;else_AFD[temp_int].Read = false;cout << endl;}else_AFD[temp_int].Read = false;/////////////////////////////////////////////////////////////////////////////////////////writeif( UFD[i].Write == true ){cout << "Write (y/n):";do{choice = getch();}while( choice!='y' && choice!='n' );if( choice == 'y' )_AFD[temp_int].Write = true;else_AFD[temp_int].Write = false;cout << endl;}else_AFD[temp_int].Write = false;/////////////////////////////////////////////////////////////////////////////////////////executeif( UFD[i].Execute == true ){cout << "Execute (y/n):";do{choice = getch();}while( choice!='y' && choice!='n' );if( choice == 'y' )_AFD[temp_int].Execute = true;else_AFD[temp_int].Execute = false;cout << endl;}else_AFD[temp_int].Execute;cout << "Ok , the file " << temp << " is open ." << endl;}}}else if( Command == "logout" ){cout << "Ok , see you later , " << User_Name << " !" << endl;break;}else if( Command == "close" ){cout << "Please enter the file name :";cin >> temp;//查找要打开的文件名for( i=0 ; i<_Number_Files ; i++ )if( (UFD[i].Length_File!=-1)&&(UFD[i].File_Name==temp) )break;if( i == _Number_Files ) //没找到这个文件名的文件cout << "Bad file name , please try again ." << endl;else{//找到了这个文件for( temp_int=0 ; temp_int<_MaxNumber_Open_Files ; temp_int++ )if( _AFD[temp_int].File_ID == i )break;if( temp_int == _MaxNumber_Open_Files ) //该文件没有处于执行状态cout << "The file " << temp << " isn't open ." << endl;else //该文件处于执行状态{_AFD[temp_int].File_ID = -1;Number_Open_Files--;cout << "Ok , the file " << temp << " is closed ." << endl;}}}else if( Command == "read" ){cout << "Please enter the file name :";cin >> temp;//查找要打开的文件名for( i=0 ; i<_Number_Files ; i++ )if( (UFD[i].Length_File!=-1)&&(UFD[i].File_Name==temp) )break;if( i == _Number_Files ) //没找到这个文件名的文件cout << "Bad file name , please try again ." << endl;else{//找到了这个文件for( temp_int=0 ; temp_int<_MaxNumber_Open_Files ; temp_int++ )if( _AFD[temp_int].File_ID == i )break;if( temp_int == _MaxNumber_Open_Files ) //该文件没有处于执行状态cout << "The file " << temp << " isn't open ." << endl;else //该文件处于执行状态{if( _AFD[temp_int].Read == true )cout << "Ok , read the file " << temp << " successfully." << endl;elsecout << "Error: the open mode of the file doesn't allow you to read it ." << endl;}}}else if( Command == "write" ){cout << "Please enter the file name :";cin >> temp;//查找要打开的文件名for( i=0 ; i<_Number_Files ; i++ )if( (UFD[i].Length_File!=-1)&&(UFD[i].File_Name==temp) )break;if( i == _Number_Files ) //没找到这个文件名的文件cout << "Bad file name , please try again ." << endl;else{//找到了这个文件for( temp_int=0 ; temp_int<_MaxNumber_Open_Files ; temp_int++ )if( _AFD[temp_int].File_ID == i )break;if( temp_int == _MaxNumber_Open_Files ) //该文件没有处于执行状态cout << "The file " << temp << " isn't open ." << endl;else //该文件处于执行状态{if( _AFD[temp_int].Write == true )cout << "Ok , write the file " << temp << " successfully." << endl;elsecout << "Error: the open mode of the file doesn't allow you to write it ." << endl;}}}else if( Command == "shutdown" ){cout << "Loging out........" << endl;cout << "Ok , see you later , " << User_Name << " !" << endl;cout << "The power of the computer is shutting down.........." << endl;break;}else{cout << "Bad commands , please try again ." << endl;}}while( Command != "logout" && Command != "shutdown" ); //用户循环}while( Command != "shutdown" ); //计算机循环三 . 实验总结。
构建文件系统的实验报告
(2学年度第2学期)课程名称嵌入式系统设计与开发实验题目构建文件系统实验【实验目的】1.了解UP-TECHPXA270板的文件系统结构。
2.了解文件系统的生成过程3.完成一个简单的文件系统生产步骤4.了解busybox、mkfs.jffs2工具【实验内容】使用busybox生产文件系统中的命令部分,使用mkfs.jffs2工具制作文件系统,并完成将文件系统放置到开发板的烧写工作。
【实验设备及工具】硬件:UP-TECHPXA270实验平台,PC机pentium500以上,硬盘10G 以上。
软件:PC机操作系统RedHat Linux9.0+MiniCOM+ARM-Linux开发环境。
【实验原理】Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。
Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。
之后可以自动或手动挂载其他的文件系统。
因此,一个系统中可以同时存在不同的文件系统。
不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。
在嵌入式Linux应用中,主要的存储设备为RAM(DRAM, SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs等。
Flash(闪存)作为嵌入式系统的主要存储媒介,有其自身的特性。
Flash 的写入操作只能把对应位置的1修改为0,而不能把0修改为1(擦除Flash就是把对应存储块的内容恢复为1),因此,一般情况下,向Flash 写入内容时,需要先擦除对应的存储区间,这种擦除是以块(block)为单位进行的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统课程设计报告简单文件系统的实现专业:班级:姓名:学号:老师:一、课程设计的目的1. 通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部数据结构、功能以及实现过程的理解。
二、课程设计要求1. 在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的单用户单任务系统中的文件系统。
在退出该文件系统的使用时,应将该虚拟文件系统以一个Windows 文件的方式保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。
2文件存储空间的分配可采用显式链接分配或其他的办法。
3空闲磁盘空间的管理可选择位示图或其他的办法。
如果采用位示图来管理文件存储空间,并采用显式链接分配方式,那么可以将位示图合并到FAT中。
文件目录结构采用多级目录结构。
为了简单起见,可以不使用索引结点,其中的每个目录项应包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
要求提供以下有关的操作命令:my_format:对文件存储器进行格式化,即按照文件系统的结构对虚拟磁盘空间进行布局,并在其上创建根目录以及用于管理文件存储空间等的数据结构。
my_mkdir:用于创建子目录。
my_rmdir:用于删除子目录。
my_ls:用于显示目录中的内容。
my_cd:用于更改当前目录。
my_create:用于创建文件。
my_open:用于打开文件。
my_close:用于关闭文件。
my_write:用于写文件。
my_read:用于读文件。
my_rm:用于删除文件。
my_exitsys:用于退出文件系统。
三、程序的设计细想和框图1.打开文件函数fopen()(1)格式:FILE *fopen(const char *filename,const char *mode)(2)功能:按照指定打开方式打开指定文件。
(3)输入参数说明:filename:待打开的文件名,如果不存在就创建该文件。
mode:文件打开方式,常用的有:"r":为读而打开文本文件(不存在则出错)。
"w":为写而打开文本文件(若不存在则创建该文件;反之,则从文件起始位置写,原内容将被覆盖)。
"a":为在文件末尾添加数据而打开文本文件。
(若不存在则创建该文件;反之,在原文件末尾追加)。
"r+":为读和写而打开文本文件。
(读时,从头开始;在写数据时,新数据只覆盖所占的空间,其后不变) 。
"w+":首先建立一个新文件,进行写操作,随后可以从头开始读。
(若文件存在,原内容将全部消失) 。
"a+":功能与"a"相同;只是在文件末尾添加新的数据后,可以从头开始读。
另外,上述模式字符串中都可以加一个“b”字符,如rb、wb、ab、rb+、wb+、ab+等组合,字符“b”表示fopen() 函数打开的文件为二进制文件,而非纯文字文件。
(4)输出:一个指向FILE类型的指针。
2.关闭文件函数fclose()(1)格式:int fclose(FILE * stream);(2)功能:用来关闭先前fopen()打开的一个文件。
此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。
(3)输入参数说明:stream:指向要关闭文件的指针,它是先前执行fopen()函数的返回值。
(4)输出:若关闭文件成功则返回0;有错误发生时则返回EOF并把错误代码存到errno。
3.读文件函数fread()(1)格式:size_t fread( void *buffer, size_t size, size_t count, FILE *stream );(2)功能:读二进制文件到内存。
(3)输入参数说明:buffer:用于存放输入数据的缓冲区的首地址;stream:使用fopen()打开的文件的指针,用于指示要读取的文件;size:每个数据块的字节数;count:要读入的数据块的个数;size*count:表示要求读取的字节数。
(4)输出:实际读取的数据块的个数。
4.写文件函数fwrite()(1)格式:size_t fwite(const void *buffer,size_t size,size_t count,FILE *stream);(2)功能:将数据写到二进制文件中。
(3)输入参数说明:buffer:用于存放输出数据的缓冲区的首地址;stream:使用fopen()打开的文件的指针,用于指示要写出的文件;size:每个数据块的字节数;count:要写出的数据块的个数;size*count:表示要求写出的字符数。
(4)输出:实际写出的数据块的个数。
5.判断文件结束函数feof ()(1)格式:int feof(FILE * stream)(2)功能:用来判断是否已读取到文件末尾。
(3)输入参数说明:stream:使用fopen()打开的文件的指针,用于指示要判断的文件。
(4)输出:如果已读到文件尾则返回非零值,其他情况返回0。
6 主要函数功能实现:int format(); // 格式化磁盘int mkdir(char *sonfname); // 创建子目录int rmdir(char *sonfname); // 删除子目录int create(char *name); // 创建文件int listshow();// 显示子文件信息int delfile(char *name); //删除文件int changePath(char *sonfname);// 更改当前路径int write(char *name); // 写入文件int exit();//退出系统int open(char *file);//打开文件int close(char *file);// 关闭文件int read(char *file);//读取文件7 主要的框架四、程序实现和程序调试遇到的问题的分析1 对于DOS的文件操作使用不熟悉,经常输入错误命令2调试的时候跟踪变量的时候,难以锁定实际的变量是什么3 对于文件的存储结构不熟悉,在构造FAT的时候不知如何解决,查阅了大量的资料和跟老师交流才慢慢开始理解4由于买的实验册对于文件的介绍过于简单,导致理解上出现很大的困难。
五、结果分析和总结1基本上实现了DOS下简单文件系统的实现,通过学习基本掌握了文件系统的存储结构2当遇到困难的时候通过认真思考很查阅资料很大问题都是可以自己解决的。
通过这次实验锻炼了自己的动手的能力和分析问题的能力3在构造函数的时候可以开阔思维同时加深自己对文件系统实现的理解4通过这样的实验开始对DOS的环境文件命令输入有了初步的理解5通过跟老师的讨论解决自己心中的疑惑六、程序#include <stdio.h>#include <memory.h>#include <string>#include <iostream>using namespace std;#define GENERAL 1//1代表普通文件2代表目录文件0表示空文件#define DIRECTORY 2#define Zero 0struct FCB{char fname[16]; //文件名char type; // 0空文件1目录文件2空文件int size; //文件大小int fatherBlockNum; //当前的父目录盘块号int currentBlockNum; //当前的盘块void initialize(){strcpy(fname,"\0");type = Zero;size =0;fatherBlockNum = currentBlockNum = 0;}const char* FilePath = "C:\\myfiles";/*常量设置*/const int BlockSize = 512; //盘块大小const int OPEN_MAX = 5; //能打开最多的文件数const int BlockCount = 128; //盘块数const int DiskSize = BlockSize * BlockCount; //磁盘大小const int BlockFcbCount = BlockSize/sizeof(FCB);//目录文件的最多FCB数int OpenFileCount = 0; // 统计当前打开文件数目struct OPENLIST //用户文件打开表{int files; //当前打开文件数FCB f[OPEN_MAX]; //FCB拷贝OPENLIST(){files=0;for(int i=0;i<OPEN_MAX;i++){f[i].fatherBlockNum = -1;//为分配打开f[i].type=GENERAL;}}};struct dirFile/*-------------目录文件结构---------------*/{struct FCB fcb[BlockFcbCount];void init(int _FatherBlockNum,int _CurrentBlockNum,char *name)//父块号,当前块号,目录名{strcpy(fcb[0].fname,name); //本身的FCBfcb[0].fatherBlockNum=_FatherBlockNum;fcb[0].currentBlockNum=_CurrentBlockNum;fcb[0].type=DIRECTORY; //标记目录文件for(int i=1;i<BlockFcbCount;i++){fcb[i].fatherBlockNum=_CurrentBlockNum; //标记为子项fcb[i].type=Zero; // 标记为空白项}}};structDISK/**********************************************************************/int FAT1[BlockCount]; //FAT1int FAT2[BlockCount]; //FAT2struct dirFile root; //根目录char data[BlockCount-3][BlockSize];void format(){memset(FAT1,0,BlockCount); //FAT1memset(FAT2,0,BlockCount); //FAT2FAT1[0]=FAT1[1]=FAT1[2]=-2; //0,1,2盘块号依次代表FAT1,FAT2,根目录区FAT2[0]=FAT2[1]=FAT2[2]=-2; //FAT作备份root.init(2,2,"C:\\");//根目录区memset(data,0,sizeof(data));//数据区}};FILE *fp; //磁盘文件地址char * BaseAddr; //虚拟磁盘空间基地址string currentPath="C:\\"; //当前路径int current=2; //当前目录的盘块号string cmd; //输入指令struct DISK *osPoint; //磁盘操作系统指针char command[16]; //文件名标识struct OPENLIST* openlist; //用户文件列表指针int format();int mkdir(char *sonfname);int rmdir(char *sonfname);int create(char *name);int listshow();int delfile(char *name);int changePath(char *sonfname);int write(char *name);int exit();int open(char *file);int close(char *file);int read(char *file);/*------------初始化-----------------------*/int format(){current = 2;currentPath="C:\\"; //当前路径osPoint->format();//打开文件列表初始化delete openlist;openlist=new OPENLIST;/*-------保存到磁盘上myfiles--------*/fp = fopen(FilePath,"w+");fwrite(BaseAddr,sizeof(char),DiskSize,fp);fclose(fp);printf("格式化成功!!\n");return 1;}int mkdir(char *sonfname)/*-----------------------创建子目录-------------------*/{//判断是否有重名寻找空白子目录项寻找空白盘块号当前目录下增加该子目录项分配子目录盘块,并且初始化修改fat表int i,temp,iFAT;struct dirFile *dir; //当前目录的指针if(current == 2) // 根目录dir=&(osPoint->root);elsedir=(struct dirFile *)(osPoint->data [current-3]);/*--------为了避免该目录下同名文件夹--------*/for(i = 1;i<BlockFcbCount;i++){if(dir->fcb[i].type==DIRECTORY && strcmp(dir->fcb[i].fname,sonfname)==0 ){ printf("该文件夹下已经有同名的文件夹存在了!\n");return 0;}}for(i = 1;i < BlockFcbCount; i++){//查找空白fcb序号if(dir->fcb[i].type==Zero)break;}if(i == BlockFcbCount){printf("该目录已满!请选择新的目录下创建!\n");return 0;}temp = i;for(i = 3;i < BlockCount;i++) {if(osPoint->FAT1[i] == 0)break;}if(i == BlockCount){printf("磁盘已满!\n");return 0;}iFAT=i;/*-------------接下来进行分配----------*/osPoint->FAT1[iFAT]=osPoint->FAT2[iFAT] = 2; //2表示分配给下级目录文件//填写该分派新的盘块的参数strcpy(dir->fcb[temp].fname,sonfname);dir->fcb[temp].type=DIRECTORY;dir->fcb[temp].fatherBlockNum=current;dir->fcb[temp].currentBlockNum=iFAT;//初始化子目录文件盘块dir=(struct dirFile*)(osPoint->data [iFAT-3]); //定位到子目录盘块号dir->init (current,iFAT,sonfname);//iFAT是要分配的块号,这里的current用来指要分配的块的父块号printf("创建子目录成功!\n");return 1;}int rmdir(char *sonfname)/*-------删除当前目录下的文件夹--------*/{int i,temp,j;//确保当前目录下有该文件,并记录下该FCB下标struct dirFile *dir; //当前目录的指针if(current==2)dir=&(osPoint->root);elsedir=(struct dirFile *)(osPoint->data [current-3]);for(i=1;i<BlockFcbCount;i++){ //查找该目录文件if(dir->fcb[i].type==DIRECTORY && strcmp(dir->fcb[i].fname,sonfname)==0){ break;}}temp=i;if(i==BlockFcbCount){printf("当前目录下不存在该子目录!\n");return 0;}j = dir->fcb[temp].currentBlockNum;struct dirFile *sonDir; //当前子目录的指针sonDir=(struct dirFile *)(osPoint->data [ j - 3]);for(i=1;i<BlockFcbCount;i++) { //查找子目录是否为空目录if(sonDir->fcb[i].type!=Zero){printf("该文件夹为非空文件夹,为确保安全,请清空后再删除!\n");return 0;}}/*开始删除子目录操作*/osPoint->FAT1[j] = osPoint->FAT2[j]=0; //fat清空char *p=osPoint->data[j-3]; //格式化子目录memset(p,0,BlockSize);dir->fcb[temp].initialize(); //回收子目录占据目录项printf("删除当前目录下的文件夹成功\n");return 1;}/*-----------在当前目录下创建文本文件---------------*/int create(char *name){int i,iFAT;//temp,int emptyNum = 0,isFound = 0; //空闲目录项个数struct dirFile *dir; //当前目录的指针if(current==2)dir=&(osPoint->root);elsedir=(struct dirFile *)(osPoint->data [current-3]);for(i=1;i<BlockFcbCount;i++)//查看目录是否已满//为了避免同名的文本文件{if(dir->fcb[i].type == Zero && isFound == 0) {emptyNum = i;isFound = 1;}else if(dir->fcb[i].type==GENERAL && strcmp(dir->fcb[i].fname,name)==0 ){ printf("无法在同一目录下创建同名文件!\n");return 0;}}if(emptyNum == 0){printf("已经达到目录项容纳上限,无法创建新目录!\n");return 0;}for(i = 3;i<BlockCount;i++)//查找FAT表寻找空白区,用来分配磁盘块号j{if(osPoint->FAT1[i]==0)break;}if(i==BlockCount){printf("磁盘已满!\n");return 0;}iFAT=i;/*------进入分配阶段---------*///分配磁盘块osPoint->FAT1[iFAT] = osPoint->FAT2[iFAT] = 1;/*-----------接下来进行分配----------*///填写该分派新的盘块的参数strcpy(dir->fcb[emptyNum].fname,name);dir->fcb[emptyNum].type=GENERAL;dir->fcb[emptyNum].fatherBlockNum=current;dir->fcb[emptyNum].currentBlockNum=iFAT;dir->fcb[emptyNum].size =0;char* p = osPoint->data[iFAT -3];memset(p,4,BlockSize);printf("在当前目录下创建文本文件成功!\n");return 1;}/*-------查询子目录------------*/int listshow(){int i,DirCount=0,FileCount=0;//搜索当前目录struct dirFile *dir; //当前目录的指针if(current==2)dir=&(osPoint->root);elsedir=(struct dirFile *)(osPoint->data [current-3]);for(i=1;i<BlockFcbCount;i++) {if(dir->fcb[i].type==GENERAL){ //查找普通文件FileCount++;printf("%s 文本文件.\n",dir->fcb[i].fname);}if(dir->fcb[i].type==DIRECTORY){ //查找目录文件DirCount++;printf("%s 文件夹.\n",dir->fcb[i].fname);}}printf("\n该目录下共有%d 个文本文件, %d 个文件夹\n\n",FileCount,DirCount);return 1;}/*---------在当前目录下删除文件-----------*/int delfile(char *name){int i,temp,j;//确保当前目录下有该文件,并且记录下它的FCB下标struct dirFile *dir; //当前目录的指针if(current == 2)dir=&(osPoint->root);elsedir=(struct dirFile *)(osPoint->data [current-3]);for(i=1;i < BlockFcbCount;i++) //查找该文件{if(dir->fcb[i].type==GENERAL && strcmp(dir->fcb[i].fname,name)==0){break;}}if(i == BlockFcbCount){printf("当前目录下不存在该文件!\n");return 0;}int k;for(k=0;k<OPEN_MAX;k++){if((openlist->f [k].type = GENERAL)&&(strcmp(openlist->f [k].fname,name)==0)){if(openlist->f[k].fatherBlockNum == current){break;}else{printf("该文件未在当前目录下!\n");return 0;}}}if(k!=OPEN_MAX){close(name);}//从打开列表中删除/*开始删除文件操作*/temp=i;j = dir->fcb [temp].currentBlockNum ; //查找盘块号josPoint->FAT1[j]=osPoint->FAT2[j]=0; //fat1,fat2表标记为空白char *p=osPoint->data[j - 3];memset(p,0,BlockSize); //清除原文本文件的内容dir->fcb[temp].initialize(); //type=0; //标记该目录项为空文件printf("在当前目录下删除文件成功!\n");return 1;}/*--------------进入当前目录下的子目录--------------*/int changePath(char *sonfname){struct dirFile *dir; //当前目录的指针if(current==2)dir=&(osPoint->root);elsedir=(struct dirFile *)(osPoint->data [current-3]);/*回到父目录*/if(strcmp(sonfname,"..")==0){if(current==2){printf("你现已经在根目录下!\n");return 0;}current = dir->fcb[0].fatherBlockNum ;currentPath = currentPath.substr(0,currentPath.size() - strlen(dir->fcb[0].fname )-1);return 1;}/*进入子目录*///确保当前目录下有该目录,并且记录下它的FCB下标int i,temp;for(i = 1; i < BlockFcbCount; i++){ //查找该文件if(dir->fcb[i].type==DIRECTORY&&strcmp(dir->fcb[i].fname,sonfname)==0){ temp=i;break;}}if(i==BlockFcbCount){printf("不存在该目录!\n");return 0;}//修改当前文件信息current=dir->fcb [temp].currentBlockNum ;currentPath = currentPath+dir->fcb [temp].fname +"\\";printf("进入当前目录下的子目录成功!\n");return 1;}int exit(){//保存到磁盘上C:\myfiles//将所有文件都关闭/*--------System exit---------------------*/fp=fopen(FilePath,"w+");fwrite(BaseAddr,sizeof(char),DiskSize,fp);fclose(fp);//释放内存上的虚拟磁盘free(osPoint);//释放用户打开文件表delete openlist;printf("退出文件系统成功!\n\n");return 1;}int write(char *name)/*-------------在指定的文件里记录信息---------------*/{int i;char *startPoint,*endPoint;//在打开文件列表中查找file(还需要考虑同名不同目录文件的情况)for(i=0;i<OPEN_MAX;i++){if(strcmp(openlist->f [i].fname,name)==0 ){if(openlist->f[i].fatherBlockNum ==current){break;}else{printf("该文件处于打开列表中,本系统只能改写当前目录下文件!\n");return 0;}}}if(i==OPEN_MAX){printf("该文件尚未打开,请先打开后写入信息!!\n");return 0;}int active=i;int fileStartNum = openlist->f[active].currentBlockNum - 3 ;startPoint = osPoint->data[fileStartNum];endPoint = osPoint->data[fileStartNum + 1];printf("请输入文本以Ctrl D号结束:\t");char input;while(((input=getchar())!=4)) {if(startPoint < endPoint-1) {*startPoint++ = input;}else{printf("达到单体文件最大容量!");*startPoint++ = 4;break;}}return 1;}int read(char *file)/*---------选择一个打开的文件读取信息----------*/{int i,fileStartNum;char *startPoint,*endPoint;//struct dirFile *dir;//在打开文件列表中查找file(还需要考虑同名不同目录文件的情况)for(i=0;i<OPEN_MAX;i++){if(strcmp(openlist->f [i].fname,file)==0 ){if(openlist->f[i].fatherBlockNum ==current){break;}else{printf("该文件处于打开列表中,本系统只能阅读当前目录下文件!\n");return 0;}}}if(i==OPEN_MAX){printf("该文件尚未打开,请先打开后读取信息!\n");return 0;}int active=i;//计算文件物理地址fileStartNum = openlist->f[active].currentBlockNum - 3 ;startPoint = osPoint->data[fileStartNum];endPoint = osPoint->data[fileStartNum + 1];printf("该文件的内容为: ");while((*startPoint)!=4&& (startPoint < endPoint)){putchar(*startPoint++);}printf("\n");return 1;}int open(char *file)//打开文件/*当前目录下添加一个打开文件*/{int i,FcbIndex;//确保没有打开过该文件= 相同名字+ 相同目录for(i=0;i<OPEN_MAX;i++){if(openlist->f[i].type ==GENERAL && strcmp(openlist->f [i].fname,file)==0&&openlist->f[i].fatherBlockNum == current){printf("该文件已经被打开!\n");return 0;}}//确保有空的打开文件项if(openlist->files == OPEN_MAX){printf("打开文件数目达到上限!无法再打开新文件.\n");return 0;}//确保当前目录下有该文件,并且记录下它的FCB下标struct dirFile *dir; //当前目录的指针if(current==2)dir=&(osPoint->root);elsedir=(struct dirFile *)(osPoint->data [current-3]);for(i = 1;i< BlockFcbCount;i++){ //查找该文件if(dir->fcb[i].type==GENERAL && strcmp(dir->fcb[i].fname,file)==0 ) { FcbIndex=i;break;}}if(i==BlockFcbCount){printf("当前目录下不存在该文件!\n");return 0;}//装载新文件进入打开文件列表,(FCB信息,文件数++) ??难道名字过不来?openlist->f[OpenFileCount] = dir->fcb[FcbIndex]; //FCB拷贝openlist->files ++;printf("文件打开成功!\n");OpenFileCount++;return 1;}int close(char *file){//释放该文件所占内存//释放用户打开文件列表表项int i;//在打开文件列表中查找file(还需要考虑同名不同目录文件的情况)for(i=0;i<OPEN_MAX;i++){if((openlist->f [i].type = GENERAL)&&(strcmp(openlist->f [i].fname,file)==0)){if(openlist->f[i].fatherBlockNum == current) {break;}else{printf("该文件已打开,但未在当前目录下,无法关闭!\n");return 0;}}}if(i==OPEN_MAX){printf("该文件未在打开列表中!\n");return 0;}int active=i;openlist->files --;openlist->f[active].initialize();OpenFileCount--;printf("该文件已关闭!\n");return 1;}int main(){printf("@ Welcome To My Operate System Of File(FAT) @n");printf("\n 以下是使用说明书:\n");//使用说明书printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@\n");printf("@ format :对磁盘格式化. @ \n");printf("@ exit :安全退出该文件系统,保存信息. @ \n");printf("@ mkdir dirname :创建子目录. @ \n");printf("@ rmdir dirname :删除子目录. @ \n");printf("@ ls dirname :显示当前目录下信息. @ \n");printf("@ cd dirname :更改当前目录. @ \n");printf("@ create filename :创建一个新文件,并且打开. @ \n");printf("@ write filename :选择一个打开的文件写入信息@ \n");printf("@ read filename :选择一个打开的文件读取信息. @ \n");printf("@ rm filename :删除文件. @ \n");printf("@ open filename :打开文件. @\n");printf("@ close filename :关闭文件. @\n");printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@\n\n");openlist=new OPENLIST;//创建用户文件打开表BaseAddr=(char *)malloc(DiskSize);//申请虚拟空间并且初始化osPoint=(struct DISK *)(BaseAddr);//虚拟磁盘初始化if((fp=fopen(FilePath,"r"))!=NULL){//加载磁盘文件fread(BaseAddr,sizeof(char),DiskSize,fp);printf("加载磁盘文件( %s )成功,现在可以进行操作了!\n\n",FilePath);}else{printf("这是你第一次使用该文件管理系统!\t正在初始化...\n");format();printf("初始化已经完成,现在可以进行操作了!\n\n");}while(1){cout<<currentPath;cin>>cmd;if(cmd=="format"){format();}else if(cmd=="mkdir"){cin>>command;mkdir(command);}else if(cmd=="rmdir"){cin>>command;rmdir(command);}else if(cmd=="ls"){listshow();}else if(cmd=="cd"){cin>>command;changePath(command);}else if(cmd=="create"){cin>>command;create(command);}else if(cmd=="write"){cin>>command;write(command);}else if(cmd=="read"){cin>>command;read(command);}else if(cmd=="rm"){cin>>command;delfile(command);}else if(cmd=="open"){cin>>command;open(command);}else if(cmd=="close"){cin>>command;close(command);}else if(cmd=="exit"){exit();break;}else cout<<"无效指令,请重新输入:"<<endl;}printf("Thank you for using my file system!\n");return 1;}。