简单文件系统的实现实验报告

合集下载

文件管理系统实验报告

文件管理系统实验报告

一、实验目的本次实验旨在通过设计和实现一个简单的文件管理系统,加深对文件管理原理的理解,掌握文件系统的基本操作,包括文件的创建、删除、修改、查询等,并了解文件系统的目录结构和管理机制。

二、实验环境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结构体中,所有的结构都为静态实现,所以需要将文件系统存放到磁盘中的时候只需要将整个结构体以二进制性质存放到文件中或者是将从文件中以二进制形式读取。

简单文件系统实验

简单文件系统实验
do j=rand()%26; while(fnameA[j].flag);
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篇)

文件管理实验报告结果(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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;}。

相关文档
最新文档