模拟文件管理系统

时间:2026-01-14

理学院

School of Sciences

课程设计报告

所选题目:

学生姓名:

学生学号: 所在班级:

所在专业:

指导教师:

模拟文件管理系统 刘宁 200801055 08级二班 信息与计算科学 段建丽

一、课程设计简介

1、设计目的:

设计和调试一个简单的文件系统,通过模拟文件操作命令的执行,来模拟文件管理对主要文件操作命令的实质和执行过程有比较深入的了解,掌握它们的基本实施方法.

2、实验内容 :

建立文件存储介质的管理机制

建立目录

文件系统功能(显示目录、创建、删除、打开、关闭、读、写) 文件操作接口(显示目录、创建、删除、打开、关闭、读、写)

二、数据结构及算法及结构图

1、创建大文件作为虚拟磁盘

此部分处于程序初始化阶段,当程序检测到大文件(FileSystem)不存在时调用init.c 文件中的space_aquire()函数创建512*512*512B 的一个大文件,其中最后一个512 为块大小,整个虚拟磁盘一共有512*512 个BLOCK。创建成功返回0,其中文件指针为外部变量,指向创建的文件。创建文件即采用创建一个文件,写入512*512 个大小为512B 的块即可得到。

2、初始化super block

1)建立空闲盘块分组链接索引结构:在此即涉及到虚拟磁盘块的功能划分,若将磁盘块编号,则下列各区分别占用块数如下

管理块结构如下:

typedef struct super_block_struct { /*管理块*/

f_block block; /*直接管理的空闲块结构*/

f_inode inode; /*直接管理的空闲 i 结点结构*/ } superB;

typedef struct free_block { /*空闲块组*/

int s_nfree; /*管理的空闲块数*/

int s_free[127]; /*空闲块号栈*/

} f_block;

其中超块与空闲块结构的关系可用下图表示:

所有空闲块看似形成了一个链表,实际上是一个栈,超块直接管理一个空闲块组,每个空闲块组的0 号s_free[0]指向前一组。先建立空闲盘块分组链接索引结构,从数据存储区取一块,记下从后往前数的127块,直至所有块都被编排,详见函数init_super_block( )。

2)建立空闲i 结点分组链接索引结构

typedef struct free_inode { /*空闲i 结点*/

int s_ninode; /*管理的空间 i 结点数目*/

int s_inode[127]; /*空闲i 结点栈*/

} f_inode;

空闲i 结点的分组索引结构与空闲盘块是一模一样的,在此借用已经建立起来的空闲盘块构,并实现空闲盘块的分配、回收、读取、写入四个函数block_assign( ),block_back( ),block_read( ),block_write( ),不断向空闲盘块结构申请空闲块并填写块号信息,并将最后一块的信息写入super block,与此同时完成与块操作对应的i 结点操作的四个函数——i 节点的分配、回收、读取与写入inode_assign(),inode_back( ),inode_read( ),inode_write( ) ,值得一提的是super block 中的直接管理块的s_free[0]是指向所管理的那一块(块号),super block 中的信息仅当s_nfree=1 或127 时才会对所管理块进行写或释放块的操作。另外,0 号i 节点已被用作根目录,不加入空闲i 结点栈。

至此super block 初始化完毕,将内存中的super_block 写入文件。

3、主功能函数部分

1)文件写入函数upload

upload 是系统中最重要的一个函数之一,要完成upload 函数,首先要实现faccess( )函数——检查是否有同名文件存在,其次要实现free_entry( )函数在当前目录下获取目录存储块中的一个空闲位臵。faccess( )结合cur_inode.i_link 读取i 结点信息,将所指向的目录存储块中的信息加以比较。free_entry( )直接可由cur_inode.i_link 得到,若所有的目录存储块均已写满,则申请一个新的目录存储块,并返回该块的第0 项。

upload:

(1)在进行faccess 检查和获取到free_entry 之后申请一个空闲i 结点,并填写目录项信息,并将其写回磁盘。涉及到的数据结构: typedef struct directory_entry { /* 目录项*/ char name[12];

inode_id no;

} DirEntry;

typedef struct directory_file_block { /* 目录文件存储块*/

DirEntry menu[32];

} DirFileBlock;

(2)获取上传文件信息,填写i 结点,按照文件大小依次进行直接索引块、一次间接索引块、二次间接索引块的申请。涉及到的数据结构:

typedef struct _index_block{ /*索引块*/

int index_block[128];

}index_block;

实现的代码有点长,均是块申请、写入、衔接的操作,考虑到三级索引将会使代码继续膨胀,并未实现。至此,所有要使用的数据结构均已定义并实现了相关操作。

2)文件显示函数ls

有了前面的数据结构作基础,写出个ls 顺理成章,并且还可以直观地检查程序是否正常,基于这种考虑,upload 之后开始写ls 函数。 ls 结合cur_inode.i_link 的数目来遍历相应数目的目录项,并由目录项所对应的i 结点号读取相应i 结点内容,并将之打印出来。

3)文件件(夹)创建函数create

数据结构建立完毕之后写这个非常容易,由faccess 检查要创建的文件(夹)是否存在,不存则在由free_entry 申请一个空目录项并由

inode_assign 申请一个空闲i 结点,填写相关信息,写回磁盘即可。

4)文件写出函数download

与upload 流程非常相似,首先由faccess 检查文件是否存在,存在则返回其i 结点号 …… 此处隐藏:2669字,全部文档内容请下载后查看。喜欢就下载吧 ……

模拟文件管理系统.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:4.9 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:19元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219