FAT文件系统操作系统课程设计实验报告
实验四 文件系统 实验报告
文件系统实验报告一、实验目的了解操作系统中文件系统的原理以及实现方法。
二、实验方法通过FAT12文件系统的解读,了解文件系统的原理和实现。
三、实验任务通过对FAT12文件系统的了解,编写程序,读取并列出一个虚拟软盘中文件信息(文件名、属性、修改时间等),以及读取其中的文件内容四、实验要点FAT12文件系统的了解,Linux系统下文件读写相关系统调用。
五、实验过程1. FAT12 文件系统分析簇是操作系统分配文件空间的基本单位,簇由若干个扇区组成。
在FAT12文件系统中,簇号的有效位是12位,所以这种文件系统就被称为FAT12。
FAT12其中,引导区中储存着一些基本的信息。
例如,0x0000000B和0x0000000C 两个字节保存着每个扇区的大小,0x0000000D保存着每个簇占用多少个扇区。
FAT区中储存着簇号。
在0x00000200开始的三个字节,分别储存设备类型标记(0xF0为软盘);第二个第三个字节均为0xFF,是FAT标识符。
在FAT12文件系统中,每个簇占用12位,即1.5个字节。
簇号与地址的对应关系如下表:然后对读出的两个字节进行位运算处理,得到下一簇的簇序号。
注意,这里同样需要对高低位进行处理,即使用位计算的方式提取相应的簇号信息。
根据上述的原理,可以得出一个函数,以一个簇号为参数,返回值为文件下一个簇号。
代码如下:int getNextClutserId(FILE *fp, short clusterId){unsigned short tmp, low = 0, high = 0;;int address = (clusterId * 3 / 2) + 0x0000200;fseek(fp, address, SEEK_SET);fread((void *)(&tmp), 1, sizeof(unsigned short), fp);low = ((tmp & 0xFFF0) >> 4);high = tmp & 0x0FFF;return (clusterId % 2 == 0 ? high : low);}其中,fp 是用于读取文件系统的文件流,clusterID是当前簇号,返回值是下一个簇号。
文件系统设计实验报告
文件系统设计实验报告文件系统设计实验报告一、引言在计算机科学领域,文件系统是操作系统中的一个重要组成部分,用于管理和组织计算机存储设备上的文件和目录。
一个高效稳定的文件系统对于计算机系统的正常运行至关重要。
本实验旨在设计一个简单但功能完善的文件系统,并通过实验验证其性能和可靠性。
二、实验背景文件系统是计算机操作系统的核心组成部分之一,它负责管理计算机存储设备上的文件和目录。
一个好的文件系统应该具备以下特点:高效的文件存取速度、可靠的数据完整性、良好的扩展性和灵活性。
三、实验目标本实验的主要目标是设计一个简单但功能完善的文件系统,并通过实验验证其性能和可靠性。
具体而言,我们将实现以下功能:1. 文件的创建、读取、写入和删除。
2. 目录的创建、删除和遍历。
3. 文件和目录的权限管理。
4. 文件系统的容量管理。
5. 文件系统的备份和恢复。
四、实验设计与实现1. 文件和目录的创建、读取、写入和删除在文件系统中,文件和目录都是通过数据块来存储的。
我们可以使用链表或树的数据结构来组织文件和目录之间的关系。
为了提高文件的读取和写入效率,可以采用缓存机制,将最近访问的文件块缓存在内存中。
2. 目录的创建、删除和遍历目录是文件系统中用于组织和管理文件的一种特殊文件。
为了实现目录的创建、删除和遍历功能,我们可以使用树的数据结构来表示目录结构,并通过递归算法来实现目录的遍历。
3. 文件和目录的权限管理为了保护文件和目录的安全,我们可以为每个文件和目录设置权限。
权限可以分为读、写和执行三种类型。
通过权限管理,可以限制用户对文件和目录的操作,提高文件系统的安全性。
4. 文件系统的容量管理文件系统的容量管理是指对文件和目录所占用的存储空间进行管理。
为了有效利用存储空间,我们可以使用位图或链表等数据结构来管理存储空间的分配和释放。
5. 文件系统的备份和恢复为了保证文件系统的可靠性,我们可以定期对文件系统进行备份。
备份可以通过复制文件和目录的数据块来实现。
操作系统课程设计实验报告
操作系统课程设计实验报告操作系统课程设计实验报告引言:操作系统是计算机科学中的重要课程,通过实验设计,可以帮助学生更好地理解操作系统的原理和实践。
本文将结合我们在操作系统课程设计实验中的经验,探讨实验设计的目的、实验过程和实验结果,以及对操作系统的理解和应用。
一、实验设计目的操作系统课程设计实验的目的是帮助学生深入理解操作系统的工作原理和实际应用。
通过设计和实现一个简单的操作系统,学生可以更好地掌握操作系统的各个组成部分,如进程管理、内存管理、文件系统等。
同时,实验设计还可以培养学生的动手能力和问题解决能力,提高他们对计算机系统的整体把握能力。
二、实验过程1. 实验准备在进行操作系统课程设计实验之前,我们需要对操作系统的基本概念和原理进行学习和理解。
同时,还需要掌握一些编程语言和工具,如C语言、汇编语言和调试工具等。
这些准备工作可以帮助我们更好地进行实验设计和实现。
2. 实验设计根据实验要求和目标,我们设计了一个简单的操作系统实验项目。
该项目包括进程管理、内存管理和文件系统三个主要模块。
在进程管理模块中,我们设计了进程创建、调度和终止等功能;在内存管理模块中,我们设计了内存分配和回收等功能;在文件系统模块中,我们设计了文件的创建、读写和删除等功能。
通过这些模块的设计和实现,我们可以全面了解操作系统的各个方面。
3. 实验实现在进行实验实现时,我们采用了分阶段的方法。
首先,我们实现了进程管理模块。
通过编写相应的代码和进行调试,我们成功地实现了进程的创建、调度和终止等功能。
接下来,我们实现了内存管理模块。
通过分配和回收内存空间,我们可以更好地管理系统的内存资源。
最后,我们实现了文件系统模块。
通过设计文件的读写和删除等功能,我们可以更好地管理系统中的文件资源。
三、实验结果通过实验设计和实现,我们获得了一些有意义的结果。
首先,我们成功地实现了一个简单的操作系统,具备了进程管理、内存管理和文件系统等基本功能。
模拟实现单级目录的FAT文件系统【操作系统报告】
模拟实现单级目录的FAT文件系统【操作系统报告】一、课程设计的性质和目的操作系统课程设计是计算机专业的专业课程,通过课程设计使学生进一步巩固课堂所学知识,全面熟悉、掌握操作系统的基本设计方法和技巧,进一步提高分析问题、解决问题及上机操作能力,为将来从事计算机工作打下一定的专业基础。
二、设计课题课题一:模拟实现单级目录的FAT文件系统基本思路:用二进制文件空间模拟磁盘空间,用文件块操作模拟磁盘块操作。
基本设计要求:1、实现如下文件系统功能(过程或函数):a、打开文件系统FILE *OPENSYS(char *filename);b、关闭文件系统int CLOSESYS(FILE *stream);c、显示目录void LISTDIR(void);d、建立文件int FCREATE(char *filename);e、删除文件int FDELETE(char *filename);f、打开文件int FOPEN(char *filename);g、关闭文件int FCLOSE(int fileid);h、文件块读int FREAD(void *ptr, int n, int fileid);i、文件块写int FWRITE(void *ptr, int n, int fileid);j、判断文件结束int FEOF(int fileid);k、获取文件指针long FGETPOS(int fileid);l、设置文件指针int FSETPOS(int fileid, long offset);m、取得文件长度long FGETLEN(char *filename);2、提供文件系统创建程序3、有功能检测模块4、为简化程序设计,假定目录区域大小固定。
文件系统空间划分:可以使用的C语言文件操纵函数:FILE *fopen(const char *filename, const char *mode);int fclose(FILE *stream);int fseek(FILE *stream, long offset, int whence);long ftell(FILE *stream);size_t fread(void *ptr, size_t size, size_t n, FILE *stream);size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);课题二:模拟实现单级目录、单级索引的索引文件系统使用链接域将同一文件的各索引块按顺序连接起来;其余各项同课题一。
fat表实验
合肥工业大学计算机与信息学院实验报告课程:操作系统专业班级:计算机科学与技术班学号:姓名:一、实验目的:1、通过查看FAT12文件系统的扫描数据,并调试扫描的过程,理解FAT12文件系统管理软盘的方式。
2、通过改进FAT12文件系统的扫描功能,加深对FAT12文件系统的理解。
二、实验内容:1、阅读控制台命令“sd”相关的源代码,并查看其执行的结果:2、根据BPB中的信息计算出其他信息:通过BPB中保存的信息重新计算出下列信息,并打印输出:(1) 计算并打印输出根目录的起始扇区号,即pVcb->FirstRootDirSector的值。
(2) 计算并打印输出根目录的大小,即pVcb->RootDirSize的值。
(3) 计算并打印输出数据区的起始扇区号,即pVcb->FirstDataSector的值。
(4) 计算并打印输出数据区中簇的数量,即pVcb->NumberOfClusters的值。
在ConsoleCmdScanDisk函数中,使用了下面的语句打印输出根目录的起始扇区号:fprintf(StdHandle, "First Sector of Root Directroy: %d\n", pVcb->FirstRootDirSector);根目录的起始扇区号可以使用保留扇区的数量加上FAT表占用扇区的数量来计算获得,而这些信息都可以从BPB中获得,所以上面的语句可以修改为:fprintf(StdHandle, "First Sector of Root Directroy: %d\n", pVcb->Bpb.ReservedSectors +pVcb->Bpb.Fats * pVcb->Bpb.SectorsPerFat);用fprintf(StdHandle, "Size of Root Directroy : %d\n", pVcb->Bpb.RootEntries * 32);代替fprintf(StdHandle, "Size of Root Directroy : %d\n", pVcb->RootDirSize);用fprintf(StdHandle, "First Sector of Data Area : %d\n", (pVcb->Bpb.ReservedSectors + pVcb->Bpb.Fats * pVcb->Bpb.SectorsPerFat) + (pVcb->Bpb.RootEntries * 32 / pVcb->Bpb.BytesPerSector));代替fprintf(StdHandle, "First Sector of Data Area : %d\n", pVcb->FirstDataSector);用fprintf(StdHandle, "Number Of Clusters : %d\n\n", pVcb->Bpb.Sectors - ((pVcb->Bpb.ReservedSectors + pVcb->Bpb.Fats * pVcb->Bpb.SectorsPerFat) + (pVcb->Bpb.RootEntries * 32 / pVcb->Bpb.BytesPerSector)));代替fprintf(StdHandle, "Number Of Clusters : %d\n\n", pVcb->NumberOfClusters);3、阅读控制台命令“dir”相关的源代码,并查看其执行的结果:4、输出每个文件所占用的磁盘空间的大小:文件的大小与文件所占用的磁盘空间是两个不同的概念,文件所占用的磁盘空间是簇的整数倍,所以文件所占用的磁盘空间总是大于或等于文件的大小。
磁盘存储结构与文件恢复实验(FAT文件系统)
磁盘存储结构与⽂件恢复实验(FAT⽂件系统)实验地点:主楼A2-412⼀、实验室名称:主楼实验室A2-412⼆、实验项⽬名称:磁盘存储结构与⽂件恢复实验三、实验学时:6学时四、实验原理:在Debug环境下利⽤基本汇编程序对引导扇区、⽂件分配表、⽬录表等结构进⾏显⽰,并进⾏分析;使⽤⼯具软件WINHEX对指定的⽂件(被删除⽂件)进⾏恢复。
五、实验⽬的:1)了解⽂件系统在磁盘上的存储映像和它在系统安全中的地位和作⽤;2)了解⽂件⽬录结构及其访问⽅式;3)掌握使⽤系统基本汇编程序进⾏磁盘和⽂件结构访问的技术和编程⽅法,为数据恢复奠定基础。
六、实验内容:1)在DEGUB下,使⽤汇编指令读取MBS引导扇区,记录并分析说明结构。
2)在DEGUB下,使⽤汇编指令读取DBS引导扇区,记录并分析说明结构。
3)在DEGUB下,使⽤汇编指令读取FAT、FDT,记录并分析说明结构。
4)⽣成⼀个简单⽂本⽂件(*.txt⽂件),结合FAT,FDT信息,使⽤汇编指令,在硬盘上查找并读出该⽂件,记录并说明查找过程。
5)删除⽣成的⽂本⽂件,查看该⽂件在FAT、FDT所对应的⽂件存储状态以及该⽂件在数据区对应扇区的内容,说明⽂件删除操作的原理。
6)使⽤WINHEX软件进⾏⽂件恢复操作练习。
七、实验器材(设备、元器件):PC微机⼀台(⾄少具有⼀个FAT格式磁盘分区),VMware Workstation6.0虚拟机软件,DOS7.0,WINHEX软件。
⼋、实验步骤:任务⼀、读取MBS引导扇区1.在DEGUB下,使⽤汇编指令读取MBS引导扇区。
2.根据显⽰的信息,分析说明MBS结构及字节含义和具体数值。
任务⼆、读取DBS引导扇区和磁盘参数块BPB1.在DEGUB下,使⽤汇编指令读取DBS引导扇区。
2.根据显⽰信息,分析说明引导扇区结构。
3.根据显⽰信息说明磁盘参数块BPB结构及各段含义和具体数值。
任务三、读取FAT表1.⽣成⼀个简单⽂本⽂件(*.txt⽂件),取“长⽂件名”。
文件系统实验报告
一、实验目的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”文件的内容,并成功保存。
操作系统实验六实验报告
实验六FAT文件系统实验一、实验环境Windows2000操作系统二、实验目的从系统分析的角度出发,了解FAT文件系统的组织结构和文件的存储方式。
进一步理解操作系统文件管理的基本思想。
三、实验内容(1)了解3吋软盘的FAT文件系统结构。
(2)查看文件分配表的簇号链。
(3)查看文件目录表中文件目录结构。
(4)了解用簇号链映射的文件链式存储结构。
(5)分析目录文件的组成。
四、实验准备复习文件组成,文件描述目录信息内容及含义。
复习文件系统的存储结构概念。
复习文件存储控件管理方法。
五、实验步骤1、进入DEBUG环境,装入FAT文件系统结构。
执行命令:L 0 0 0 21说明:将0号驱动器中,逻辑扇区号从0开始的共21H个扇区读入内存,放在DS:0000为起始的地址中。
2、观察1.44M软盘中FAT12文件系统结构。
执行命令D 0000 (显示从0地址开始的内存)连续执行D命令,每次显示128个字节,可见文件系统结构。
3、分析文件分配表结构,了解用簇链映射的文件的链式存储结构。
执行命令:D 200思考:首簇号为003的文件共包括几个扇区?它分布在哪几个物理扇区中?1.44M 软盘逻辑扇号与物理扇区的对应关系逻辑扇号0 # ——0道0面1扇逻辑扇号1 H ~11H ——0 道0 面2 ~18 扇逻辑扇号12 H ~23H ——0 道1 面1 扇~18 扇逻辑扇号24 H ~35H ——1 道0 面1 扇~18 扇其中:000 簇和001 簇中包含了磁盘类型002 簇对应了数据区21H 逻辑扇(0道1面16扇),现在为FFF。
003 簇中为FFF表示是hi文件最后一簇。
故首簇号为003的文件包括1个扇区,分布在0道1面17扇。
4、观察1.44M软盘中文件目录表FDT以及文件目录结构执行命令:L 0 0 0 21说明:将逻辑扇区0H开始的共21H个物理扇区装日DS:0000H起始的内存。
执行命令:D2600说明:显示从2600H地址开始的FDT文件表思考:(1)计算1.44M软盘根目录最多可以容纳多少文件?答:FDT逻辑扇区号为(13H-20H),占14个扇区,每个目录项32个字节;每个扇区512字节,故可容纳14*512/32=224个文件。
fat表课程设计
fat表课程设计一、课程目标知识目标:1. 学生能理解并掌握“fat表”的概念及其在计算机科学中的作用。
2. 学生能够了解“fat表”的存储结构和基本工作原理。
3. 学生能够解释“fat表”在文件系统中的应用及其对文件管理的影响。
技能目标:1. 学生能够运用所学知识,分析“fat表”在操作系统中的功能。
2. 学生通过案例学习,能够独立进行简单的“fat表”操作,如查看和解读“fat表”信息。
3. 学生能够利用“fat表”解决基本的文件存储和检索问题。
情感态度价值观目标:1. 培养学生对计算机科学领域的探究兴趣,特别是在文件系统知识方面。
2. 通过学习“fat表”,增强学生对信息技术中逻辑思维和数据分析重要性的认识。
3. 培养学生的团队合作意识,通过小组讨论和分享,理解协作在学习中的重要性。
课程性质分析:本课程为计算机科学领域的基础课程,通过“fat表”的学习,使学生能够深入理解文件系统的工作机制,为后续的系统编程和网络编程打下基础。
学生特点分析:考虑到学生所在年级的特点,已经具备了一定的计算机基础知识,对操作系统有初步了解,但可能对具体的文件系统实现细节掌握不足。
教学要求:1. 教学内容应与现行教材紧密结合,注重理论联系实际,通过实例讲解加深理解。
2. 教学过程中,注重启发式教学,引导学生主动探索和思考。
3. 教学评估应侧重于学生的实际操作能力,通过项目实践和问题解决来衡量学习成果。
二、教学内容1. “fat表”基础知识:- “fat表”的定义与功能- “fat表”的存储结构及其与文件系统的关系2. “fat表”的工作原理:- 文件簇的概念及其与“fat表”的关联- “fat表”的更新机制与文件操作的关系3. “fat表”在实际应用中的案例分析:- 典型文件系统的“fat表”结构分析- 利用“fat表”进行文件检索与存储的过程演示4. 教学内容的安排与进度:- 第一课时:介绍“fat表”基础知识,让学生了解“fat表”的定义和功能,以及其在文件系统中的作用。
操作系统课程设计报告文件系统
盘索引结点号一并组成一个新目录项,记入其父目录文件中。
文件被撤消时,系统要回收该文件的磁盘索引结点,从其父目录中删除该目录项。
随着文件的打开与关闭,系统还要为之分派和回收内存索引结点。
②磁盘索引结点中,包括有关文件的下述一系列信息:文件模式di_mode、文件所有者用户标识符di_uid、同组用户标识符di_gid、文件长度di_size、文件的联接计数di_nlink、文件的物理地址di_addr、文件的访问时刻di_atime、文件的修改时刻di_mtime和文件的成立时刻di_citime。
③内存索引结点:文件被打开后,系统为它在内存索引结点表区中建一内存索引结点,以方便用户和系统对文件的访问。
④磁盘索引结点的分派与回收分派进程ialloc:当内核创建一新文件时,要为之分派一空闲磁盘i结点。
如分派成功,便再分派一内存i结点。
其进程如下:检查超级块上锁否。
由于超级块是临界资源,诸进程必需互斥地访问它,故在进入ialloc后,要先检查它是不是已上锁,若是则睡眠等待;检查i结点栈空否。
若i结点栈中已无空闲结点编号,则应从盘中再调入一批i 结点号进栈。
若盘中已无空闲i结点,则犯错处置,返回;从空闲i结点编号栈中分派一i结点,并对它初始化、填写有关文件的属性;分派内存i结点;将磁盘i结点总数-1,置超级块修改标志,返回。
回收进程ifree:当删除文件时,应回收其所占用的盘块及相应的磁盘i结点。
具体有:检查超级块上锁否。
若是,直接返回,即不把本次回收的i结点号记入空闲i结点编号栈中;检查i结点编号栈满否。
若已满,无法再装入新回收的i结点号,当即返回,若未满,便将回收的i结点编号进栈,并使当前空闲结点数+1;置超级块修改标志,返回。
⑤内存索引结点的分派与回收分派进程iget:虽然iget用在打开文件时为之分派i结点,但由于允许文件被共享,因此,若是一文件已被其他用户打开并有了内存i结点,则现在只需将i结点中的引用计数+1。
操作系统文件系统实验报告
操作系统文件系统实验报告操作系统文件系统实验报告引言操作系统是计算机系统中的重要组成部分,负责管理计算机的硬件和软件资源,为用户提供一个友好的界面和高效的资源管理。
文件系统作为操作系统的一个重要组成部分,负责管理计算机中的文件和目录,提供文件的读写和存储功能。
本实验旨在深入了解操作系统文件系统的原理和实现方式,并通过实际操作来加深对文件系统的理解。
一、实验背景操作系统中的文件系统是一个层次化的结构,它将计算机中的存储空间划分为若干个逻辑单元,用来存储和管理文件和目录。
文件系统的设计和实现涉及到文件的组织方式、文件的存储结构、文件的访问方式等多个方面。
本实验将以Linux操作系统为例,通过使用Linux文件系统的一些基本命令和操作,来深入了解文件系统的原理和实现方式。
二、实验目的1. 了解文件系统的基本概念和原理。
2. 掌握Linux文件系统的基本命令和操作。
3. 熟悉文件的读写和存储方式。
4. 加深对文件系统的理解和应用。
三、实验内容1. 文件系统的基本概念和原理文件系统是操作系统中用来管理文件和目录的一种机制,它将计算机中的存储空间划分为若干个逻辑单元,用来存储和管理文件和目录。
文件系统的基本概念包括文件、目录、路径等,文件是计算机中存储数据的基本单位,目录是用来组织和管理文件的一种方式,路径是用来定位文件和目录的一种方式。
2. Linux文件系统的基本命令和操作Linux操作系统是一个开源的操作系统,它提供了丰富的文件系统命令和操作。
通过使用这些命令和操作,可以对文件和目录进行创建、删除、复制、移动等操作。
例如,可以使用"mkdir"命令来创建一个新的目录,使用"rm"命令来删除一个文件,使用"cp"命令来复制一个文件,使用"mv"命令来移动一个文件等。
3. 文件的读写和存储方式文件的读写是文件系统的一项重要功能,它可以通过读取和写入文件来实现对文件内容的访问和修改。
操作系统文件系统实验报告
操作系统文件系统实验报告1. 实验目的本实验旨在深入了解操作系统中的文件系统,掌握文件系统的基本原理和操作。
2. 实验环境本实验使用Linux操作系统作为实验环境,其中包括以下软件和工具: - 操作系统:Ubuntu 20.04 - 文件系统:EXT4 - 终端模拟器:GNOME Terminal3. 实验步骤3.1 创建虚拟硬盘首先,我们需要创建一个虚拟硬盘,作为文件系统的存储介质。
可以使用以下命令来创建一个大小为1GB的虚拟硬盘:$ dd if=/dev/zero of=disk.img bs=1M count=10243.2 格式化虚拟硬盘接下来,我们需要使用mkfs命令来格式化虚拟硬盘,使其支持EXT4文件系统:$ mkfs.ext4 disk.img3.3 挂载虚拟硬盘格式化完成后,我们可以将虚拟硬盘挂载到系统中的一个目录上,以便我们可以访问其中的文件:$ mkdir /mnt/disk$ mount disk.img /mnt/disk3.4 创建文件现在,我们可以在挂载的虚拟硬盘上创建文件,可以使用touch命令来创建一个空文件:$ touch /mnt/disk/file.txt3.5 写入文件我们可以使用echo命令向文件中写入一些内容:$ echo "Hello, World!" > /mnt/disk/file.txt3.6 读取文件可以使用cat命令来读取文件的内容:$ cat /mnt/disk/file.txt3.7 卸载虚拟硬盘完成实验后,我们可以卸载虚拟硬盘,以便之后的实验使用:$ umount /mnt/disk4. 实验总结通过本次实验,我们深入了解了操作系统中的文件系统,并学会了如何创建、格式化、挂载和访问文件系统。
文件系统是操作系统中非常重要的一部分,它负责管理和组织计算机上的文件和目录,为用户提供了方便的文件操作接口。
掌握文件系统的基本原理和操作对于进一步学习和理解操作系统的工作原理具有重要意义。
操作系统课程设计报告
操作系统课程设计实验报告姓名:学号:班级专业:软件工程操作系统课程设计---建立基于磁盘存储设备的FAT文件系统一、课程设计要求、目的在现代计算机系统中,用到大量的程序和数据,由于内存容量有限,且不能长期保存,故而平时总是把他们以文件的形式存放在外村中,需要时可随时将他们调入到内存。
如果用户直接管理外存上的文件,不仅要求用户熟悉外存的特性,了解各种文件的属性,以及他们在外存上的位置,而且在多用户的环境下,还必须能保持数据的安全性和一致性。
显然,这是用户多不能胜任、也不愿意承担的工作。
取而代之的是操作系统中又增加了文件管理功能,即构成一个文件系统,负责管理在外存上的文件,并把对文件的存取、共享和保护等手段提供给用户。
这不仅方便了用户,保证了文件的安全性,还可以有效的提高系统资源的利用率。
课程设计不仅要求我们紧扣课本知识,熟练的掌握课FAT文件系统实现原理上,而且要求最终的软件实现有很好的人机交互界面,从多方面考查我们的学习、实践能力。
让我们在实践中去认识FAT文件系统的实现原理,加深对文件系统存储、数据的安全性和一致性理解,在实践中去完善自己的理论知识,纠正理论学习过程中出现的错误。
二、课程设计的任务1、首先分配一定容量的磁盘存储空间,作为文件存储空间。
2、建立相应的文件系统,使用FAT文件系统。
3、为该文件系统设计相应的数据结构来管理目录、磁盘空闲空间、已分配空间等。
4、提供文件的创建、删除、移位、改名等功能。
5、提供良好的界面,可以显示磁盘文件系统的状态和空间的使用情况。
6、提供虚拟磁盘转储功能,可将信息存入磁盘,还可从磁盘读入内存。
三、相关原理及算法描述3.1文件系统设计原理本次设计的基于磁盘存储设备的FAT文件系统利用的是二级目录管理方式,分别由用户文件目录UFD( User File Directory )、主文件目录MFD( Master File Diretory )构成。
其中UFD由用户的所有文件块组成,在MFD中每个用户目录文件占用一个目录项,其中目录项中包括用户名和指向用户目录文件的指针,其基本构成如图所示:用户文件目录项的基本信息包括基本信息、地址信息、访问控制信息、使用信息。
操作系统课程设计报告5——模拟文件系统
操作系统课程设计报告——模拟文件系统1实现功能实现了符合要求的文件系统。
实现了要求的文件系统接口。
2文件系统的实现2.1目录项结构体dirEntry文件系统中,使用dirEntry结构体表示一个目录项。
该结构体长64字节,其中记录了该项的FAT表入口位置start,文件名name(最长50字节)和长9字节的未用项unused(可用于扩展文件系统的功能,记录其他信息)。
系统中的目录实际上就是仅由dirEntry项构成的目录文件。
2.2文件描述符分配表项结构体filpEntry使用filpEntry结构体来表示一个已经打开的文件。
它长8个字节,记录的信息包括该文件的FAT表入口位置start,以及文件指针位置position。
fdPool数组提供了100个可用的filpEntry指针;minNotUsedFd变量储存当前最小未用的文件描述符。
每当打开一个文件时,要调用get_fd函数,它为文件分配一个描述符,增加一个filpEntry项,并调整minNotUsedFd的值。
当关闭文件时,需要调用free_fd函数,来释放一个文件描述符和对应的filpEntry。
2.3文件分配表FAT文件系统中,需要记录文件存储的块号的数据结构。
除了可以使用inode以外,还可以使用FAT。
FAT在使用过程中需要将整张表读入内存,而使用inode时,只需要将使用中的inode读入内存即可;故inode占用内存较少。
但inode数据结构复杂;尤其是当文件尺寸巨大,需要使用二级甚至三级间接表时,inode在磁盘和内存之间的读写过程会变得相当繁琐。
本项目中,选择使用方便的FAT。
当磁盘空间为250MB,块大小为1KB时,将有256000块;每块的号码需要使用一个int来表达。
故FAT表需要256000项,每项4字节,共1024000字节,即1000KB。
由于超级块已经占用块0,文件分配表将占用硬盘块1~1000。
FAT的每个表项的类型都是int。
操作系统实验报告6
专业:班级:
姓名:学号:实验日期:年月日
实验名称:操作系统实验6FAT12文件系统(3分)
实验目的:以一个教学型操作系统EOS为例,理解磁盘存储器管理的基本原理与文件系统的实现方法;能对核心源代码进行分析和修改,具备实现一个简单文件系统的基本能力;训练分析问题、解决问题以及自主学习能力,通过6个实验的实践,达到能独立对小型操作系统的部分功能进行分析、设计和实现。
实验环境:EOS操作系统及其实验环境。
实验内容:
通过调用EOS API读取文件数据,跟踪FAT12文件系统的读文件功能,分析EOS中FAT12文件系统的相关源代码,理解并阐述EOS实现FAT12文件系统的方法;修改EOS的源代码,为FAT12文件系统添加写文件功能,。
实验步骤:
1)EOS中FAT12文件系统相关源代码分析
(分析EOS中FAT12文件系统的相关源代码,简要说明EOS实现FAT12文件系统的方法,包括主要数据结构与文件基本操作的实现等)
2)EOS中FAT12文件系统读文件过程的跟踪
(简要说明在本部分实验过程中完成的主要工作,包括对读文件的跟踪等,总结EOS中读文件的实现方法)
3)为EOS的FAT12文件系统添加写文件功能
(给出实现方法的简要描述、源代码、测试及结果等)
结果分析:
(对本实验所做工作及结果进行分析,包括EOS中FAT12文件系统实现方法的特点、不足及改进意见;结合EOS对文件系统实现相关问题提出自己的思考;分析写文件实现方法的有效性、不足和改进意见,如果同时采用了多种实现方法,则进行对比分析;其他需要说明的问题)。
操作系统文件系统性能与安全实验报告
操作系统文件系统性能与安全实验报告1. 概述文件系统是操作系统中的重要组成部分,它负责管理文件的存储、组织和访问。
本次实验旨在研究操作系统文件系统的性能和安全性,并通过实验数据和分析得出结论。
2. 实验设计与环境为了评估文件系统的性能和安全性,我们选择了常用的三种文件系统进行实验:FAT32、NTFS和ext4。
实验环境搭建在一台具有充足资源的计算机上,操作系统为Windows 10和Linux。
3. 性能实验3.1 文件读取性能测试通过在不同文件系统上读取不同大小的文件,并记录读取时间,以评估文件系统在读取大文件和小文件时的性能差异。
3.2 文件写入性能测试同样地,在不同文件系统上写入不同大小的文件,并记录写入时间,以评估文件系统在写入大文件和小文件时的性能差异。
3.3 目录操作性能测试通过在不同文件系统上进行目录的创建、删除、重命名等操作,并记录所花费的时间,以评估文件系统在目录操作上的性能差异。
4. 安全性实验4.1 文件权限测试我们通过在不同文件系统上设置不同的文件权限,并测试用户对文件的读取、写入和执行权限,以评估文件系统对文件安全性的保护程度。
4.2 数据恢复测试在实验中,我们模拟文件系统崩溃等意外情况,测试文件系统的数据恢复能力,以评估文件系统对数据的安全性和可靠性。
4.3 密码保护测试通过在不同文件系统上设置文件加密功能,并测试文件系统的密码保护机制,以评估文件系统对数据隐私和安全的保护程度。
5. 实验结果与分析根据我们的实验数据和分析,我们得出以下结论:5.1 性能方面:- 在大文件读写性能方面,NTFS和ext4相对较好,而FAT32性能相对较差。
- 在小文件读写性能方面,ext4表现出色,NTFS次之,而FAT32仍然性能较差。
- 目录操作性能方面,ext4表现最佳,NTFS次之,而FAT32仍然相对较差。
5.2 安全性方面:- 在文件权限控制方面,NTFS和ext4提供了更加精细的权限设置,相对而言更安全可靠。
FAT文件系统 操作系统课程设计实验报告
欢迎共阅操作系统课程设计之三设计任务:模拟OS 文件系统在任一OS (Window 或者Dos ;也可以是在Linux 下,但要求能将结果演示给老师看)下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟OS12 内容)②、第1个盘块起,至125盘块,共125个盘块(125k )存放FAT 内容③、第126、127(2个)盘块,存放位示图④、从第128盘块至10000盘块,皆为数据(区)盘块,其逻辑编号从0开始,至9872号数据盘块,即第0数据盘块为128号盘块,第1数据盘块为129号盘块,…⑤、第0数据盘块(即128号盘块),存放根目录(同样只用一个盘块作根目录),由于第0、1目录项为“.”(本目录), “..”(父目录),因此根目录下同样只能存放30个文件或目录,并且从第2个目录项开始。
⑥、文件或子目录数据,放在第1数据盘块及以后的数据盘块中,由用户按需要使用。
3、SDisk管理程序的功能要求如下:#CopyFile 老文件,新文件,为新文件创建一个目录项,并将老文件内容复制到新文件中,并同时修改FAT内容和位示图内容⑼、显示位示图内容#ShowBitMP,将位示图内容(已有信息部分),显示在屏幕上(按十六进制)⑽、显示FAT内容#ShowFAT,将FAT内容(已有信息部分),显示在屏幕上(按十六进制)4、程序的总体流程为:⑴、输出提示符#,等待接受命令,分析键入的命令;⑵、对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令(1、请参考“03.FAT32文件系统简介.doc”中,有关文件系统的规定;2、请参考WinHex中,目录所显示的信息进行编程)//关于FAT 和MAP表的解释struct FCB{char fname[8]; //文件名char exname[3]; //扩展名short fnum; //首块号int length; //文件大小,目录则文件大小为;};struct fatid{short id[FATNUM*FATLIST]; //FAT 大小512个记录一块}*FAT;struct map{bitset<MAP_SIZE> maplist;}*MAP;struct DIR{struct FCB list[LIST_SIZE+1];}*filedir;int currentid=128; //当前FAT号int currentdir=128; //当前目录块号初始化是+1 由于第个单元没有使用char *file; //磁盘的首地址char *FilePath="myfat"; //window文件保存地址FILE *fp; //window 文件地址**strcpy(filedir->list[0].exname,"dir");filedir->list[0].fnum=currentdir;filedir->list[0].length=0;strcpy(filedir->list[1].fname,"..");strcpy(filedir->list[1].exname,"dir");filedir->list[1].fnum=currentdir;filedir->list[1].length=0;fp=fopen(FilePath,"w+");fwrite(file,sizeof(char),DISK_SIZE,fp);fclose(fp);printf("初始化已经完成,现在可以进行操作了!\n\n");}/**创建子目录*/int mkdir(char *str){int i,j;int blockid; //将要创建的FAT号int blockdir; //将要创建的目录块号int listnum; //目录块内编号struct fatid *flagid;if(strcmp(dir->list[i].fname,"")==0) //有空的目录块且无重名,第一版本的时候与上面的循环放在一起,存在一个情况是前面的建立的目录删除后,直接被同名的覆盖了break;if(i>LIST_SIZE){printf("内存不足\n");return 0;}}flagid=(struct fatid *)(file+BLOCK_SIZE); //fat 首位地址for(j=DATABEG+1;j<BLOCK_NUM;j++){if(flagid->id[j]==0){blockdir=j;break;}}strcpy(dir->list[i].fname,str);dir->list[i].fnum=blockdir;strcpy(dir->list[i].exname,"dir");dir->list[i].length=0;*{fl[sumfile]=i;sumfile++;}}for(i=0;i<sumdir;i++)printf(" %s 文件夹\n",dir->list[dr[i]].fname);for(i=0;i<sumfile;i++)printf(" %s %s文件\n",dir->list[fl[i]].fname,dir->list[fl[i]].exname);printf("\n");printf("\n在该目录下共有%d 个文件, %d 个文件夹\n\n",sumfile,sumdir-2);return 0;}/**删除子目录*/int rmdir(char *str){int i;int blockid;int flag=0;//FAT号{if(strcmp(flagdir->list[m].fname,"")!=0){printf("该目录下有子文件或者子目录,不能删除该目录");}m++;}strcpy(dir->list[i].fname,""); //父目录DIRstrcpy(dir->list[i].exname,"");dir->list[i].fnum=0;strcpy(flagdir->list[0].fname,""); //要删除目录的DIRstrcpy(flagdir->list[0].exname,"");flagdir->list[0].fnum=0;strcpy(flagdir->list[1].fname,"");strcpy(flagdir->list[1].exname,"");flagdir->list[0].fnum=0;MAP->maplist[blocknum]=0;FAT->id[blocknum]=0;FAT->id[0]=FAT->id[0]+1;return 0;}/**if(strcmp(dir->list[i].fname,str)==0&&strcmp(dir->list[i].exname,"dir")==0){currentdir=dir->list[i].fnum;break;}}if(i>LIST_SIZE){printf("找不到指定的目录%s\n",str);return 0;}CURRENT=CURRENT+str+"\\";return 1;}/**创建文件*/int create(char *str,int length){//getfilenameint i,j,l,t,k;int blockdir;break;exname[j]=str[i];i++;}if(strcmp(name,"0")==0){printf("文件名称不能为空\n");return 0;}if(length>FAT->id[0]){printf("文件超出磁盘容纳空间\n");return 0;}for(i=2;i<LIST_SIZE;i++){if(strcmp(dir->list[i].fname,name)==0&&strcmp(dir->list[i].exname,exname)==0){printf("改文件夹下,已经有同名文件");return 0;}if(strcmp(dir->list[i].fname,"")==0)j++;}FAT->id[t]=-1; //FAT->id[0]=FAT->id[0]-1;printf("已经成功创建文件%s \n",name);return 1;}/**复制文件*/int cp(char *str,char *newname){int i,j,k,l,length;char name[8]={0}; //文件名称char exname[3]={0}; //文件扩展名struct DIR *dir;l=strlen(str);//取文件名for(i=0;i<l;i++){name[i]=str[i];if(str[i+1]=='.')/**删除文件*/int delfile(char *str){int i,j,l,k;int blocknum; //要删除的首块地址int temp;char name[8]={0}; //文件名称char exname[3]={0}; //文件扩展名char c='a';struct DIR *dir;struct fatid *FAT;struct map *MAP;l=strlen(str);//取文件名for(i=0;i<l;i++){name[i]=str[i];if(str[i+1]=='.')break;}cin>>c;if((c=='y'||c=='Y')||(c=='n'||c=='N'))break;}if(c=='n'||c=='N')return 0;blocknum=dir->list[i].fnum;dir->list[i].fnum=0; //把目录项还原strcpy(dir->list[i].exname,"");strcpy(dir->list[i].fname,"");dir->list[i].length=0;//处理FAT AND MAP 表while(FAT->id[blocknum]!=-1){temp=FAT->id[blocknum];;FAT->id[blocknum]=0;FAT->id[0]=FAT->id[0]+1;MAP->maplist[blocknum]=0;blocknum=temp;}printf("已经成功删除%s\n",str);return 0;int list[BLOCK_SIZE]={0};FAT=(struct fatid *)(file+BLOCK_SIZE); j=0;for(i=DATABEG+1;i<BLOCK_SIZE;i++){if(FAT->id[i]!=0){list[j]=i;j++;}}j=0;flag=0;for(i=0;i<BLOCK_SIZE;i++){if(list[i]!=0){ printf(" %0x",list[i]);if(flag){if(j%10==0)printf("\n");}flag=1;//申请虚拟空间file=(char *)malloc(DISK_SIZE*sizeof(char));//加载if((fp=fopen(FilePath,"r"))!=NULL){fread(file,sizeof(char),DISK_SIZE,fp);printf("加载磁盘文件%s文件成功,现在可以操作\n\n",FilePath); }else{printf("这是第一次使用文件管理系统");}}int main(){int length;char newname[20];welcome();format();while(1){cout<<CURRENT<<"#";cin>>cmd;exit();break;}else if(strcmp(cmd,"ShowFAT")==0){ShowFat();}else if(strcmp(cmd,"ShowBitMp")==0){ShowBitMp();}else {printf("无效指令,请重新输入:\n");}}printf("Thank you for using my file system!\n");return 0;}}。
操作系统课程设计
一、课程设计的目的与要求1. 研究FAT文件系统的物理布局。
2. 掌握FAT文件系统中目录的结构与目录项定义。
3. 掌握文件操作如建立目录,建立文件,删除文件,复制文件时,对FAT和目录的操作步骤。
4. 合理设计文件系统布局与数据结构(直接用数组模拟磁盘布局或建立一个文件模拟磁盘布局)。
4. 编制程序模拟FAT文件系统,加深理解文件系统的功能及实现机理。
二、设计(实验)正文1.设计原理1.1简易FAT文件系统简易FAT文件系统可以划分为如表1所示布局。
表1-简易FAT文件系统布局特征块FAT表数据块(根目录,目录与文件)a.特征块:存放文件系统特征信息。
如设计者姓名,版本号,根目录位置,盘块大小,盘块总数,剩余空闲盘块总数,当前目录等。
b.FAT表:在FAT文件系统中,FAT表有两个重要作用:1、描述数据块的分配状态。
2、标明文件或目录的下一块号。
创建文件系统时,FAT表被清空,并在表项0与表项1写入特定值,表项0为“F8FFFF0F”,表项1为“FFFFFF0F”。
同时,根目录被创建,根目录使用数据块2,所以FAT表项2写入一个结束标记。
由于其他所有数据块在创建文件系统时未被占用,所以从表项3开始的所有表项用0来填充。
c.数据块:数据块存放两种文件:1、目录文件。
2、字符文件(文本文件)。
数据块描述为byte类型的数组。
每块的大小必须是2的n次幂。
1.2目录文件是由目录项组成的文件。
图1所示的是典型的FAT文件系统目录项,共计32字节。
包括数据域有文件名、后缀名、属性、保留区、时间、日期、首块号、大小。
Attributes域用位来表示是或者否,1个字节可以表示八种属性。
图1-FAT的目录项结构目录项数据域包括文件名、后缀名、是否目录、首块号。
建立文件和目录时,需要将文件和目录的目录项各数据域转换为字符或者byte,写入数据块。
在需要读出目录和文件属性时,还需要将字符或者byte 转化为各数据域内容。
实验八-FAT12文件系统要点
上海应用技术学院程序设计语言实验报告实验名称FAT12文件系统实验序号实验八实验日期姓名学号指导教师专业计算机科学与技术班级成绩一、实验目的及要求了解FAT12文件系统在软盘上的应用。
通过为EOS的FAT12文件系统添加写文件功能,加深对磁盘存储器管理原理的理解。
二、实验环境Windows XP;Tevation OS Lab。
三、实验内容1 准备实验1.启动OS Lab。
2.新建一个EOS Kernel项目。
如图 1.图13.分别使用Debug配置和Release配置生成此项目,从而在该项目文件夹中生成完全版本的EOS SDK文件夹,如图2、图3。
图2图34.新建一个EOS应用程序项目,如图4。
图45.使用在第3步生成的SDK文件夹覆盖EOS应用程序项目文件夹中的SDK文件夹.2 编写代码调用EOS API函数读取文件中的数据使用OS Lab打开本实验文件夹中的FileApp.c文件(将此文件拖动到OS Lab窗口中释放即可)如图5所示。
图5按照下面的步骤查看EOS应用程序读取文件中数据的执行结果:1.使用OS Lab打开在3.1中创建的EOS应用程序项目。
2.在“项目管理器”窗口中双击Floppy.img文件,使用FloppyImageEditor工具打开此软盘镜像。
3.将本实验文件夹中的 a.txt文件添加到软盘镜像的根目录中。
打开 a.txt文件查看其中的数据。
如图6图7所示。
图6图74.点击FloppyImageEditor工具栏上的保存按钮,关闭该工具。
5.使用FileApp.c文件中的源代码替换EOS应用程序项目中的EOSApp.c文件内的源代码。
如图8。
图86.按F7生成修改后的EOS应用程序项目。
如图9。
图97.按F5启动调试。
自动运行EOS应用程序EOSApp.exe时,会由于输入的命令行参数无效而失败。
如图10。
图108.在EOS控制台中输入命令“A:\EOSApp.exe A:\a.txt”后按回车,EOSApp.exe会读取a.txt文件中的内容并显示在屏幕上。
操作系统-文件系统课程设计报告
《操作系统》课程设计题目名称多用户多级目录共享文件系统的实现_学生学院计算机学院专业班级 10级计算机科学与技术7班学号学生姓名指导教师刘老师20年月日一、可行性分析随着信息化进程,文件管理越来越受到重视,并且逐渐成为国内外业界研究的热点。
在现有的操作系统中,几乎都是通过文件系统来组织和管理计算机中所存储的程序和数据等大量的文件。
在现代OS中,几乎毫毛例外地是通过文件系统来组织和管理在计算机中存储和大量程序和数据的;或者说,文件系统的管理功能,是通过把它所管理的程序和数据组织成一系列文件的方法来实现的。
而文件则是指具有文件名的若干相关元素的集合。
元素通常是记录,而记录又是一组有意义的数据项的集合。
通过分析,可知文件系统对大多数文件的操作,器过程大致都是这样两步:第一步是通过检索文件目录来找到指定文件的属性及其在外存上的位置;第二步是对文件实施相应的操作,如读文件或写文件。
为了便于管理和控制文件,根据系统管理员或用户所规定的存取控制属性,将文件分为只读文件、读写文件和只执行文件三类。
而文件系统的模型主要分为三个层次,分别是对象及其属性、对对象的操纵和管理的软件集合、文件系统接口,其最底层的是对象及其属性;中间层对对象进行操纵和管理的软件集合;最高层是文件系统提供给用户的接口。
用户通过文件系统所提供的系统调用实施对文件的操作,如创建文件、删除无文件、读文件、写文件等,为了方便用户使用文件而提供了更多对文件的操作,如打开和关闭文件。
软硬件可行性分析:本模拟系统的实现需要一台PC机作为硬件设备,此外,软件开发环境包括:Win7、VC++6.0,.因此,该模拟系统具备实现条件,综合分析,系统在成本、技术、操作上,都是可行的。
技术可行性分析:在当前的技术条件下,该系统的各个功能模块在理论上而言都是能实现的;根据自己掌握的技术情况,在规定的期限内,系统的开发设计能完成。
二、需求分析1、功能需求分析功能划分:本模拟系统主要针对文件的管理和操作名主要有:创建用户、文件、文件夹,读文件,写文件,执行文件,关闭文件,删除用户、文件夹、文件的功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统课程设计之三设计任务:模拟OS文件系统在任一OS(Window或者Dos;也可以是在Linux下,但要求能将结果演示给老师看)下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟OS字,第⑤、每个目录实际能放下文件或子目录30项。
⑸、文件系统空间分配:①、第0个盘块(1k)存放磁盘信息(可以设定为格式说明“FAT32”、盘块大小,盘块数等内容)②、第1个盘块起,至125盘块,共125个盘块(125k)存放FAT内容③、第126、127(2个)盘块,存放位示图④、从第128盘块至10000盘块,皆为数据(区)盘块,其逻辑编号从0开始,至9872号数据盘块,即第0数据盘块为128号盘块,第1数据盘块为129号盘块,…⑤、第0数据盘块(即128号盘块),存放根目录(同样只用一个盘块作根目录),由于第0、1目录项为“.”(本目录), “..”(父目录),因此根目录下同样只能存放30个文件或目录,并且从第2个目录项开始。
⑥、文件或子目录数据,放在第1数据盘块及以后的数据盘块中,由用户按需要使用。
内容⑺、删除文件#DelFile 文件名.扩展名,在文件所在的目录项中,将第一个字节变为0xE5,并同时修改FAT内容和位示图内容;如果文件不存在,给出出错信息⑻、文件拷贝#CopyFile 老文件,新文件,为新文件创建一个目录项,并将老文件内容复制到新文件中,并同时修改FAT内容和位示图内容⑼、显示位示图内容#ShowBitMP,将位示图内容(已有信息部分),显示在屏幕上(按十六进制)⑽、显示FAT内容#ShowFAT,将FAT内容(已有信息部分),显示在屏幕上(按十六进制)4、程序的总体流程为:⑴、输出提示符#,等待接受命令,分析键入的命令;⑵、对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令关于对FAT表和MAP表的用法1.当要用到数据块是,查询MAP表(因为只做比较查询即可),查询到的未用位置置1,然后在FAT表上进行相应记录,在本程序做出的规定是,当文件夹FAT 表做-1,若是文件则按照FAT做对应的顺序记录,最后一块同样是-1结束,2.回收的时候,是按照FAT表的首项,做顺序置0,然后MAP也在相应位置置0const int MAP_SIZE=10001; //MAP 长度const int FATNUM=125; //FAT的盘块数第块没有用const int FATLIST=512; //每个盘口FAT的记录数const int DATABEG=128; //数据项开始FAT号struct FCB{char fname[8]; //文件名char exname[3]; //扩展名short fnum; //首块号int length; //文件大小,目录则文件大小为;};struct fatid{short id[FATNUM*FATLIST]; //FAT 大小512个记录一块}*FAT;struct map{bitset<MAP_SIZE> maplist;}void init(struct fatid *FAT){int i,j;for(i=1;i<FATNUM*FATLIST;i++) //第块不使用{if(i>DATABEG)FAT->id[i]=0;elseFAT->id[i]=-1;}}void format(){bool i;printf("初始化已经完成,现在可以进行操作了!\n\n"); }/**创建子目录*/int mkdir(char *str){int i,j;int blockid; //将要创建的FAT号int blockdir; //将要创建的目录块号int listnum; //目录块内编号struct fatid *flagid;struct DIR *dir; //当前目录指针struct map *MAP;struct fatid *FAT;if(strcmp(str,"")==0){printf("目录下有同名文件夹\n");return 0;}}for(i=2;i<LIST_SIZE;i++){if(strcmp(dir->list[i].fname,"")==0) //有空的目录块且无重名,第一版本的时候与上面的循环放在一起,存在一个情况是前面的建立的目录删除后,直接被同名的覆盖了break;if(i>LIST_SIZE){printf("内存不足\n");return 0;}}flagid=(struct fatid *)(file+BLOCK_SIZE); //fat 首位地址for(j=DATABEG+1;j<BLOCK_NUM;j++){if(flagid->id[j]==0){blockdir=j;break;*/int listshow(){int i,sumfile,sumdir,fl[100],dr[100];//fl 为文件的号数,dr为目录的号数sumfile=sumdir=0;struct DIR *dir;struct fatid *FAT;dir=(struct DIR *)(file+currentdir*BLOCK_SIZE);for(i=0;i<LIST_SIZE;i++)if(dir->list[i].length==0&&(strcmp(dir->list[i].fname,"")!=0)&&(dir->list[i].fnum!=0)) //为目录的{dr[sumdir]=i;sumdir++;}if(dir->list[i].length!=0&&strcmp(dir->list[i].fname,"")!=0) //为目录的{fl[sumfile]=i;sumfile++;struct DIR *flagdir; //标记目录块char c='a'; //做用户交互int m=2; //从第三个子目录项开始搜索要删除的目录项情况FAT=(struct fatid *)(file+BLOCK_SIZE);dir=(struct DIR *)(file+currentdir*BLOCK_SIZE); //当前目录指针MAP=(struct map *)(file+(FATNUM+1)*BLOCK_SIZE);for(i=2;i<LIST_SIZE;i++)if(strcmp(dir->list[i].fname,str)==0) //找到要删除的子目录{break;}}if(i>LIST_SIZE){printf("该文件夹下不存在%s",str);return 0;}strcpy(flagdir->list[0].fname,""); //要删除目录的DIR strcpy(flagdir->list[0].exname,"");flagdir->list[0].fnum=0;strcpy(flagdir->list[1].fname,"");strcpy(flagdir->list[1].exname,"");flagdir->list[0].fnum=0;MAP->maplist[blocknum]=0;FAT->id[blocknum]=0;FAT->id[0]=FAT->id[0]+1;return 0;}/**更改当前目录*/int changedir(char *str){int i,j;return 1;}for(i=2;i<LIST_SIZE;i++) //子目录{if(strcmp(dir->list[i].fname,str)==0&&strcmp(dir->list[i].exname,"dir")==0){currentdir=dir->list[i].fnum;break;}}if(i>LIST_SIZE){printf("找不到指定的目录%s\n",str);return 0;}CURRENT=CURRENT+str+"\\";return 1;}templength=length;l=strlen(str);//取文件名for(i=0;i<l;i++){name[i]=str[i];if(str[i+1]=='.')break;if(i>=8){printf("文件名称过长\n");return 0;}//去扩展名j=0;i++;i++;//除去点return 0;}if(strcmp(dir->list[i].fname,"")==0){break;}}if(i>LIST_SIZE){printf("内存不足\n");return 0;strcpy(dir->list[i].fname,name);strcpy(dir->list[i].exname,exname);dir->list[i].length=length;flag=1;j=DATABEG+1;while(1){//不断循环if(MAP->maplist[j]!=1){if(!templength--) //当length全部被分配完截止/**复制文件*/int cp(char *str,char *newname){int i,j,k,l,length;char name[8]={0}; //文件名称char exname[3]={0}; //文件扩展名struct DIR *dir;l=strlen(str);//取文件名for(i=0;i<l;i++){name[i]=str[i];if(str[i+1]=='.')break;}if(i>LIST_SIZE){printf("找不到指定的文件%s\n",str);return 0;}length=dir->list[i].length ;create(newname,length);}/**删除文件*/int delfile(char *str){int i,j,l,k;int blocknum; //要删除的首块地址int temp;char name[8]={0}; //文件名称char exname[3]={0}; //文件扩展名if(strcmp(str,"")==0){printf("文件名不能为空\n");return 0;}dir=(struct DIR *)(file+(currentdir)*BLOCK_SIZE);MAP=(struct map *)(file+(FATNUM+1)*BLOCK_SIZE);FAT=(struct fatid *)(file+BLOCK_SIZE);for(i=2;i<LIST_SIZE;i++){if((strcmp(dir->list[i].fname,name)==0)&&(strcmp(dir->list[i].exname,exname)==0)) break;}if(i>LIST_SIZE){printf("找不到%s 文件\n",str);return 0;}printf("已经成功删除%s\n",str);return 0;}int ShowBitMp(){int i,j;int list[BLOCK_SIZE]={0};struct map *MAP;MAP=(struct map *)(file+(FATNUM+1)*BLOCK_SIZE); j=0;for(i=DATABEG+1;i<BLOCK_SIZE;i++){if(MAP->maplist[i]==1){list[j]=i;j++;}{list[j]=i;j++;}}j=0;flag=0;for(i=0;i<BLOCK_SIZE;i++){if(list[i]!=0){ printf(" %0x",list[i]);if(flag){if(j%10==0)printf("\n");}flag=1;j++;}}return 0;}printf("ShowFAT 显示FAT.\n");printf("\n--------------------------------------------\n");//申请虚拟空间file=(char *)malloc(DISK_SIZE*sizeof(char));//加载if((fp=fopen(FilePath,"r"))!=NULL){fread(file,sizeof(char),DISK_SIZE,fp);printf("加载磁盘文件%s文件成功,现在可以操作\n\n",FilePath);}else{printf("这是第一次使用文件管理系统");}}int main(){int length;char newname[20];}else if(strcmp(cmd,"cp")==0){cin>>command>>newname;cp(command,newname);}else if(strcmp(cmd,"rm")==0){scanf("%s",command);delfile(command);}else if(strcmp(cmd,"exit")==0){exit();break;}else if(strcmp(cmd,"ShowFAT")==0){ShowFat();}else if(strcmp(cmd,"ShowBitMp")==0){ ShowBitMp();}else {printf("无效指令,请重新输入:\n");}}。