从给定的代码片段和描述来看,这是一段模拟文件系统设计的C语言代码,主要涉及到了文件系统的基本结构和一些关键的操作。下面将详细解析这段代码中的关键知识点。 ### 文件系统基本概念 文件系统是操作系统中负责管理和组织磁盘或分区上的文件的一种逻辑结构。它提供了对文件存储、检索和更新的抽象接口。在本课程设计中,模拟构建的文件系统包括以下几个关键部分: 1. **保留块(`ReserveBlock`)**:这部分用于存储系统块数量、预留块数量、FAT块数量和根目录块数量等元数据信息。 2. **目录块(`DirBlock`)**:用于存储文件名、文件长度、创建日期和文件首块地址等文件信息。 3. **FCB块(`FCBBlock`)**:文件控制块,用于管理文件ID、文件信息、文件位置、目录块地址和指向下一个FCB块的指针等。 ### 文件系统的关键操作 1. **打开系统(`OPENSYS`)**:这个函数用于打开指定的文件系统文件,读取保留块信息,分配内存给FAT表,并读取FAT表信息。同时,读取根目录块信息到内存中,便于后续操作。 2. **关闭系统(`CLOSESYS`)**:用于释放分配的内存,将修改后的FAT表和目录信息写回文件,最后关闭文件流。 3. **列出目录(`LISTDIR`)**:遍历所有目录块,显示其中非空的文件名,即文件首块地址不为0的文件。 4. **创建文件(`FCREATE`)**:这个函数首先检查输入的文件名长度是否合法,然后检查该文件名是否已经存在。如果不存在,则可以继续执行创建文件的其他步骤,如分配空间、更新FAT表和目录信息等。 ### 关键数据结构 - **`ReserveBlock`**:系统保留区,包含系统块数、预留块数、FAT块数和根目录块数,以及填充字符来占满块大小。 - **`DirBlock`**:目录项,包括文件名、填充字符、文件长度、年月日和文件首块地址。 - **`FCBBlock`**:文件控制块,包含文件ID、目录项信息、文件位置、目录块地址、目录块索引和指向下一个FCB块的指针。 ### 总结 这段代码示例展示了文件系统的基本组件和操作,如保留块、目录块、文件控制块的定义,以及打开、关闭系统、列出目录和创建文件的功能实现。通过这些基本元素和操作,可以模拟出一个简单的文件系统,帮助理解操作系统中文件系统的工作原理。对于深入学习操作系统和文件系统的设计与实现,这是一个很好的起点。
#define DirSize 32
#define RootSize 2
struct ReserveBlock{
int sysblocknum;/*文件系统总扇区数*/
int resblocknum;/*保留扇区扇区数*/
int fatblocknum;/*FAT表扇区数*/
int rootblocknum;/*根目录区扇区数*/
char fillchar[BlockSize-4*sizeof(int)];/*填充字节*/
};
struct DirBlock{
char filename[11]; /*文件名限长11个字符*/
char fillchar[DirSize-4*sizeof(int)-sizeof(long int)-11];
/*填充字节*/
long filelen; /*文件长度*/
int year,month,day; /*日期*/
int firstblockaddr; /*文件首块扇区号*/
};
struct FCBBlock{
int fileid; /*文件标识*/
struct DirBlock fileinfo; /*目录信息*/
long filepos; /*文件读写指针*/
int fdtblockaddr; /*目录项所在块号*/
int fdtblockindex; /*目录项所在块内序号*/
struct FCBBlock *next;/*指向下一个文件控制块的指针*/
};
#include "fat.h"
#include <stdio.h>
#include <stdlib.h>
struct ReserveBlock sys1;
struct FCBBlock *fcb;
struct DirBlock fil[32],*dir;//目录项
int *fat1;
char *str,*ptr;
char fillchar[BlockSize];
FILE *fp;
FILE *OPENSYS(char *filename)
{ int i;
fp=fopen(filename,"rb+");
fread(&sys1,1,BlockSize,fp);
//printf("%d %d %d %d \n",sys1.sysblocknum,sys1.resblocknum,sys1.fatblocknum,sys1.rootblocknum);
fat1=(int *)malloc(sys1.sysblocknum);
for(i=0;i<sys1.fatblocknum;i++)
fread(fat1,sizeof(int)*sys1.sysblocknum,1,fp);//把基本的文件系统都读进来
fseek(fp,(sys1.fatblocknum+sys1.resblocknum)*BlockSize,0);//修改文件指针的位置
dir=fil;//目录指针
fread(dir,DirSize*32,1,fp);
return fp;
}
int CLOSESYS(FILE *stream)
{ int i;
fseek(stream,sys1.resblocknum*BlockSize,0);
fwrite(fat1,sizeof(int)*sys1.sysblocknum,1,stream);
fseek(fp,(sys1.fatblocknum+sys1.resblocknum)*BlockSize,0);
fwrite(dir,DirSize*32,1,fp);
fclose(fp);
return 1;
剩余20页未读,继续阅读
- 粉丝: 0
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助