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是当前簇号,返回值是下一个簇号。
《操作系统》课内实验报告
《操作系统》课内实验报告一、实验目的本次《操作系统》课内实验的主要目的是通过实际操作和观察,深入理解操作系统的基本原理和功能,掌握常见操作系统命令的使用,提高对操作系统的实际应用能力和问题解决能力。
二、实验环境本次实验在计算机实验室进行,使用的操作系统为 Windows 10 和Linux(Ubuntu 发行版)。
实验所使用的计算机配置为:Intel Core i5 处理器,8GB 内存,500GB 硬盘。
三、实验内容1、进程管理在 Windows 系统中,通过任务管理器观察进程的状态、优先级、CPU 使用率等信息,并进行进程的结束和优先级调整操作。
在 Linux 系统中,使用命令行工具(如 ps、kill 等)实现相同的功能。
2、内存管理使用 Windows 系统的性能监视器和资源监视器,查看内存的使用情况,包括物理内存、虚拟内存的占用和分配情况。
在 Linux 系统中,通过命令(如 free、vmstat 等)获取类似的内存信息,并分析内存的使用效率。
3、文件系统管理在 Windows 系统中,对文件和文件夹进行创建、复制、移动、删除等操作,了解文件的属性设置和权限管理。
在 Linux 系统中,使用命令(如 mkdir、cp、mv、rm 等)完成相同的任务,并熟悉文件的所有者、所属组和权限设置。
4、设备管理在 Windows 系统中,查看设备管理器中的硬件设备信息,安装和卸载设备驱动程序。
在 Linux 系统中,使用命令(如 lspci、lsusb 等)查看硬件设备,并通过安装内核模块来支持特定设备。
四、实验步骤1、进程管理实验(1)打开 Windows 系统的任务管理器,切换到“进程”选项卡,可以看到当前系统中正在运行的进程列表。
(2)选择一个进程,右键点击可以查看其属性,包括进程 ID、CPU 使用率、内存使用情况等。
(3)通过“结束任务”按钮可以结束指定的进程,但要注意不要随意结束系统关键进程,以免导致系统不稳定。
《系统安全技术》实验报告
《系统安全技术》实验报告
四、实验结果及分析和(或)源程序调试过程
4.1 文件的删除
(1)定位文件
用Winhex打开U盘,找到文件名为Dai.txt的位置
文件首簇号:00 10 00 02h
文件大小:00 00 00 13h
逻辑偏移00 10 00 02h=1048578簇后找到文件在数据区存储的内容
【注:也可从根目录位置偏移(00 10 00 02h-2)*8=800000个扇区找到】
此时我们在FAT表中可以发现:
图中蓝色部分即为首簇号下一簇。
0F FF FF FFh表示结束。
【注:FAT32的FAT表最开始4个字节为标识(首簇),第二簇为才是文件真正开始存放簇号链的位置(每4个字节为一个簇序号)。
】
2.删除文件:
我们将盘中的Dai.txt文件删除,删除后,操作系统找到对应的目录文件表将第一个字节修改成“E5”标志
并且将FAT文件分配表相应的项目清空,供其它程序使用。
此时FAT1表如下:
备份FAT2表如下:
即FAT分配表均由FF FF FF FF 0F 变为00 00 00 00.
但此时文件的数据并没有被覆盖,而是实际存在,对操作系统而言,只是是无效的垃圾数据,当有新的文件写入时,将会被覆盖。
4.2文件的恢复
此时我们找到未被覆盖的数据区,根据文件大小,全选数据,然后右击->编辑->复制选块->置于新文件,即可将删除的文件置于新文件Dai_Recover.txt中。
即可恢复被删除的数据。
实验八-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文件中的内容并显示在屏幕上。
模拟实现单级目录的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⽂件),取“长⽂件名”。
操作系统-文件系统课程设计报告
《操作系统》课程设计题目名称多用户多级目录共享文件系统的实现_学生学院计算机学院专业班级 10级计算机科学与技术7班学号学生姓名指导教师刘老师20年月日一、可行性分析随着信息化进程,文件管理越来越受到重视,并且逐渐成为国内外业界研究的热点。
在现有的操作系统中,几乎都是通过文件系统来组织和管理计算机中所存储的程序和数据等大量的文件。
在现代OS中,几乎毫毛例外地是通过文件系统来组织和管理在计算机中存储和大量程序和数据的;或者说,文件系统的管理功能,是通过把它所管理的程序和数据组织成一系列文件的方法来实现的。
而文件则是指具有文件名的若干相关元素的集合。
元素通常是记录,而记录又是一组有意义的数据项的集合。
通过分析,可知文件系统对大多数文件的操作,器过程大致都是这样两步:第一步是通过检索文件目录来找到指定文件的属性及其在外存上的位置;第二步是对文件实施相应的操作,如读文件或写文件。
为了便于管理和控制文件,根据系统管理员或用户所规定的存取控制属性,将文件分为只读文件、读写文件和只执行文件三类。
而文件系统的模型主要分为三个层次,分别是对象及其属性、对对象的操纵和管理的软件集合、文件系统接口,其最底层的是对象及其属性;中间层对对象进行操纵和管理的软件集合;最高层是文件系统提供给用户的接口。
用户通过文件系统所提供的系统调用实施对文件的操作,如创建文件、删除无文件、读文件、写文件等,为了方便用户使用文件而提供了更多对文件的操作,如打开和关闭文件。
软硬件可行性分析:本模拟系统的实现需要一台PC机作为硬件设备,此外,软件开发环境包括:Win7、VC++6.0,.因此,该模拟系统具备实现条件,综合分析,系统在成本、技术、操作上,都是可行的。
技术可行性分析:在当前的技术条件下,该系统的各个功能模块在理论上而言都是能实现的;根据自己掌握的技术情况,在规定的期限内,系统的开发设计能完成。
二、需求分析1、功能需求分析功能划分:本模拟系统主要针对文件的管理和操作名主要有:创建用户、文件、文件夹,读文件,写文件,执行文件,关闭文件,删除用户、文件夹、文件的功能。
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表”的定义和功能,以及其在文件系统中的作用。
《操作系统》课程实验报告
《操作系统》课程实验报告一、实验目的本次《操作系统》课程实验的主要目的是通过实际操作和观察,深入理解操作系统的工作原理、进程管理、内存管理、文件系统等核心概念,并掌握相关的操作技能和分析方法。
二、实验环境1、操作系统:Windows 10 专业版2、开发工具:Visual Studio Code3、编程语言:C/C++三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新进程,并观察进程的创建过程和资源分配情况。
同时,实现进程的正常终止和异常终止,并分析其对系统的影响。
2、进程同步与互斥使用信号量、互斥锁等机制实现进程之间的同步与互斥。
通过模拟多个进程对共享资源的访问,观察并解决可能出现的竞争条件和死锁问题。
(二)内存管理实验1、内存分配与回收实现不同的内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法。
观察在不同的内存请求序列下,内存的分配和回收情况,并分析算法的性能和优缺点。
2、虚拟内存管理研究虚拟内存的工作原理,通过设置页面大小、页表结构等参数,观察页面的换入换出过程,以及对系统性能的影响。
(三)文件系统实验1、文件操作实现文件的创建、打开、读取、写入、关闭等基本操作。
观察文件在磁盘上的存储方式和文件系统的目录结构。
2、文件系统性能优化研究文件系统的缓存机制、磁盘调度算法等,通过对大量文件的读写操作,评估不同优化策略对文件系统性能的提升效果。
四、实验步骤(一)进程管理实验步骤1、进程创建与终止(1)使用 C/C++语言编写程序,调用系统函数创建新进程。
(2)在子进程中执行特定的任务,父进程等待子进程结束,并获取子进程的返回值。
(3)通过设置异常情况,模拟子进程的异常终止,观察父进程的处理方式。
2、进程同步与互斥(1)定义共享资源和相关的信号量或互斥锁。
(2)创建多个进程,模拟对共享资源的并发访问。
(3)在访问共享资源的关键代码段使用同步机制,确保进程之间的正确协作。
(4)观察并分析在不同的并发情况下,系统的运行结果和资源竞争情况。
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;}}。
操作系统2实验6报告
实验(六)FAT 文件系统实验一. 实验目的:从系统分析的角度出发,了解 FAT 文件系统的组织结构和文件的存储方式。
进一步理解操作系统文件管理的基本思想。
二. 实验环境:Debug.exe,FAT 文件系统 1.44M软盘。
三. 实验内容:了解 3 吋软盘的 FAT 文件系统构。
察看文件分配表的簇号链。
察看文件目录表中文件目录结构。
了解用簇号链映射的文件链式存储构。
分析目录文件的组成。
四. 实验步骤:1,进入 DEBUG 环境,装入 FAT 文件系统结构。
2,观察 1.44M 软盘中 FAT12 文件系统结构。
(1)执行命令: L 0 0 0 21 将 0 号驱动器中,逻辑扇区号从 0 开始的共 21H 个扇区读入内存,放在DS:0000 为起始的地址中。
(2)执行命令: D 0000(3)连续执行 D 命令3, 分析文件分配表结构,了解用簇链映射的文件的链式存储结构FAT 中每三个字节指示了两个簇执行命令: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 逻辑扇,现在为 FFF,表示此乃文件最后一簇。
003 簇中为 004 表示下一簇号为 004。
所以首簇号为 003 的文件共包括包含一个扇区,分布在0道1面17扇4, 观察 1.44M 软盘中文件目录表 FDT 以及文件目录结构思考:1.计算 1.44M 软盘根目录最多可以容纳多少文件?答:FDT占14个扇区,每个目录项32个字节,每个扇区512个字节,所以能容纳文件14*512/32=224个文件2.上面屏幕显示的文件 office.ppt 的目录项中标示该文件的首簇号在何处?该文件是什么属性的?答:首簇号在1A-1B ,属于归档文件3.上面屏幕显示第 1~2 行目录项表示的是什么项目?答:只读归档子目录4.观察 1.44M 软盘中文件目录表的长文件名目录结构思考:若有一个文件名共长 34 个字符,要占多少目录项?试一试。
操作系统课程设计报告
操作系统课程设计实验报告姓名:学号:班级专业:软件工程操作系统课程设计---建立基于磁盘存储设备的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。
操作系统-文件系统课程设计报告(附源码)
操作系统课程设计题目文件系统学院计算机学院专业计算机科学与技术年级班别 10级7 班学号 3110006154 学生姓名指导教师刘老师20年月日文件系统一、课程设计的内容:模拟文件系统实现的基本功能,了解文件系统的基本结构和管理方法,加深理解文件系统的内部功能及内部实现。
通过用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
二、可行性分析:可行性分析是通过对项目的主要内容和配套条件,并通过对各方面进行调查研究和分析比较,并对项目建成以后所带来的影响,从而提出该项目是否值得投资和如何进行建设的咨询意见,是一种综合性的系统分析方法。
可行性分析应具有预见性、公正性、可靠性、科学性的特点。
这里以三个方面来分析此次设计:经济可行性、技术可行性、法律可行性。
1、经济可行性:编写该文件系统,只需要用到PC机和VC++6.0编程软件,不需要花费金钱,所以,在经济方面,这个课程设计适合做。
2、技术可行性:在做这个课程设计,事先需要掌握的知识有C/C++语言,数据结构,操作系统,PC机的基本操作和VC++6.0软件的使用方法等。
目前,这些知识都已经学习并掌握了,所以在技术方面,这个课程设计也适合做。
3、法律可行性:做这个课程设计,只是为了掌握文件系统的基本内容,提升自己的编程能力,没有违反法律法规,所以,在法律方面,这个课程设计也适合做。
三、需求分析1.设计一个多用户多级目录文件管理系统。
2.要设计多个实用命令并设置文件保护措施。
3.设计一个较实用的用户界面,方便用户使用,界面要为用户提供足够的选择信息,不需用户打入冗长的命令4. 功能简介:①多用户管理,多级目录形式。
②基本的文件操作功能,如新建文件、打开文件、写入文件、关闭文件、读取文件等。
③用户间文件的共享功能四、概要设计(逻辑图)1.系统结构图:2、界面简单说明该系统主要分为两个界面,用户操作界面及文件操作管理界面。
操作系统实验报告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、实现容(1)在存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的单用户单任务系统中的文件系统。
在退出该文件系统的使用时,应将该虚拟文件系统以一个Windows 文件的方式保存到磁盘上,以便下次可以再将它恢复到存的虚拟磁盘空间中。
(2)文件存储空间的分配可采用显式分配或其他的方法。
(3)空闲磁盘空间的管理可选择位示图或其他的方法。
如果采用位示图来管理文件存储空间,并采用显式分配方式,则可以将位示图合并到FAT中。
(4)文件目录构造采用多级目录构造。
为了简单起见,可以不使用索引结点,其中的每个目录项应包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
(5)要求提供以下操作命令:●my_format:对文件存储器进展格式化,即按照文件系统的构造对虚拟磁盘空间进展布局,并在其上创立根目录以及用于管理文件存储空间等的数据构造。
●my_mkdir:用于创立子目录。
●my_rmdir:用于删除子目录。
●my_ls:用于显示目录中的容。
●my_cd:用于更改当前目录。
●my_create:用于创立文件。
●my_open:用于翻开文件。
●my_close:用于关闭文件。
●my_write:用于写文件。
●my_read:用于读文件。
●my_rm:用于删除文件。
●my_e*itsys:用于退出文件系统。
二、设计思路〔主要算法描述、程序流程图等〕:1.系统主函数main()〔1〕对应命令:无〔2〕命令调用格式:无〔3〕函数设计格式:void main()〔4〕功能:系统主函数〔5〕输入:无〔6〕输出:无〔7〕函数需完成的工作:①对前面定义的全局变量进展初始化;②调用startsys()进入文件系统;③列出文件系统提供的各项功能及命令调用格式;④显示命令行提示符,等待用户输入命令;⑤将用户输入的命令保存到一个buf中;⑥对buf中的容进展命令解析,并调用相应的函数执行用户键入的命令;⑦如果命令不是"my_e*itsys〞,则命令执行完毕后转④。
操作系统课程设计
一、课程设计的目的与要求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 转化为各数据域内容。
操作系统文件系统性能与安全实验报告
操作系统文件系统性能与安全实验报告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提供了更加精细的权限设置,相对而言更安全可靠。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
F A T文件系统操作系统课程设计实验报告文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]操作系统课程设计之三设计任务:模拟OS文件系统在任一OS(Window或者Dos;也可以是在Linux下,但要求能将结果演示给老师看)下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟OS文件系统。
1、在现有机器硬盘上开辟10M(共10000个盘块,每盘块大小为1k)的硬盘空间(生成一个10M的用户文件即可),作为设定的硬盘空间。
2、编写一管理程序SDisk,对此空间进行管理,以模拟OS文件系统,要求:⑴、盘块大小1k⑵、空闲盘块的管理:采用位示图法⑶、文件空间管理:采用FAT(文件分配表),每个盘块号占2个字节⑷、目录项管理:①、每个目录项占用32字节,其中前8个字节(0-7)为文件名,之后跟3个字节(8-10)的扩展名,26-27字节,存放文件的第一个盘块号,最后四个字节(28-31),存放文件长度(如果目录项对应的是下一级子目录(文件),其文件长度部分为0)②、目录按文件方式管理,每个目录仅用一个盘块(即1k,最多装32个目录项)③、第0个目录项为本目录,即“.”,第0个字节为“.”,即0x2E,第26-27字节指明本目录所在盘块。
④、第1个目录项为父目录,即“..”,第0,1个字节为“..”即0x2E,0x2E,第26-27字节指明父目录所在盘块。
⑤、每个目录实际能放下文件或子目录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数据盘块及以后的数据盘块中,由用户按需要使用。
3、SDisk管理程序的功能要求如下:⑴、正常情况下,显示等待命令输入符号#⑵、改变目录命令:#cd 目录名,改变当前工作目录,目录不存在时给出出错信息#cd ..,返回上一级目录,如果是根目录,给出提示信息⑶、生成新目录#md 目录名,创建新目录(需要更改FAT内容和位示图内容)⑷、删除目录#rd 目录名,删除目录,如果目录不存在时给出出错信息(需要更改FAT内容和位示图内容)⑸、显示目录#dir,显示指定目录下或当前目录下的信息,包括文件名、扩展名、物理地址(文件或目录第一个盘块号)、文件长度、子目录⑹、创建新文件#CreateFile 文件名.扩展名文件长度,根据文件名.扩展名,创建一个目录项(fcb),根据文件长度和位示图中空闲盘块情况,分配足够多的连续盘块,给新文件(需要更改FAT内容和位示图内容)。
⑺、删除文件#DelFile 文件名.扩展名,在文件所在的目录项中,将第一个字节变为0xE5,并同时修改FAT内容和位示图内容;如果文件不存在,给出出错信息⑻、文件拷贝#CopyFile 老文件,新文件,为新文件创建一个目录项,并将老文件内容复制到新文件中,并同时修改FAT内容和位示图内容⑼、显示位示图内容#ShowBitMP,将位示图内容(已有信息部分),显示在屏幕上(按十六进制)⑽、显示FAT内容#ShowFAT,将FAT内容(已有信息部分),显示在屏幕上(按十六进制)4、程序的总体流程为:⑴、输出提示符#,等待接受命令,分析键入的命令;⑵、对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令(1、请参考“文件系统简介.doc”中,有关文件系统的规定;2、请参考WinHex中,目录所显示的信息进行编程)name,".");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; name,str)==0){printf("目录下有同名文件夹\n");return 0;}}for(i=2;i<LIST_SIZE;i++){if(strcmp(dir->list[i].fname,"")==0) name,str);dir->list[i].fnum=blockdir;strcpy(dir->list[i].exname,"dir");dir->list[i].length=0;dir=(struct DIR *)(file+blockdir*BLOCK_SIZE); name,".");strcpy(dir->list[0].exname,"dir");dir->list[0].fnum=blockdir;dir->list[0].length=0;strcpy(dir->list[1].fname,"..");strcpy(dir->list[1].exname,"dir");dir->list[1].fnum=currentdir;dir->list[1].length=0;flagid->id[j]=-1; ength==0&&(strcmp(dir->list[i].fname,"")!=0)&&(dir->list[i].fnum!=0)) ength!=0&&strcmp(dir->list[i].fname,"")!=0) name);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;name,str)==0) num;flagdir=(struct DIR *)(file+blocknum*BLOCK_SIZE);while(m!=LIST_SIZE){if(strcmp(flagdir->list[m].fname,"")!=0){printf("该目录下有子文件或者子目录,不能删除该目录");}m++;}strcpy(dir->list[i].fname,""); xname,"");dir->list[i].fnum=0;strcpy(flagdir->list[0].fname,""); xname,"");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;int blocknum; ",str)==0)num==dir->list[1].fnum) num;num==blocknum){strflag=flagdir->list[j].fname;break;}}CURRENT=(0,()())-1);return 1;}for(i=2;i<LIST_SIZE;i++)name,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){break;}if(i>=8){printf("文件名称过长\n");return 0;}name,name)==0&&strcmp(dir->list[i].exname,exname)==0){printf("改文件夹下,已经有同名文件");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){num=j;break;}name,name)==0&&strcmp(dir->list[i].exname,exname)==0)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;break;}name,name)==0)&&(strcmp(dir->list[i].exname,exname)==0))break;}if(i>LIST_SIZE){printf("找不到%s 文件\n",str);return 0;}while(1){printf("是否确认(Y/N)");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; xname,"");strcpy(dir->list[i].fname,"");dir->list[i].length=0;n");printf("exit : 安全退出该文件系统,保存信息.\n");printf("mkdir dirname ; 创建子目录.\n");printf("rmdir dirname : 删除子目录.\n");printf("ls dirname : 显示当前目录下信息.\n");printf("cd dirname : 更改当前目录.\n");printf("create length : 创建一个新文件.\n");printf("rm filename : 删除文件.\n");printf("cp oldname newname: 复制文件.\n");printf("ShowBitMP 显示位示图.\n");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];welcome();format();while(1){cout<<CURRENT<<"#";cin>>cmd;if(strcmp(cmd,"format")==0){free(file);file=(char*)malloc(DISK_SIZE*sizeof(char)); //重新分配空间format();}else if(strcmp(cmd,"mkdir")==0){scanf("%s",command);mkdir(command);}else if(strcmp(cmd,"rmdir")==0){scanf("%s",command);rmdir(command);}else if(strcmp(cmd,"ls")==0){listshow();}else if(strcmp(cmd,"cd")==0){scanf("%s",command);changedir(command);}else if(strcmp(cmd,"create")==0){cin>>command>>length;create(command,length);}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");}}printf("Thank you for using my file system!\n");return 0;}}。